diff -Nru kodi-pvr-dvblink-1.10.9/CMakeLists.txt kodi-pvr-dvblink-2.0.4/CMakeLists.txt --- kodi-pvr-dvblink-1.10.9/CMakeLists.txt 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/CMakeLists.txt 2016-01-10 21:41:24.000000000 +0000 @@ -21,8 +21,6 @@ set(DVBLINK_SOURCES src/base64.cpp src/client.cpp - src/DialogDeleteTimer.cpp - src/DialogRecordPref.cpp src/DVBLinkClient.cpp src/HttpPostClient.cpp src/RecordingStreamer.cpp diff -Nru kodi-pvr-dvblink-1.10.9/debian/changelog kodi-pvr-dvblink-2.0.4/debian/changelog --- kodi-pvr-dvblink-1.10.9/debian/changelog 2015-07-30 17:34:03.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/debian/changelog 2016-01-21 08:11:07.000000000 +0000 @@ -1,65 +1,76 @@ -kodi-pvr-dvblink (1.10.9-2~trusty) trusty; urgency=low +kodi-pvr-dvblink (2.0.4-1~trusty) trusty; urgency=low [ kodi ] * autogenerated dummy changelog [ wsnipex ] - * [B]Version 1.10.9[/B] Fixed: Debian packaging: fix library install - path Fixed: Miscellaneous backend fixes [B]Version 1.10.8[/B] Fixed: - Kodi hangup on adding timers [B]Version 1.10.7[/B] Updated: - libplatform dependency [B]Version 1.10.6[/B] Updated: language files - from Transifex [B]Version 1.10.5[/B] Added: Extended series settings - dialog Added: "No grouping for single recording" setting Fixed: Long - delay when starting transcoded stream from server that does not - support it Speed and memory use optimizations [B]Version 1.10.4[/B] - Updated to use new libplatform-dev [B]Version 1.10.3[/B] Updated to - PVR API v1.9.6 [B]Version 1.10.2[/B] Updated to PVR API v1.9.5 - [B]Version 1.10.1[/B] Updated to PVR API v1.9.4 [B]Version - 1.9.16[/B] Updated: language files from Transifex [B]Version - 1.9.15[/B] Updated: language files from Transifex Fixed: Minor - changes to conform with C++11 [B]Version 1.9.14[/B] Updated: - language files from Transifex [B]Version 1.9.13[/B] Added: - getBackendHostname function Fixed: no timers are added from EPG of - DVBLink TV Adviser product [B]Version 1.9.12[/B] Added: Grouping - recordings by series Added: Year to the episode title Fixed: - incorrect available disk space calculations [B]Version 1.9.11[/B] - Updated: Fixed crash when switching channels with enabled - timeshifting [B]Version 1.9.10[/B] Updated: language files from - Transifex [B]Version 1.9.9[/B] Updated: change library name to Kodi - [B]Version 1.9.8[/B] Fixed: deadlock when activating the addon on - some darwin (osx, ios) runtimes [B]Version 1.9.7[/B] Updated: - language files from Transifex [B]Version 1.9.6[/B] Updated: language - files from Transifex [B]Version 1.9.5[/B] Added: display of episode - name and number in recordings list Fixed: no channels/recordings if - DVBLink server is not available during xbmc start-up Fixed: single - and recurring manual recordings Fixed: interrupted playback of the - recording, which is still being recorded Added: Series recording - capabilities Fixed: transcoded live TV streaming Added: transcoded - live TV with timeshifting capabilities [B]Version 1.9.4[/B] Updated - to API v1.9.2 [B]Version 1.9.2[/B] Updated: language files from - Transifex [B]Version 1.9.1[/B] Added: support for DVBLink v5 server - timeshifting capabilities Fixed: series number, genre, episode name - tags Fixed: correct displaying of series recordings [B]Version - 1.9.0[/B] Sync with XBMC PVR API v1.9.0 [B]Version 1.7.0[/B] Fixed: - Recordings on DVBLINK 4.5.3 Fixed: Closing socket file handles - Added: Support for Android Changed: No longer show errors on failed - to receive recordings / timers list. [B]Version 1.6.2[/B] Fixed: - Authentication issue on unix / linux based platforms Added: Refresh - Timers and Recordings list every 30 seconds Changed: Timeshift - buffer path now refers to a folder path Delete timeshift buffer when - nolonger needed [B]Version 1.6.1[/B] Added: Timeshift support (Http - only) Added: Information about backend diskspace (System->System - Info->PVR Service) Added: Option for enabling information - notifications (Default:disabled) Updated language files General code - style clean up to be more compliant with XBMC coding style - [B]Version 1.6.0.11[/B] Removed wrong danish language from addon - description [B]Version 1.6.0.10[/B] Fixed: Timer related crash when - addon could not find program information for EPG based timers - [B]Version 1.6.0.9[/B] Added: Better notification and logging of - status / error information [B]Version 1.6.0.8[/B] Fixed: Not all - schedules shown Fixed: Not able to use username/password (Windows - only) [B]Version 1.6.0.7[/B] Builds for all major os: windows,linux - and osx Updated to XBMC Frodo Beta 2 Updated to newest + * [B]Version 2.0.4[/B] Updated: language files from Transifex + [B]Version 2.0.3[/B] Updated: language files from Transifex + [B]Version 2.0.2[/B] - kodi.guilib is mandatory, enforce it + [B]Version 2.0.1[/B] Updated: language files from Transifex + [B]Version 2.0.0[/B] Added: Backport of 1.10.9 version fixes from + Isengard tree Added: Native Kodi Jarvis series timer support Added: + Support for keyword-based recording timers Added: + episode/season/year info to recording metadata [B]Version 1.11.6[/B] + Updated to PVR API v4.1.0 [B]Version 1.11.5[/B] Updated to PVR API + v4.0.0 [B]Version 1.11.4[/B] Updated to PVR API v3.0.0 (API 1.9.7 + Compatibility Mode) [B]Version 1.11.3[/B] Updated to PVR API v2.1.0 + Automatically fill in platform and library name [B]Version + 1.11.2[/B] Debian packaging: fix library install path Miscellaneous + backend fixes [B]Version 1.11.1[/B] Updated to PVR API v2.0.0 + [B]Version 1.11.0[/B] Updated to PVR API v1.9.7 [B]Version + 1.10.6[/B] Updated: language files from Transifex [B]Version + 1.10.5[/B] Added: Extended series settings dialog Added: "No + grouping for single recording" setting Fixed: Long delay when + starting transcoded stream from server that does not support it + Speed and memory use optimizations [B]Version 1.10.4[/B] Updated to + use new libplatform-dev [B]Version 1.10.3[/B] Updated to PVR API + v1.9.6 [B]Version 1.10.2[/B] Updated to PVR API v1.9.5 [B]Version + 1.10.1[/B] Updated to PVR API v1.9.4 [B]Version 1.9.16[/B] Updated: + language files from Transifex [B]Version 1.9.15[/B] Updated: + language files from Transifex Fixed: Minor changes to conform with + C++11 [B]Version 1.9.14[/B] Updated: language files from Transifex + [B]Version 1.9.13[/B] Added: getBackendHostname function Fixed: no + timers are added from EPG of DVBLink TV Adviser product [B]Version + 1.9.12[/B] Added: Grouping recordings by series Added: Year to the + episode title Fixed: incorrect available disk space calculations + [B]Version 1.9.11[/B] Updated: Fixed crash when switching channels + with enabled timeshifting [B]Version 1.9.10[/B] Updated: language + files from Transifex [B]Version 1.9.9[/B] Updated: change library + name to Kodi [B]Version 1.9.8[/B] Fixed: deadlock when activating + the addon on some darwin (osx, ios) runtimes [B]Version 1.9.7[/B] + Updated: language files from Transifex [B]Version 1.9.6[/B] Updated: + language files from Transifex [B]Version 1.9.5[/B] Added: display of + episode name and number in recordings list Fixed: no + channels/recordings if DVBLink server is not available during xbmc + start-up Fixed: single and recurring manual recordings Fixed: + interrupted playback of the recording, which is still being recorded + Added: Series recording capabilities Fixed: transcoded live TV + streaming Added: transcoded live TV with timeshifting capabilities + [B]Version 1.9.4[/B] Updated to API v1.9.2 [B]Version 1.9.2[/B] + Updated: language files from Transifex [B]Version 1.9.1[/B] Added: + support for DVBLink v5 server timeshifting capabilities Fixed: + series number, genre, episode name tags Fixed: correct displaying of + series recordings [B]Version 1.9.0[/B] Sync with XBMC PVR API v1.9.0 + [B]Version 1.7.0[/B] Fixed: Recordings on DVBLINK 4.5.3 Fixed: + Closing socket file handles Added: Support for Android Changed: No + longer show errors on failed to receive recordings / timers list. + [B]Version 1.6.2[/B] Fixed: Authentication issue on unix / linux + based platforms Added: Refresh Timers and Recordings list every 30 + seconds Changed: Timeshift buffer path now refers to a folder path + Delete timeshift buffer when nolonger needed [B]Version 1.6.1[/B] + Added: Timeshift support (Http only) Added: Information about + backend diskspace (System->System Info->PVR Service) Added: Option + for enabling information notifications (Default:disabled) Updated + language files General code style clean up to be more compliant with + XBMC coding style [B]Version 1.6.0.11[/B] Removed wrong danish + language from addon description [B]Version 1.6.0.10[/B] Fixed: Timer + related crash when addon could not find program information for EPG + based timers [B]Version 1.6.0.9[/B] Added: Better notification and + logging of status / error information [B]Version 1.6.0.8[/B] Fixed: + Not all schedules shown Fixed: Not able to use username/password + (Windows only) [B]Version 1.6.0.7[/B] Builds for all major os: + windows,linux and osx Updated to XBMC Frodo Beta 2 Updated to newest libdvblinkremote api Enabled editing of timers Updated version number to reflect other pvr addons Removed dependency on libcurl [B]0.0.6[/B] Fixed: Bug where addon did not show channels / EPG when @@ -77,4 +88,4 @@ [B]0.0.1[/B] Beta release Playback of live tv and radio using raw http Listing of EPG - -- wsnipex Thu, 30 Jul 2015 19:34:03 +0200 + -- wsnipex Thu, 21 Jan 2016 09:11:07 +0100 diff -Nru kodi-pvr-dvblink-1.10.9/debian/changelog.tmp kodi-pvr-dvblink-2.0.4/debian/changelog.tmp --- kodi-pvr-dvblink-1.10.9/debian/changelog.tmp 2015-07-30 17:33:42.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/debian/changelog.tmp 2016-01-21 08:10:27.000000000 +0000 @@ -1,4 +1,4 @@ -kodi-pvr-dvblink (1.10.9-2~#DIST#) #DIST#; urgency=low +kodi-pvr-dvblink (2.0.4-1~#DIST#) #DIST#; urgency=low [ kodi ] * autogenerated dummy changelog diff -Nru kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/request.h kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/request.h --- kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/request.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/request.h 2016-01-10 21:41:24.000000000 +0000 @@ -780,7 +780,7 @@ * Default value is false. * @param recordingsToKeep defines anumbr of recordings to keep in case of series recordings (0 - keep all). */ - AddScheduleByEpgRequest(const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); + AddScheduleByEpgRequest(const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = true, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); /** * Destructor for cleaning up allocated memory. @@ -789,6 +789,29 @@ }; /** + * Class for add schedule by pattern. + * This is used as input parameter for the IDVBLinkRemoteConnection::AddSchedule method. + * @see IDVBLinkRemoteConnection::AddSchedule m() + */ + class AddScheduleByPatternRequest : public ByPatternSchedule, public AddScheduleRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::AddScheduleByPatternRequest class. + * @param channelId a constant string reference representing the channel identifier or "" to match all channels. + * @param keyphrase a phrase to search for + * @param genremask - OR'ed combination of DVBLinkByPatternScheduleGenreMask constants + * @param recordingsToKeep defines a number of recordings to keep in case of series recordings (0 - keep all). + */ + AddScheduleByPatternRequest(const std::string& channelId, const std::string& keyphrase, const long genremask, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); + + /** + * Destructor for cleaning up allocated memory. + */ + ~AddScheduleByPatternRequest(); + }; + + /** * Class for get schedules requests. * This is used as input parameter for the IDVBLinkRemoteConnection::GetSchedules method. * @see IDVBLinkRemoteConnection::GetSchedules() @@ -827,7 +850,7 @@ * keep for a repeated recording. Default value is 0, i.e. keep all recordings. * \remark \p recordingsToKeep accepted values (1, 2, 3, 4, 5, 6, 7, 10; 0 - keep all) */ - UpdateScheduleRequest(const std::string& scheduleId, const bool newOnly, const bool recordSeriesAnytime, const int recordingsToKeep); + UpdateScheduleRequest(const std::string& scheduleId, const bool newOnly, const bool recordSeriesAnytime, const int recordingsToKeep, const int margin_before, const int margin_after); /** * Destructor for cleaning up allocated memory. @@ -859,11 +882,25 @@ */ int GetRecordingsToKeep(); + /** + * Gets pre-recording margin in seconds + * @return integer value + */ + int GetMarginBefore(); + + /** + * Gets post-recording margin in seconds + * @return integer value + */ + int GetMarginAfter(); + private: std::string m_scheduleId; bool m_newOnly; bool m_recordSeriesAnytime; int m_recordingsToKeep; + int m_margin_before; + int m_margin_after; }; /** diff -Nru kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/response.h kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/response.h --- kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/response.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/response.h 2016-01-10 21:41:24.000000000 +0000 @@ -598,7 +598,7 @@ * record only series starting around original program start time or any of them. * Default value is false. */ - StoredEpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false); + StoredEpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = true); /** * Destructor for cleaning up allocated memory. @@ -620,6 +620,42 @@ }; /** + * Class for stored by pattern schedules. + */ + class StoredByPatternSchedule : public ByPatternSchedule + { + public: + /** + * Initializes a new instance of the dvblinkremote::StoredByPatternSchedule class. + * @param id a constant string reference representing the schedule identifier. + * @param channelId a constant string reference representing the channel identifier. + * @param keyPhrase a constant string representing pattern keyphrase + * @param genreMask a constant long representing the genre bitflag + * \remark Construct the \p genreMask parameter by using bitwize operations on the DVBLinkByPatternScheduleGenreMask. + * @see DVBLinkByPatternScheduleGenreMask + */ + StoredByPatternSchedule(const std::string& id, const std::string& channelId, const std::string& keyPhrase, const long genreMask); + + /** + * Destructor for cleaning up allocated memory. + */ + ~StoredByPatternSchedule(); + }; + + /** + * Represent a strongly typed list of stored by pattern schedules. + * @see StoredByPatternSchedule::StoredByPatternSchedule() + */ + class StoredByPatternScheduleList : public std::vector + { + public: + /** + * Destructor for cleaning up allocated memory. + */ + ~StoredByPatternScheduleList(); + }; + + /** * Represent stored schedules which is used as output paramater for * the IDVBLinkRemoteConnection::GetSchedules method. * @see IDVBLinkRemoteConnection::GetSchedules() @@ -646,9 +682,16 @@ */ StoredEpgScheduleList& GetEpgSchedules(); + /** + * Gets a list of stored by_pattern schedules. + * @return A list of stored by_pattern schedules + */ + StoredByPatternScheduleList& GetByPatternSchedules(); + private: StoredManualScheduleList* m_manualScheduleList; StoredEpgScheduleList* m_epgScheduleList; + StoredByPatternScheduleList* m_bypatternScheduleList; }; /** diff -Nru kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/scheduling.cpp kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/scheduling.cpp --- kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/scheduling.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/scheduling.cpp 2016-01-10 21:41:24.000000000 +0000 @@ -146,6 +146,40 @@ { return m_programId; } +//// + +ByPatternSchedule::ByPatternSchedule(const std::string& id, const std::string& channelId, const std::string& keyphrase, const long genreMask, + const int recordingsToKeep, const int marginBefore, const int marginAfter) + : Schedule(SCHEDULE_TYPE_BY_PATTERN, id, channelId, recordingsToKeep, marginBefore, marginAfter), + m_genreMask(genreMask), + m_keyphrase(keyphrase) +{ + +} + +ByPatternSchedule::ByPatternSchedule(const std::string& channelId, const std::string& keyphrase, const long genreMask, + const int recordingsToKeep, const int marginBefore, const int marginAfter) + : Schedule(SCHEDULE_TYPE_BY_PATTERN, channelId, recordingsToKeep, marginBefore, marginAfter), + m_genreMask(genreMask), + m_keyphrase(keyphrase) +{ + +} + +ByPatternSchedule::~ByPatternSchedule() +{ + +} + +long ByPatternSchedule::GetGenreMask() +{ + return m_genreMask; +} + +std::string& ByPatternSchedule::GetKeyphrase() +{ + return m_keyphrase; +} AddScheduleRequest::AddScheduleRequest() { @@ -181,6 +215,18 @@ } +AddScheduleByPatternRequest::AddScheduleByPatternRequest(const std::string& channelId, const std::string& keyphrase, const long genremask, + const int recordingsToKeep, const int marginBefore, const int marginAfter) + : ByPatternSchedule(channelId, keyphrase, genremask, recordingsToKeep, marginBefore, marginAfter), AddScheduleRequest(), Schedule(Schedule::SCHEDULE_TYPE_BY_PATTERN, channelId, recordingsToKeep, marginBefore, marginAfter) +{ + +} + +AddScheduleByPatternRequest::~AddScheduleByPatternRequest() +{ + +} + bool AddScheduleRequestSerializer::WriteObject(std::string& serializedData, AddScheduleRequest& objectGraph) { tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("schedule"); @@ -230,13 +276,26 @@ byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "new_only", addScheduleByEpgRequest.NewOnly)); } - if (addScheduleByEpgRequest.RecordSeriesAnytime) { + if (!addScheduleByEpgRequest.RecordSeriesAnytime) { byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "record_series_anytime", addScheduleByEpgRequest.RecordSeriesAnytime)); } byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recordings_to_keep", addScheduleByEpgRequest.RecordingsToKeep)); } + if (objectGraph.GetScheduleType() == objectGraph.SCHEDULE_TYPE_BY_PATTERN) { + AddScheduleByPatternRequest& addByPatternScheduleRequest = (AddScheduleByPatternRequest&)objectGraph; + + tinyxml2::XMLElement* manualElement = GetXmlDocument().NewElement("by_pattern"); + rootElement->InsertEndChild(manualElement); + + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "channel_id", addByPatternScheduleRequest.GetChannelID())); + + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recordings_to_keep", addByPatternScheduleRequest.RecordingsToKeep)); + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "genre_mask", addByPatternScheduleRequest.GetGenreMask())); + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "key_phrase", addByPatternScheduleRequest.GetKeyphrase())); + } + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); GetXmlDocument().Accept(printer); serializedData = std::string(printer->CStr()); @@ -298,10 +357,28 @@ } } +StoredByPatternSchedule::StoredByPatternSchedule(const std::string& id, const std::string& channelId, const std::string& keyPhrase, const long genreMask) + : ByPatternSchedule(id, channelId, keyPhrase, genreMask), Schedule(Schedule::SCHEDULE_TYPE_BY_PATTERN, id, channelId) +{ + +} + +StoredByPatternSchedule::~StoredByPatternSchedule() +{ } + +StoredByPatternScheduleList::~StoredByPatternScheduleList() +{ + for (std::vector::const_iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + StoredSchedules::StoredSchedules() { m_manualScheduleList = new StoredManualScheduleList(); m_epgScheduleList = new StoredEpgScheduleList(); + m_bypatternScheduleList = new StoredByPatternScheduleList(); } StoredSchedules::~StoredSchedules() @@ -313,6 +390,10 @@ if (m_epgScheduleList) { delete m_epgScheduleList; } + + if (m_bypatternScheduleList) { + delete m_bypatternScheduleList; + } } StoredManualScheduleList& StoredSchedules::GetManualSchedules() @@ -325,6 +406,11 @@ return *m_epgScheduleList; } +StoredByPatternScheduleList& StoredSchedules::GetByPatternSchedules() +{ + return *m_bypatternScheduleList; +} + bool GetSchedulesResponseSerializer::ReadObject(StoredSchedules& object, const std::string& xml) { tinyxml2::XMLDocument& doc = GetXmlDocument(); @@ -357,33 +443,50 @@ std::string userParam = Util::GetXmlFirstChildElementText(&element, "user_param"); bool forceadd = Util::GetXmlFirstChildElementTextAsBoolean(&element, "force_add"); + int margin_before = Util::GetXmlFirstChildElementTextAsInt(&element, "margine_before"); + int margin_after = Util::GetXmlFirstChildElementTextAsInt(&element, "margine_after"); + if (m_parent.HasChildElement(element, "by_epg")) { tinyxml2::XMLElement* epg = (tinyxml2::XMLElement*)(&element)->FirstChildElement("by_epg"); std::string channelid = Util::GetXmlFirstChildElementText(epg, "channel_id"); std::string programid = Util::GetXmlFirstChildElementText(epg, "program_id"); - StoredEpgSchedule* s = new StoredEpgSchedule(scheduleId, channelid, programid); - s->ForceAdd = forceadd; - s->UserParameter = userParam; - - if (m_parent.HasChildElement(*epg, "repeat")) { - s->Repeat = Util::GetXmlFirstChildElementTextAsBoolean(epg, "repeat"); - } - - if (m_parent.HasChildElement(*epg, "new_only")) { - s->NewOnly = Util::GetXmlFirstChildElementTextAsBoolean(epg, "new_only"); - } - - if (m_parent.HasChildElement(*epg, "record_series_anytime")) { - s->RecordSeriesAnytime = Util::GetXmlFirstChildElementTextAsBoolean(epg, "record_series_anytime"); - } - - s->RecordingsToKeep = Util::GetXmlFirstChildElementTextAsInt(epg, "recordings_to_keep"); + if (programid.size() > 0) + { + StoredEpgSchedule* s = new StoredEpgSchedule(scheduleId, channelid, programid); + s->ForceAdd = forceadd; + s->UserParameter = userParam; + s->MarginBefore = margin_before; + s->MarginAfter = margin_after; + + if (m_parent.HasChildElement(*epg, "repeat")) { + s->Repeat = Util::GetXmlFirstChildElementTextAsBoolean(epg, "repeat"); + } + + if (m_parent.HasChildElement(*epg, "new_only")) { + s->NewOnly = Util::GetXmlFirstChildElementTextAsBoolean(epg, "new_only"); + } + + if (m_parent.HasChildElement(*epg, "record_series_anytime")) { + s->RecordSeriesAnytime = Util::GetXmlFirstChildElementTextAsBoolean(epg, "record_series_anytime"); + } + + s->RecordingsToKeep = Util::GetXmlFirstChildElementTextAsInt(epg, "recordings_to_keep"); + + tinyxml2::XMLElement* program_el = epg->FirstChildElement("program"); + if (program_el != NULL) + { + Program* p = new Program(); + ProgramSerializer::Deserialize((XmlObjectSerializer&)m_parent, *program_el, *p); + s->program_name_ = p->GetTitle(); + delete p; + } - m_storedSchedules.GetEpgSchedules().push_back(s); + m_storedSchedules.GetEpgSchedules().push_back(s); + } } - else if (m_parent.HasChildElement(element, "manual")) { + if (m_parent.HasChildElement(element, "manual")) { tinyxml2::XMLElement* manual = (tinyxml2::XMLElement*)(&element)->FirstChildElement("manual"); std::string channelId = Util::GetXmlFirstChildElementText(manual, "channel_id"); @@ -392,16 +495,39 @@ int duration = Util::GetXmlFirstChildElementTextAsLong(manual, "duration"); long dayMask = Util::GetXmlFirstChildElementTextAsLong(manual, "day_mask"); - StoredManualSchedule* s = new StoredManualSchedule(scheduleId, channelId, startTime, duration, dayMask, title); - s->ForceAdd = forceadd; - s->UserParameter = userParam; + if (channelId.size() > 0) + { + StoredManualSchedule* s = new StoredManualSchedule(scheduleId, channelId, startTime, duration, dayMask, title); + s->ForceAdd = forceadd; + s->UserParameter = userParam; + s->MarginBefore = margin_before; + s->MarginAfter = margin_after; - s->RecordingsToKeep = Util::GetXmlFirstChildElementTextAsInt(manual, "recordings_to_keep"); + s->RecordingsToKeep = Util::GetXmlFirstChildElementTextAsInt(manual, "recordings_to_keep"); - m_storedSchedules.GetManualSchedules().push_back(s); + m_storedSchedules.GetManualSchedules().push_back(s); + } } - else { - return false; + + if (m_parent.HasChildElement(element, "by_pattern")) { + tinyxml2::XMLElement* manual = (tinyxml2::XMLElement*)(&element)->FirstChildElement("by_pattern"); + + std::string channelId = Util::GetXmlFirstChildElementText(manual, "channel_id"); + std::string keyphrase = Util::GetXmlFirstChildElementText(manual, "key_phrase"); + long genreMask = Util::GetXmlFirstChildElementTextAsLong(manual, "genre_mask"); + + if (keyphrase.size() > 0 || genreMask != 0) + { + StoredByPatternSchedule* s = new StoredByPatternSchedule(scheduleId, channelId, keyphrase, genreMask); + s->ForceAdd = forceadd; + s->UserParameter = userParam; + s->MarginBefore = margin_before; + s->MarginAfter = margin_after; + + s->RecordingsToKeep = Util::GetXmlFirstChildElementTextAsInt(manual, "recordings_to_keep"); + + m_storedSchedules.GetByPatternSchedules().push_back(s); + } } return false; @@ -410,11 +536,13 @@ return true; } -UpdateScheduleRequest::UpdateScheduleRequest(const std::string& scheduleId, const bool newOnly, const bool recordSeriesAnytime, const int recordingsToKeep) +UpdateScheduleRequest::UpdateScheduleRequest(const std::string& scheduleId, const bool newOnly, const bool recordSeriesAnytime, const int recordingsToKeep, const int margin_before, const int margin_after) : m_scheduleId(scheduleId), m_newOnly(newOnly), m_recordSeriesAnytime(recordSeriesAnytime), - m_recordingsToKeep(recordingsToKeep) + m_recordingsToKeep(recordingsToKeep), + m_margin_before(margin_before), + m_margin_after(margin_after) { } @@ -444,6 +572,16 @@ return m_recordingsToKeep; } +int UpdateScheduleRequest::GetMarginBefore() +{ + return m_margin_before; +} + +int UpdateScheduleRequest::GetMarginAfter() +{ + return m_margin_after; +} + bool UpdateScheduleRequestSerializer::WriteObject(std::string& serializedData, UpdateScheduleRequest& objectGraph) { tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("update_schedule"); @@ -451,6 +589,8 @@ rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "new_only", objectGraph.IsNewOnly())); rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "record_series_anytime", objectGraph.WillRecordSeriesAnytime())); rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recordings_to_keep", objectGraph.GetRecordingsToKeep())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "margine_before", objectGraph.GetMarginBefore())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "margine_after", objectGraph.GetMarginAfter())); tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); GetXmlDocument().Accept(printer); diff -Nru kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/scheduling.h kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/scheduling.h --- kodi-pvr-dvblink-1.10.9/lib/libdvblinkremote/scheduling.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/lib/libdvblinkremote/scheduling.h 2016-01-10 21:41:24.000000000 +0000 @@ -39,7 +39,8 @@ enum DVBLinkScheduleType { SCHEDULE_TYPE_MANUAL = 0, /**< Used for manual schedules. */ - SCHEDULE_TYPE_BY_EPG = 1 /**< Used for electronic program guide (EPG) schedules. */ + SCHEDULE_TYPE_BY_EPG = 1, /**< Used for electronic program guide (EPG) schedules. */ + SCHEDULE_TYPE_BY_PATTERN = 2 /**< Used for by-pattern schedules. */ }; /** @@ -252,7 +253,7 @@ * Default value is false. * @param recordingsToKeep defines a number of recordings to keep in case of series recordings (0 - keep all). */ - EpgSchedule(const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); + EpgSchedule(const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = true, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); /** * Initializes a new instance of the dvblinkremote::EpgSchedule class. @@ -268,7 +269,7 @@ * Default value is false. * @param recordingsToKeep defines a number of recordings to keep in case of series recordings (0 - keep all). */ - EpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); + EpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = true, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); /** * Pure virtual destructor for cleaning up allocated memory. @@ -297,10 +298,82 @@ */ bool RecordSeriesAnytime; + /** + * Read-only field (e.g. filled on get), which describes original program, used for making a schedule + */ + std::string program_name_; + private: /** * The program identifier for the schedule. */ std::string m_programId; }; + + /** + * Abstract base class for "by pattern" schedules. + */ + class ByPatternSchedule : public virtual Schedule + { + public: + /** + * An enum to be used for constructing a genre search bitflag field + */ + enum DVBLinkByPatternScheduleGenreMask + { + DRGC_ANY = 0x00000000, + DRGC_NEWS = 0x00000001, + DRGC_KIDS = 0x00000002, + DRGC_MOVIE = 0x00000004, + DRGC_SPORT = 0x00000008, + DRGC_DOCUMENTARY = 0x00000010, + DRGC_ACTION = 0x00000020, + DRGC_COMEDY = 0x00000040, + DRGC_DRAMA = 0x00000080, + DRGC_EDU = 0x00000100, + DRGC_HORROR = 0x00000200, + DRGC_MUSIC = 0x00000400, + DRGC_REALITY = 0x00000800, + DRGC_ROMANCE = 0x00001000, + DRGC_SCIFI = 0x00002000, + DRGC_SERIAL = 0x00004000, + DRGC_SOAP = 0x00008000, + DRGC_SPECIAL = 0x00010000, + DRGC_THRILLER = 0x00020000, + DRGC_ADULT = 0x00040000 + }; + + ByPatternSchedule(const std::string& id, const std::string& channelId, const std::string& keyphrase, const long genreMask, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); + ByPatternSchedule(const std::string& channelId, const std::string& keyphrase, const long genreMask, const int recordingsToKeep = 0, const int marginBefore = -1, const int marginAfter = -1); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~ByPatternSchedule() = 0; + + /** + * Gets the genre bitmask + * @return genre bitmask + */ + long GetGenreMask(); + + /** + * Gets the keyphrase + * @return keyphrase + */ + std::string& GetKeyphrase(); + + private: + + /** + * The genre bitmask + */ + long m_genreMask; + + /** + * The search keyphrase. + */ + std::string m_keyphrase; + }; + }; diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/addon.xml kodi-pvr-dvblink-2.0.4/pvr.dvblink/addon.xml --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/addon.xml 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/addon.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ - - - - - - - - - ПВР добавка за DVBLink - Complement PVR per a DVBLink - PVR plugin pro DVBLink - Ategyn Recordydd ar gyfer DVBLink - PVR Plugin til DVBLink - PVR-Plugin für DVBLink - Plugin PVR για το DVBLink - PVR Plugin for DVBLink - PVR Plugin for DVBLink - PVR Plugin for DVBLink - PVR Plugin for DVBLink - Plugin PVR para DVBLink - Complemento PVR para DVBLink - Complemento PVR para DVBLink - Plugiciel de numériscope pour DVBLink - Plugin PVR pour DVBLink - Complemento PVR do DVBLink - לקוח טלוויזיה חיה עבור DVBLink - PVR dodatak za DVBLink - PVR Kiegészítő a DVBLink-hez - Plugin PVR untuk DVBlink - PVR viðbót fyrir DVBLink - Plugin PVR per DVBLink - DVBLink の PVR プラグイン - DVBLink를 위한 PVR 플러그인 - PVR įskiepis skirtas DVBLink - PVR spraudnis DVBLink - PVR Plugin за DVBLink - Plugin PVR untuk DVBLink - PVR-innstikk til DVBLink - PVR Plug-in voor DVBLink - Klient TV dla DVBLink - Plugin de PVR para DVBLink - Plugin PVR para DVBLink - Plugin PVR pentru DVBLink - Дополнение PVR для DVBLink - DBVLink සඳහා PVR පේනුකිරීම - PVR zásuvný modul pre DVBLink - Vtičnik PVR za DVBLink - PVR tillägg för DVBLink - DVDLink için PVR Eklentisi - DVBLink PVR 插件 - ПВР добавка за DVBLink от DvbLogic.com. Поддържа поточна телевизия и записване, електронен програмен справочник и броячи. - Complement PVR per a DVBLink de DvbLogic.com; compatible amb fluxos de TV en directe i enregistraments, EPG, temporitzadors - PVR plugin pro DVBLink od DvbLogic.com; podporuje živé TV vysílání a nahrávání, EPG, časovač - Ategyn amserydd ar gyfer DVBLink gan DvbLogic.com; cefnogi ffrydio Teledu Byw a Recordiadau ac Amseryddion - PVR Plugin til DVBLink fra DvbLogic.com; understøtter streaming af TV og optagelser, EPG, Timere. - PVR-Plugin für DVBLink von DvbLogic.com; unterstützt das Streaming von Live-TV & Aufnahmen, EPG, Timer - Plugin PVR για το DVBLink από το DvbLogic.com. Υποστηρίζει ροές πολυμέσων από LiveTV & Εγγραφές, EPG, Χρονοδιακόπτες - PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers - PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers - PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers - PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers - Plugin PVR para DVBLink de DvbLogic.com; soporta streaming de TV en vivo, grabaciones, guía de programación (EPG) y temporizadores - Complemento PVR para DVBLink de DvbLogic.com; soporta emisiones en directo, grabaciones, EPG, programaciones - Complemento PVR para DVBLink de DvbLogic.com; soporta emisiones de TV en vivo, grabaciones, EPG, programaciones. - Plugiciel de numériscope pour DVBLink de DvbLogic.com, prenant en charge la lecture en transit de la télé en direct & les enregistrements, GÉP, des minuteries - Plugin PVR pour DVBLink de DvbLogic.com. Supporte la lecture en continu de la télévision en directe et de son enregistrement, guide de programme, programmations. - Complemento PVR do DVBLink de DvbLogic.com; soporta transmisión de TV en directo e Gravacións, Guía e temporizadores - לקוח טלוויזיה חיה של DVBLink מ־DvbLogic.com. תומך בהזרמת שידורים חיים והקלטות, הצגת לוח שידורים ותזמון הקלטות. - PVR dodatak za DVBLink od DvbLogic.com; podržava streamanje TV programa i snimanje, elektronski programski vodič (EPG) i zakazana snimanja - PVR Kiegészítő a DVBLink-hez a DvbLogic.com-tól; támogatja a Live TV streamet & felvételt, EPG-t, időzítőt. - Plugin PVR untuk DVBLink dari DvbLogic.com; mendukung siaran dari Live TV dan Perekaman, EPG, dan Timer. - Upptökuviðbót (PVR) fyrir DVBLink frá DvbLogic.com; styður streymingu á Live TV & Recordings, rafræna dagskrárvísa (EPG), og tímaupptökur - Plugin PVR per DVBLink da DvbLogic.com; supporta lo stream di Live TV e registrazioni, EPG, timer - DvdLogic.com - DVBLink の PVR プラグインです。ライブTV ストリーミング、録画、EPG、タイマーをサポートしています - DvbLogic.com의 DVBLink를 위한 PVR 플러그인. 라이브 TV 스트리밍, 녹화, EPG, 타이머를 지원합니다. - PVR įskiepis skirtas DVBLink iš DvbLogic.com; palaiko Live TV transliaciją ir įrašymus, EPG, laikmačius - PVR spraudnis DVBLink no DvbLogic.com; atbalsta tiešraides TV un ierakstu straumēšanu, EPG, taimerus - PVR Plugin за DVBLink од DvbLogic.com; поддржува емитување на Live TV & Снимки, EPG, Тајмери - Plugin PVR untuk DVBLink dari DvbLogic.com; menyokong penstriman Siaran Langsung & Rakaman, EPG dan Pemasa - PVR-innstikk til DVBLink fra DvbLogic.com - støtter strømming av Live-TV, opptak, EPG og tidsur. - PVR plug-in voor DVBLink van DvbLogic.com; ondersteunt het streamen van Live TV & opnames, EPG, Timers - Klient DVBLink od DvbLogic.com obsługuje strumieniowanie kanałów radiowych i telewizyjnych, nagrywanie i harmonogram nagrań oraz funkcje przewodnika telewizyjnego. - Plugin de PVR para DVBLink de DvbLogic.com; suporta streaming de tv ao vivo e gravações, EPG, Agendamentos - Plugin PVR para DVBLink de DvbLogic.com; suporta transmissão de TV em directo e gravações, EPG, temporizadores. - Plugin PVR pentru DVBLink de la DvbLogic.com; se poate difuza în flux a televiziunii în direct și a înregistrăriilor, EPG, Cronometre - Плагин PVR для DVBLink с сайта DvbLogic.com; поддержка трансляции Прямого вещания и записей Live TV & Recordings, EPG, Таймеров - DvbLogic.com වලින් DBVLink සඳහා PVR පේනුකිරීම; සජීව රූපවාහිනී සහ පටිගත කිරීම් ප්‍රවාහන කිරීම ,EPG, මුහුර්තක උදව් - PVR zásuvný modul pre DVBLink od firmy DvbLogic.com; je podporované streamovanie živého televízneho vysielania a nahrávok, EPG, časovačov - Vtičnik PVR za DVBLink z DvbLogic.com; podpira predvajanje televizije v živo & posnetkov, EPG, časovnike. - PVR tillägg för DVBLink från DvbLogic.com; stöder strömmande Live TV & inspelningar, EPG, timers - DvbLogic.com'dan DVBLink için PVR Eklentisi; Canlı TV akışı ve Kayıtları, EPG, Zamanlayıcıları destekler - 来自 DvbLogic.com 的 DVBLink 的 PVR 插件,支持直播电视播放和录制、电子节目单、定时器 - Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, gemorsde ure, of enige ander ongewensde effekte. - This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляно време и други нежелани ефекти. - Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualssevol altres efectes no desitjats.. - Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... - Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. - Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser.. - 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 es un software inestable! Los autores no son de ninguna manera responsables de las grabaciones fallidas o incorrectas, las programaciones perdidas, ni otros efectos no deseables.. - ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... - See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. - Tämä on epävakaa ohjelmisto! Tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksia, haaskatusta ajasta, verenpaineen noususta tai mistään muusta epäsuotuisasta vaikutuksesta. - 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.. - Este é 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 odgovorni za neuspjelo snimanje, netočna vremena snimanja, izgubljene sate, ili bilo koje druge nepoželjne učinke... - Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... - Սա անկայուն ծրագրային ապահովում է: Հեղինակները պատասխանատու չեն վատ ձայնագրումների, սխալ ժամանակացույցերի, կորած ժամանակի կամ այլ ոչ ցանկալի երևույթների համար: - Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... - Þetta er óstöðugur hugbúnaður! Höfundar eru á engann hátt ábyrgir fyrir mistökum í upptöku, röngum tíma, klukkustundum sem fara í súginn, eða nokkru öðrum óæskilegum hegðunum. - Questo software è instabile! Gli autori non sono in alcun modo responsabili per le registrazioni fallite ì, timer non corretti, ore perse o qualsiasi altro effetto non desiderato... - これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 - 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. - 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 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.. - Dette er ustabil programvare! Skaperen har ikke på noen måte ansvar for feilede opptak, feile timere, bortkastede timer, eller andre uønskede effekter.. - Dit is instabiele software! De auteurs zijn op geen enkele wijze verantwoordelijk voor mislukte opnames, onjuiste timers, verspilde uren, of andere ongewenste effecten .. - 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 dispendidas, ou quaisquer outros efeitos indesejáveis - Este software é instável! Os autores não são de forma alguma responsáveis por gravações falhadas, temporizadores incorrectos, horas desperdiçadas, ou qualquer outro tipo de efeitos indesejáveis.. - Acesta este o aplicație instabilă! Autorii nu sunt în nici un fel responsabili pentru înregistrări eșuate, cronometre incorecte, ore pierdute, sau orice alte efecte nedorite... - Это тестовая программа! Авторы не несут ответственности за неудачные записи, неверные таймеры, потраченное время и прочие нежелательные эффекты.. - මෙය අස්ථිර මෘදුකාංගයකි! මෙහි සිදුවන පටිගත කිරීම් අසාර්ථක වීම්, සාවද්‍ය මුහුර්තක, නාස්ති වූ කාලයන්, හෝ වෙනත් යමිකිසි නුසුදුසු බලපෑම් සඳහා කතෘ වග කියනු නොලැබේ. - Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. - To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... - Ky program nuk është ende stabël! Autorët e këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tilla të padëshirueshme. - Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправна заказана снимања, изгубљене сате или друге нежељене ефекте. - Detta är ostabil mjukvara! Upphovsmännen är inte ansvariga för misslyckade inspelningar, inkorrekta timers, bortslösade timmar, eller några andra oönskade effekter.. - 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 stabil olmayan program! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. - Це нестабільна програма! Автори не несуть відповідальності за попсуті записи, неправильні таймери, втрачений час та інші небажані ефекти. - Đây là phần mềm không ổn định! Các tác giả không chịu trách nhiệm đối với bản ghi chương trình thất bại, hẹn giờ không chính xác, giờ lãng phí, hoặc bất kỳ tác dụng không mong muốn khác.. - 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 - 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... - all - - diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/addon.xml.in kodi-pvr-dvblink-2.0.4/pvr.dvblink/addon.xml.in --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/addon.xml.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/addon.xml.in 2016-01-10 21:41:24.000000000 +0000 @@ -0,0 +1,170 @@ + + + + + + + + + + ПВР добавка за DVBLink + Complement PVR per a DVBLink + PVR plugin pro DVBLink + Ategyn Recordydd ar gyfer DVBLink + PVR Plugin til DVBLink + PVR-Plugin für DVBLink + Plugin PVR για το DVBLink + PVR Plugin for DVBLink + PVR Plugin for DVBLink + PVR Plugin for DVBLink + PVR Plugin for DVBLink + Plugin PVR para DVBLink + Complemento PVR para DVBLink + Complemento PVR para DVBLink + PVR plugi DVBlinkille + Plugiciel de numériscope pour DVBLink + Extension enregistreur vidéo (PVR) pour DVBLink + Complemento PVR do DVBLink + לקוח טלוויזיה חיה עבור DVBLink + PVR dodatak za DVBLink + PVR kiegészítő a DVBLink-hez + Plugin PVR untuk DVBlink + PVR viðbót fyrir DVBLink + Plugin PVR per DVBLink + DVBLink 用 PVR プラグイン + DVBLink를 위한 PVR 플러그인 + PVR įskiepis skirtas DVBLink + PVR spraudnis DVBLink + PVR Plugin за DVBLink + Pemalam PVR untuk DVBLink + PVR Plugin għal DVBLink + PVR-innstikk til DVBLink + PVR Plug-in voor DVBLink + Klient telewizyjny dla DVBLink + Plugin de PVR para DVBLink + Plugin PVR para DVBLink + Plugin PVR pentru DVBLink + Дополнение PVR для DVBLink + DBVLink සඳහා PVR පේනුකිරීම + PVR zásuvný modul pre DVBLink + Vtičnik PVR za DVBLink + PVR Прикључак за DVBLink + PVR Priključak za DVBLink + PVR tillägg för DVBLink + DVDLink için PVR Eklentisi + PVR плагін для DVBLink + DVBLink PVR 插件 + ПВР добавка за DVBLink от DvbLogic.com. Поддържа поточна телевизия и записване, електронен програмен справочник и броячи. + Complement PVR per a DVBLink de DvbLogic.com; compatible amb fluxos de TV en directe i enregistraments, EPG, temporitzadors + PVR plugin pro DVBLink od DvbLogic.com; podporuje živé TV vysílání a nahrávání, EPG, časovač + Ategyn amserydd ar gyfer DVBLink gan DvbLogic.com; cefnogi ffrydio Teledu Byw a Recordiadau ac Amseryddion + PVR Plugin til DVBLink fra DvbLogic.com; understøtter streaming af TV og optagelser, EPG, Timere. + PVR-Plugin für DVBLink von DvbLogic.com; unterstützt das Streaming von Live-TV & Aufnahmen, EPG, Timer + Plugin PVR για το DVBLink από το DvbLogic.com. Υποστηρίζει ροές πολυμέσων από LiveTV & Εγγραφές, EPG, Χρονοδιακόπτες + PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers + PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers + PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers + PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers + Plugin PVR para DVBLink de DvbLogic.com; soporta streaming de TV en vivo, grabaciones, guía de programación (EPG) y temporizadores + Complemento PVR para DVBLink de DvbLogic.com; soporta emisiones en directo, grabaciones, EPG, programaciones + Complemento PVR para DVBLink de DvbLogic.com; soporta emisiones de TV en vivo, grabaciones, EPG, programaciones. + DVBLinkin PVR plugi DvbLogic.com:ilta; tukee reaaliaikaisen television ja nauhoitusten streamausta, EPGtä ja nauhoituksien ajastusta. + Plugiciel de numériscope pour DVBLink de DvbLogic.com, prenant en charge la lecture en transit de la télé en direct & les enregistrements, GÉP, des minuteries + Extension enregistreur vidéo (PVR) pour DVBLink de DvbLogic.com. Gère la diffusion de la TV et des enregistrements en direct, le guide électronique des programmes TV et les programmations. + Complemento PVR do DVBLink de DvbLogic.com; soporta transmisión de TV en directo e Gravacións, Guía e temporizadores + לקוח טלוויזיה חיה של DVBLink מ־DvbLogic.com. תומך בהזרמת שידורים חיים והקלטות, הצגת לוח שידורים ותזמון הקלטות. + PVR dodatak za DVBLink od DvbLogic.com; podržava streamanje TV programa i snimanje, elektronski programski vodič (EPG) i zakazana snimanja + PVR kiegészítő a DVBLink-hez a DvbLogic.com-tól; támogatja az elő TV adásokat, felvételeket, EPG-t, időzítést. + Plugin PVR untuk DVBLink dari DvbLogic.com; mendukung siaran dari Live TV dan Perekaman, EPG, dan Timer. + Upptökuviðbót (PVR) fyrir DVBLink frá DvbLogic.com; styður streymingu á Live TV & Recordings, rafræna dagskrárvísa (EPG), og tímaupptökur + Plugin PVR per DVBLink da DvbLogic.com; supporta lo stream di Live TV e registrazioni, EPG, timer + DvdLogic.com - DVBLink の PVR プラグインです。ライブTV ストリーミング、録画、EPG、タイマーをサポートしています + DvbLogic.com의 DVBLink를 위한 PVR 플러그인. 라이브 TV 스트리밍, 녹화, EPG, 타이머를 지원합니다. + PVR įskiepis skirtas DVBLink iš DvbLogic.com; palaiko Live TV transliaciją ir įrašymus, EPG, laikmačius + PVR spraudnis DVBLink no DvbLogic.com; atbalsta tiešraides TV un ierakstu straumēšanu, EPG, taimerus + PVR Plugin за DVBLink од DvbLogic.com; поддржува емитување на Live TV & Снимки, EPG, Тајмери + Pemalam PVR untuk DVBLink dari DvbLogic.com; menyokong penstriman Siaran Langsung & Rakaman, EPG dan Pemasa + PVR Plugin għal DVBLink minn DVBLogic.com; jiflaħ streaming ta' TV Lajv u Rekordings, EPG, Arloġġi + PVR-innstikk til DVBLink fra DvbLogic.com - støtter strømming av Live-TV, opptak, EPG og tidsur. + PVR plug-in voor DVBLink van DvbLogic.com; ondersteunt het streamen van Live TV & opnames, EPG, Timers + Klient telewizyjny dla DVBLink od DvbLogic.com obsługuje strumieniowanie kanałów radiowych i telewizyjnych, nagrywanie i harmonogram nagrań oraz funkcje przewodnika telewizyjnego. + Plugin de PVR para DVBLink de DvbLogic.com; suporta streaming de tv ao vivo e gravações, EPG, Agendamentos + Plugin PVR para DVBLink de DvbLogic.com; suporta transmissão e gravação de TV em direto, EPG e temporizadores. + Plugin PVR pentru DVBLink de la DvbLogic.com; se poate difuza în flux a televiziunii în direct și a înregistrăriilor, EPG, Cronometre + Плагин PVR для DVBLink с сайта DvbLogic.com; поддержка трансляции Прямого вещания и записей Live TV & Recordings, EPG, Таймеров + DvbLogic.com වලින් DBVLink සඳහා PVR පේනුකිරීම; සජීව රූපවාහිනී සහ පටිගත කිරීම් ප්‍රවාහන කිරීම ,EPG, මුහුර්තක උදව් + PVR zásuvný modul pre DVBLink od firmy DvbLogic.com; je podporované streamovanie živého televízneho vysielania a nahrávok, EPG, časovačov + Vtičnik PVR za DVBLink z DvbLogic.com; podpira predvajanje televizije v živo & posnetkov, EPG, časovnike. + PVR Прикључак за DVBLink од DvbLogic.com; подржава стримовање ТВ Уживо & Снимака, EPG, Тајмере + PVR Priključak za DVBLink od DvbLogic.com; podržava strimovanje TV Uživo & Snimaka, EPG, Tajmere + PVR tillägg för DVBLink från DvbLogic.com; stöder strömmande Live TV & inspelningar, EPG, timers + DvbLogic.com'dan DVBLink için PVR Eklentisi; Canlı TV akışı ve Kayıtları, EPG, Zamanlayıcıları destekler + PVR плагін для DVBLink з DvbLogic.com; підтримує потоки Live TV, запис, програму передач, таймери. + 来自 DvbLogic.com 的 DVBLink 的 PVR 插件,支持直播电视播放和录制、电子节目单、定时器 + Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, gemorsde ure, of enige ander ongewensde effekte. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляно време и други нежелани ефекти. + Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualssevol altres efectes no desitjats.. + Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. + Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser.. + 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 es un software inestable! Los autores no son de ninguna manera responsables de las grabaciones fallidas o incorrectas, las programaciones perdidas, ni otros efectos no deseables.. + ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. + Tämä on epävakaa ohjelmisto! Tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksia, haaskatusta ajasta, verenpaineen noususta tai mistään muusta epäsuotuisasta vaikutuksesta. + 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. + Este é 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 odgovorni za neuspjelo snimanje, netočna vremena snimanja, izgubljene sate, ili bilo koje druge nepoželjne učinke... + Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... + Սա անկայուն ծրագրային ապահովում է: Հեղինակները պատասխանատու չեն վատ ձայնագրումների, սխալ ժամանակացույցերի, կորած ժամանակի կամ այլ ոչ ցանկալի երևույթների համար: + Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... + Þetta er óstöðugur hugbúnaður! Höfundar eru á engann hátt ábyrgir fyrir mistökum í upptöku, röngum tíma, klukkustundum sem fara í súginn, eða nokkru öðrum óæskilegum hegðunum. + Questo software è instabile! Gli autori non sono in alcun modo responsabili per le registrazioni fallite ì, timer non corretti, ore perse o qualsiasi altro effetto non desiderato... + これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. + 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 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! Skaperen har ikke på noen måte ansvar for feilede opptak, feile timere, bortkastede timer, eller andre uønskede effekter.. + Dit is instabiele software! De auteurs zijn op geen enkele wijze verantwoordelijk voor mislukte opnames, onjuiste timers, verspilde uren, of andere ongewenste effecten .. + 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 dispendidas, 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 este o aplicație instabilă! Autorii nu sunt în nici un fel responsabili pentru înregistrări eșuate, cronometre incorecte, ore pierdute, sau orice alte efecte nedorite... + Это тестовая программа! Авторы не несут ответственности за неудачные записи, неверные таймеры, потраченное время и прочие нежелательные эффекты.. + මෙය අස්ථිර මෘදුකාංගයකි! මෙහි සිදුවන පටිගත කිරීම් අසාර්ථක වීම්, සාවද්‍ය මුහුර්තක, නාස්ති වූ කාලයන්, හෝ වෙනත් යමිකිසි නුසුදුසු බලපෑම් සඳහා කතෘ වග කියනු නොලැබේ. + Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. + To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... + Ky program nuk është ende stabël! Autorët e këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tilla të padëshirueshme. + Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправне тајмере, изгубљене сате, или било које друге нежељене ефекте.. + 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ả không chịu trách nhiệm đối với bản ghi chương trình thất bại, hẹn giờ không chính xác, giờ lãng phí, hoặc bất kỳ tác dụng không mong muốn khác.. + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... + @PLATFORM@ + + diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/changelog.txt kodi-pvr-dvblink-2.0.4/pvr.dvblink/changelog.txt --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/changelog.txt 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/changelog.txt 2016-01-10 21:41:24.000000000 +0000 @@ -1,12 +1,43 @@ -[B]Version 1.10.9[/B] -Fixed: Debian packaging: fix library install path -Fixed: Miscellaneous backend fixes +[B]Version 2.0.4[/B] +Updated: language files from Transifex + +[B]Version 2.0.3[/B] +Updated: language files from Transifex + +[B]Version 2.0.2[/B] +- kodi.guilib is mandatory, enforce it + +[B]Version 2.0.1[/B] +Updated: language files from Transifex + +[B]Version 2.0.0[/B] +Added: Backport of 1.10.9 version fixes from Isengard tree +Added: Native Kodi Jarvis series timer support +Added: Support for keyword-based recording timers +Added: episode/season/year info to recording metadata + +[B]Version 1.11.6[/B] +Updated to PVR API v4.1.0 + +[B]Version 1.11.5[/B] +Updated to PVR API v4.0.0 + +[B]Version 1.11.4[/B] +Updated to PVR API v3.0.0 (API 1.9.7 Compatibility Mode) + +[B]Version 1.11.3[/B] +Updated to PVR API v2.1.0 +Automatically fill in platform and library name + +[B]Version 1.11.2[/B] +Debian packaging: fix library install path +Miscellaneous backend fixes -[B]Version 1.10.8[/B] -Fixed: Kodi hangup on adding timers +[B]Version 1.11.1[/B] +Updated to PVR API v2.0.0 -[B]Version 1.10.7[/B] -Updated: libplatform dependency +[B]Version 1.11.0[/B] +Updated to PVR API v1.9.7 [B]Version 1.10.6[/B] Updated: language files from Transifex diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.af_za/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.af_za/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.af_za/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.af_za/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -40,14 +40,38 @@ msgid "HTTP" msgstr "HTTP" +msgctxt "#30112" +msgid "Timeshift buffer path" +msgstr "Tydskuif buffer pad" + msgctxt "#30200" msgid "Advanced" msgstr "Gevorderde" +msgctxt "#32012" +msgid "Record this episode only" +msgstr "Neem net hierdie episode op" + +msgctxt "#32013" +msgid "Record all episodes" +msgstr "Neem alle episodes op" + msgctxt "#32014" msgid "Delete timer" msgstr "Wis tydhouer uit" +msgctxt "#32016" +msgid "Delete the entire series" +msgstr "Wis die hele reeks uit" + msgctxt "#32022" msgid "Default" msgstr "Verstek" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Neem alle episodes op" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Neem slegs nuwe episodes op" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.be_by/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.be_by/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.be_by/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.be_by/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -59,3 +59,7 @@ msgctxt "#32022" msgid "Default" msgstr "Default" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Запісваць усе эпізоды" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.bg_bg/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.bg_bg/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.bg_bg/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.bg_bg/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -18,7 +18,7 @@ msgctxt "#30000" msgid "General" -msgstr "Главни" +msgstr "Основни" msgctxt "#30001" msgid "Server Address" @@ -134,7 +134,7 @@ msgctxt "#32007" msgid "Found %d EPG timers" -msgstr "Открити са ЕПС брояча" +msgstr "Открити са %d брояча в справочника" msgctxt "#32008" msgid "Found %d manual timers" @@ -175,3 +175,7 @@ msgctxt "#32022" msgid "Default" msgstr "Стандартна" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Запиши всички епизоди" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.cs_cz/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.cs_cz/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.cs_cz/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.cs_cz/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Neseskupuj jednotlivá nahrávání." + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Ponechat všechny nahrávky" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Ponechat 1 nahrávku" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Ponechat 2 nahrávky" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Ponechat 3 nahrávky" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Ponechat 4 nahrávky" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Ponechat 5 nahrávek" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Ponechat 6 nahrávek" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Ponechat 7 Nahrávek" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Ponechat 10 nahrávek" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Nahrát všechny epizody" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Nahrát pouze nové epizody" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Jednorázový manuální časovač" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Jednorázový časovač založený na EPG" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Vygenerováno opakujícím se časovačem" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Vygenerováno časovačem pro nahrávání sérií" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Vygenerováno opakujícím se časovačem založeným na klíčových slovech" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Opakující se manuální časovač" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Časovač pro nahrávání sérií" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Opakující se časovač založený na klíčových slovech" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.cy_gb/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.cy_gb/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.cy_gb/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.cy_gb/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -175,3 +175,7 @@ msgctxt "#32022" msgid "Default" msgstr "Rhagosodiad" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Recordio pob pennod" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.da_dk/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.da_dk/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.da_dk/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.da_dk/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,46 @@ msgid "Delete the entire series" msgstr "Delete the entire series" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Margin før (minutter)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Margin efter (minutter)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Udelukkende nye afsnit" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Udsendelser/Presse" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Antal afsnit der gemmes" + msgctxt "#32022" msgid "Default" msgstr "Standard" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Behold alle" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Afsplining mislykkedes. Serveren understøtter ikke transcoding" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Grupper ikke enkeltstående optagelser" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Record all episodes" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Optag kun nye afsnit" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.de_de/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.de_de/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.de_de/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.de_de/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,11 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Einzelne Aufnahmen nicht zusammenfassen" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Alle Episoden aufnehmen" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Nur neue Episoden aufnehmen" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.el_gr/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.el_gr/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.el_gr/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.el_gr/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,34 @@ msgid "Delete the entire series" msgstr "Διαγραφή όλης της σειράς" +msgctxt "#32019" +msgid "New episodes only" +msgstr "Μόνο νέα επεισόδια" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Αριθμός επεισοδίων που θα κρατηθούν" + msgctxt "#32022" msgid "Default" msgstr "Προεπιλογή" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Κράτηση όλων" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Η αναπαραγωγή απέτυχε. Ο Διακομιστής δεν υποστηρίζει transcoding" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Μη τοποθέτηση ενιαίων εγγραφών σε ομάδα" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Εγγραφή όλων των επεισοδίων" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Εγγραφή μόνο νέων επεισοδίων" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_au/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_au/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_au/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_au/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -175,3 +175,7 @@ msgctxt "#32022" msgid "Default" msgstr "Default" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Record all episodes" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_gb/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_gb/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_gb/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_gb/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -222,3 +222,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_nz/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_nz/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_nz/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_nz/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Do not group single recordings" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Keep all recordings" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Keep 1 recording" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Keep 2 recordings" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Keep 3 recordings" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Keep 4 recordings" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Keep 5 recordings" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Keep 6 recordings" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Keep 7 recordings" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Keep 10 recordings" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Record all episodes" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Record only new episodes" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Single shot manual timer" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Single shot EPG-based timer" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Generated by repeating timer" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Generated by record series timer" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Generated by repeating keyword timer" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Repeating manual timer" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Record series timer" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Repeating keyword-based timer" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_us/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_us/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.en_us/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.en_us/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,7 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Do not group single recordings" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Record all episodes" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.es_ar/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.es_ar/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.es_ar/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.es_ar/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -175,3 +175,7 @@ msgctxt "#32022" msgid "Default" msgstr "Por defecto" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Grabar todos los episodios" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.es_es/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.es_es/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.es_es/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.es_es/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,47 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "No agrupar grabaciones independientes" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Mantener todas las grabaciones" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Mantener 1 grabación" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Mantener 2 grabaciones" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Mantener 3 grabaciones" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Mantener 4 grabaciones" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Mantener 5 grabaciones" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Mantener 6 grabaciones" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Mantener 7 grabaciones" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Mantener 10 grabaciones" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Grabar todos los episodios" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Grabar sólo nuevos episodios" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.es_mx/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.es_mx/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.es_mx/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.es_mx/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -131,3 +131,7 @@ msgctxt "#32022" msgid "Default" msgstr "Por defecto" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Grabar todos los episodios" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.et_ee/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.et_ee/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.et_ee/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.et_ee/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -20,6 +20,14 @@ msgid "General" msgstr "Üldine" +msgctxt "#30001" +msgid "Server Address" +msgstr "Serveri aadress" + +msgctxt "#30002" +msgid "Server Port" +msgstr "Serveri Port" + msgctxt "#30005" msgid "Username" msgstr "Kasutajanimi" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.fi_fi/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.fi_fi/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.fi_fi/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.fi_fi/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -24,6 +24,18 @@ msgid "Server Address" msgstr "Palvelimen osoite" +msgctxt "#30002" +msgid "Server Port" +msgstr "Palvelimen portti" + +msgctxt "#30003" +msgid "Client name" +msgstr "Asiakas nimi" + +msgctxt "#30004" +msgid "Connection timeout (s)" +msgstr "Yhteyden aikakatkaisu (s)" + msgctxt "#30005" msgid "Username" msgstr "Käyttäjänimi" @@ -36,26 +48,126 @@ msgid "Stream" msgstr "Katso" +msgctxt "#30103" +msgid "Height" +msgstr "Korkeus" + +msgctxt "#30104" +msgid "Width" +msgstr "Leveys" + msgctxt "#30105" msgid "Bitrate" msgstr "Bittinopeus" +msgctxt "#30106" +msgid "Audio track" +msgstr "Ääniraita" + msgctxt "#30107" msgid "HTTP" msgstr "HTTP" +msgctxt "#30108" +msgid "RTP" +msgstr "RTP" + +msgctxt "#30109" +msgid "HLS" +msgstr "HLS" + +msgctxt "#30110" +msgid "ASF" +msgstr "ASF" + +msgctxt "#30111" +msgid "Enable Timeshift" +msgstr "Ajansiirto käytössä" + +msgctxt "#30112" +msgid "Timeshift buffer path" +msgstr "Ajansiirtopuskurin polku" + msgctxt "#30200" msgid "Advanced" msgstr "Lisäasetukset" +msgctxt "#30202" +msgid "Show information messages" +msgstr "Näytä lisätietoa viestit" + +msgctxt "#30204" +msgid "Group Recordings by Series" +msgstr "Ryhmätallennus sarjoittain" + +msgctxt "#32001" +msgid "Connected to DVBLink Server '%s'" +msgstr "Yhteydessä DVBLink palvelimeen '%s'" + +msgctxt "#32002" +msgid "Found '%d' channels" +msgstr "Löytyi '%d' kanavaa" + +msgctxt "#32003" +msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" +msgstr "Yhteyttä DVBLink palvelimeen '%s' ei voitu muodostaa (Virhekoodi : %d)" + +msgctxt "#32004" +msgid "Could not get recordings (Error code : %d)" +msgstr "Tallennuksia ei voitu hakea (virhe koodi : %d)" + +msgctxt "#32006" +msgid "Could not get timers(Error code : %d)" +msgstr "Ajastuksia ei voitu hakea (virhe koodi : %d)" + +msgctxt "#32007" +msgid "Found %d EPG timers" +msgstr "Löytyi %d EPG ajastusta" + +msgctxt "#32008" +msgid "Found %d manual timers" +msgstr "Löytyi %d manuaaliajastusta" + +msgctxt "#32009" +msgid "Found %d recordings" +msgstr "Löytyi %d tallennusta" + +msgctxt "#32011" +msgid "Series recording" +msgstr "Sarjojen tallennus" + msgctxt "#32012" msgid "Record this episode only" msgstr "Tallenna vain tämä jakso" +msgctxt "#32013" +msgid "Record all episodes" +msgstr "Tallenna kaikki jaksot" + msgctxt "#32014" msgid "Delete timer" msgstr "Poista ajastus" +msgctxt "#32015" +msgid "Delete this timer only" +msgstr "Poista vain tämä ajastus" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Vain uudet jaksot" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Jaksojen numerot jotka säilytetään" + msgctxt "#32022" msgid "Default" msgstr "Oletus" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Säilytä kaikki" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Tallenna kaikki jaksot" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.fr_ca/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.fr_ca/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.fr_ca/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.fr_ca/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -34,7 +34,7 @@ msgctxt "#30004" msgid "Connection timeout (s)" -msgstr "Délai d'attente de connexion (s)" +msgstr "Temporisation de connexion (s)" msgctxt "#30005" msgid "Username" @@ -110,7 +110,7 @@ msgctxt "#30204" msgid "Group Recordings by Series" -msgstr "Grouper les enregistrements par séries" +msgstr "Regrouper les enregistrements par séries" msgctxt "#32001" msgid "Connected to DVBLink Server '%s'" @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Ne pas regrouper les enregistrements uniques" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Garder tous les enregistrements" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Garder 1 enregistrement" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Garder 2 enregistrements" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Garder 3 enregistrements" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Garder 4 enregistrements" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Garder 5 enregistrements" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Garder 6 enregistrements" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Garder 7 enregistrements" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Garder 10 enregistrements" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Enregistrer tous les épisodes" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Enregistrer seulement les nouveaux épisodes" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Minuterie manuelle unique" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Minuterie manuelle unique d'après le GÉP" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Générée par la minuterie de répétition" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Générée par la minuterie d'enregistrement d'une série" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Générée par la minuterie de répétition par mot-clef" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Minuterie manuelle de répétition" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Minuterie d'enregistrement d'une série" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Minuterie de répétition par mot-clef" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.fr_fr/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.fr_fr/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.fr_fr/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.fr_fr/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -98,7 +98,7 @@ msgctxt "#30201" msgid "Use channel handle instead of client id" -msgstr "Veuillez utiliser l'identifiant de la chaîne à la place de celui du client" +msgstr "Utiliser l'identifiant de la chaîne à la place de celui du client" msgctxt "#30202" msgid "Show information messages" @@ -106,7 +106,7 @@ msgctxt "#30203" msgid "Combine title and episode name for recordings" -msgstr "Combine Titre et nom de l' épisode por enregistrements" +msgstr "Combiner titre et nom de l'épisode pour les enregistrements" msgctxt "#30204" msgid "Group Recordings by Series" @@ -114,47 +114,47 @@ msgctxt "#32001" msgid "Connected to DVBLink Server '%s'" -msgstr "Connexion rétablie au serveur '%s'" +msgstr "Connexion au serveur DVBLink « %s » rétablie" msgctxt "#32002" msgid "Found '%d' channels" -msgstr "'%d' chaîne(s) trouvée(s)" +msgstr "« %s » chaîne(s) trouvée(s)" msgctxt "#32003" msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" -msgstr "Impossible de se connecter au serveur DVBLink '%s' (Erreur : %d)" +msgstr "Impossible de se connecter au serveur DVBLink « %s » (erreur : %d)." msgctxt "#32004" msgid "Could not get recordings (Error code : %d)" -msgstr "Impossible d'avoir les enregistrements (Erreur : %d)" +msgstr "Impossible d'obtenir les enregistrements (erreur : %d)." msgctxt "#32006" msgid "Could not get timers(Error code : %d)" -msgstr "Impossible d'avoir les programmations (Code erreur : %d)" +msgstr "Impossible d'obtenir les programmations (erreur : %d)." msgctxt "#32007" msgid "Found %d EPG timers" -msgstr "Trouvé %d programmations par le guide" +msgstr "Trouvé %d programmation(s) du guide" msgctxt "#32008" msgid "Found %d manual timers" -msgstr "Trouvé %d programmations manuelles" +msgstr "Trouvé %d programmation(s) manuelle(s)" msgctxt "#32009" msgid "Found %d recordings" -msgstr "Trouvé %d enregistrements" +msgstr "Trouvé %d enregistrement(s)" msgctxt "#32010" msgid "Could not get stream for channel %s (Error code : %d)" -msgstr "Impossible d'avoir le flux de la chaîne %s (Erreur : %d)" +msgstr "Impossible d'obtenir le flux de la chaîne %s (erreur : %d)." msgctxt "#32011" msgid "Series recording" -msgstr "Enregistrement de series" +msgstr "Enregistrement de séries" msgctxt "#32012" msgid "Record this episode only" -msgstr "Enregistre cet épisode seulement" +msgstr "Enregistrer cet épisode seulement" msgctxt "#32013" msgid "Record all episodes" @@ -162,15 +162,15 @@ msgctxt "#32014" msgid "Delete timer" -msgstr "Supprimer la minuterie" +msgstr "Supprimer la programmation" msgctxt "#32015" msgid "Delete this timer only" -msgstr "Supprimer cette minuterie seulement" +msgstr "Supprimer cette programmation seulement" msgctxt "#32016" msgid "Delete the entire series" -msgstr "Supprime la série entière" +msgstr "Supprimer la série entière" msgctxt "#32017" msgid "Margin before (minutes)" @@ -194,7 +194,7 @@ msgctxt "#32022" msgid "Default" -msgstr "Prédéfini" +msgstr "Par défaut" msgctxt "#32023" msgid "Keep all" @@ -202,8 +202,84 @@ msgctxt "#32024" msgid "Playback failed. Server does not support transcoding" -msgstr "Échec de lecture. Le serveur ne supporte pas le transcodage" +msgstr "Échec de lecture. Le serveur ne gère pas le transcodage." msgctxt "#32025" msgid "Do not group single recordings" msgstr "Ne pas regrouper les enregistrements uniques" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Conserver tous les enregistrements" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Conserver 1 enregistrement" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Conserver 2 enregistrements" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Conserver 3 enregistrements" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Conserver 4 enregistrements" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Conserver 5 enregistrements" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Conserver 6 enregistrements" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Conserver 7 enregistrements" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Conserver 10 enregistrements" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Enregistrer tous les épisodes" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Enregistrer seulement les nouveaux épisodes" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Programmation manuelle unique" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Programmation unique basée sur le guide TV" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Générée par programmation répétée" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Générée par programmation de séries d'enregistrement" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Générée par programmation répétée par mot-clé" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Programmation manuelle répétée" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Programmation de séries d'enregistrement" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Programmation répétée par mot-clé" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.gl_es/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.gl_es/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.gl_es/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.gl_es/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,46 @@ msgid "Delete the entire series" msgstr "Eliminar todas as series" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Marxe previo (minutos)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Marxe posterior (minutos)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Só novos episodios" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Difundir en calquera momento" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Nº de episodios a manter" + msgctxt "#32022" msgid "Default" msgstr "Predefinida" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Manter todo" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Fallou a reprodución. O servidor non soporta a transcodificación." + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Non agrupar gravacións soltas" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Gravar todos os episodios" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Gravar só novos episodios" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.he_il/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.he_il/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.he_il/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.he_il/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -46,7 +46,7 @@ msgctxt "#30100" msgid "Stream" -msgstr "זרימה" +msgstr "הזרמה" msgctxt "#30102" msgid "Enable transcoding" @@ -172,6 +172,82 @@ msgid "Delete the entire series" msgstr "מחיקת כל הסדרה" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "שוליים לפני (דקות)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "שוליים אחרי (דקות)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "פרקים חדשים בלבד" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "משודר בכל עת" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "מספר הפרקים להשאיר" + msgctxt "#32022" msgid "Default" msgstr "ברירת מחדל" + +msgctxt "#32023" +msgid "Keep all" +msgstr "השאר הכל" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "ניגון נכשל. השרת לא תומך בקידוד מחדש" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "אל תקבץ הקלטה יחידה" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "לשמור על כל ההקלטות" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "לשמור הקלטה אחת" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "לשמור 2 הקלטות" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "לשמור 3 הקלטות" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "לשמור 4 הקלטות" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "לשמור 5 הקלטות" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "לשמור 6 הקלטות" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "לשמור 7 הקלטות" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "לשמור 10 הקלטות" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "הקלטת כל הפרקים" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "להקליט רק פרקים חדשים" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.hr_hr/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.hr_hr/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.hr_hr/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.hr_hr/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,114 @@ msgid "Delete the entire series" msgstr "Obriši cijelu seriju" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Dodatno vrijeme početka snimanja (minute)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Dodatno vrijeme prije završetka snimanja (minute)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Samo nove epizode" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Emitiraj bilo kada" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Broj epizoda za zadržati" + msgctxt "#32022" msgid "Default" msgstr "Zadano" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Zadrži sve" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Neuspjela reprodukcija. Posužitelj ne podržava enkôdiranje" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Ne grupiraj jednostruke snimke" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Zadrži sve snimke" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Zadrži 1 snimku" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Zadrži 2 snimke" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Zadrži 3 snimke" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Zadrži 4 snimke" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Zadrži 5 snimki" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Zadrži 6 snimki" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Zadrži 7 snimki" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Zadrži 10 snimki" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Snimi sve epizode" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Snimi samo nove epizode" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Jedno ručno zakazno snimanje" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Jedno ručno EPG temeljeno zakazno snimanje" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Stvoreno ponavljajućim zakazanim snimanjem" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Stvoreno zakazanim snimanjem snimljenih serija" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Stvoreno ponavljajućom ključnom riječi zakazanim snimanjem" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Ponavljajuće ručno zakazano snimanje" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Zakazano snimanje snimljenih serija" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Ponavljajuće zakazano snimanje ključnom riječi" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.hu_hu/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.hu_hu/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.hu_hu/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.hu_hu/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Különálló felvételeket ne csoportosítsa" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Összes felvétel megtartása" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "1 felvétel megtartása" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "2 felvétel megtartása" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "3 felvétel megtartása" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "4 felvétel megtartása" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "5 felvétel megtartása" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "6 felvétel megtartása" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "7 felvétel megtartása" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "10 felvétel megtartása" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Minden epizód felvétele" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Csak az új epizódok rögzítése" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Egyszeri manuális időzítő" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Egyszeri EPG-alapú időzítő" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Generálva ismétlődő időzítő által" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Generálva sorozat időzítő által" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Generálva ismétlődő kulcsszó időzítő által" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Ismétlődő manuális időzítő" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Sorozat rögzítés időzítő" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Ismétlődő kulcsszó-alapú időzítő" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.id_id/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.id_id/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.id_id/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.id_id/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,42 @@ msgid "Delete the entire series" msgstr "Hapus semua seri" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Batas sebelum (menit)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Batas sesudah (menit) " + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Hanya episode baru" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Siarkan kapanpun" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Jumlah episode untuk disimpan" + msgctxt "#32022" msgid "Default" msgstr "Standar" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Simpan semua" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Playback gagal. Server tidak mendukung transcoding" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Jangan menggolongkan rekaman tunggal" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Rekam semua episode" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.is_is/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.is_is/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.is_is/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.is_is/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,42 @@ msgid "Delete the entire series" msgstr "Eyða fyrir alla þáttaröðina" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Bætt fyrir framan (mínútur)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Bætt fyrir aftan (mínútur)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Nýjir þættir aðeins" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Senda út hvenær sem er" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Fjöldi þátta sem á að geyma" + msgctxt "#32022" msgid "Default" msgstr "Sjálfgefið" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Halda öllum" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Mistólst að spila. Miðlari styður ekki umkóðun" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Ekki setja í hóp einstakar upptökur" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Taka upp allar þáttaraðir" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.it_it/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.it_it/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.it_it/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.it_it/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,11 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Non raggruppare le registrazioni singole" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Registra tutti gli episodi" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Registra solo nuovi episodi" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ja_jp/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ja_jp/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ja_jp/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ja_jp/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -175,3 +175,11 @@ msgctxt "#32022" msgid "Default" msgstr "デフォルト" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "すべての回を録画する" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "新しい話(回)のみ録画" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ko_kr/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ko_kr/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ko_kr/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ko_kr/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -175,3 +175,11 @@ msgctxt "#32022" msgid "Default" msgstr "보통" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "모든 에피소드 녹화" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "새 에피소드만 녹화" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.lt_lt/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.lt_lt/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.lt_lt/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.lt_lt/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Negrupuoti pavienių įrašymų" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Išsaugoti visus įrašus" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Išsaugoti 1 įrašą" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Išsaugoti 2 įrašus" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Išsaugoti 3 įrašus" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Išsaugoti 4 įrašus" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Išsaugoti 5 įrašus" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Išsaugoti 6 įrašus" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Išsaugoti 7 įrašus" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Išsaugoti 10 įrašų" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Įrašyti visus epizodus" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Įrašyti tik naujus epizodus" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Vieno vaizdo rankinis laikmatis" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Vieno vaizdo EPG laikmatis" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Generuojamas kartojant laikmatis" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Gaunamas įrašų eilučių laikmatis" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Generuojamas kartojant raktažodžių laikmatis" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Pasikartojantis rankinis laikmatis" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Įrašo eilučių laikmatis" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Pasikartojantis raktažodžių laikmatis" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.lv_lv/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.lv_lv/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.lv_lv/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.lv_lv/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -175,3 +175,7 @@ msgctxt "#32022" msgid "Default" msgstr "Noklusējums" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Ierakstīt visas sērijas" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.mk_mk/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.mk_mk/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.mk_mk/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.mk_mk/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -175,3 +175,7 @@ msgctxt "#32022" msgid "Default" msgstr "Подразбирачко" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Сними ги сите епизоди" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ms_my/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ms_my/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ms_my/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ms_my/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -66,7 +66,7 @@ msgctxt "#30106" msgid "Audio track" -msgstr "Runut audio" +msgstr "Trek audio" msgctxt "#30107" msgid "HTTP" @@ -102,7 +102,7 @@ msgctxt "#30202" msgid "Show information messages" -msgstr "Papar mesej maklumat" +msgstr "Tunjuk mesej maklumat" msgctxt "#30203" msgid "Combine title and episode name for recordings" @@ -110,7 +110,7 @@ msgctxt "#30204" msgid "Group Recordings by Series" -msgstr "Rakaman Kumpulan mengikut Siri" +msgstr "Rakaman Berkumpulan mengikut Siri" msgctxt "#32001" msgid "Connected to DVBLink Server '%s'" @@ -118,15 +118,15 @@ msgctxt "#32002" msgid "Found '%d' channels" -msgstr "Jumpa '%d' saluran" +msgstr "Temui '%d' saluran" msgctxt "#32003" msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" -msgstr "Tidak dapat bersambung ke Pelayan DVBLink '%s' (Kod ralat : %d)" +msgstr "Tidak dapat sambung ke Pelayan DVBLink '%s' (Kod ralat : %d)" msgctxt "#32004" msgid "Could not get recordings (Error code : %d)" -msgstr "Tidak dapat rakaman (Kod ralat : %d)" +msgstr "Tidak dapat rakam (Kod ralat : %d)" msgctxt "#32006" msgid "Could not get timers(Error code : %d)" @@ -134,15 +134,15 @@ msgctxt "#32007" msgid "Found %d EPG timers" -msgstr "Jumpa %d pemasa EPG" +msgstr "Temui %d pemasa EPG" msgctxt "#32008" msgid "Found %d manual timers" -msgstr "Jumpa %d pemasa manual" +msgstr "Temui %d pemasa manual" msgctxt "#32009" msgid "Found %d recordings" -msgstr "Jumpa %d rakaman" +msgstr "Temui %d rakaman" msgctxt "#32010" msgid "Could not get stream for channel %s (Error code : %d)" @@ -158,7 +158,7 @@ msgctxt "#32013" msgid "Record all episodes" -msgstr "Rakam semu episod" +msgstr "Rakam semua episod" msgctxt "#32014" msgid "Delete timer" @@ -172,6 +172,42 @@ msgid "Delete the entire series" msgstr "Padam keseluruhan siri" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Margin sebelum (minit)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Margin selepas (minit)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Episod baharu sahaja" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Siar bila-bila masa" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Bilangan episod hendak disimpan" + msgctxt "#32022" msgid "Default" msgstr "Lalai" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Simpan semua" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Main balik gagal. Pelayan tidak menyokong transkod." + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Jangan kelompokkan rakaman tunggal" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Rakam semua episod" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.mt_mt/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.mt_mt/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.mt_mt/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.mt_mt/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -20,6 +20,22 @@ msgid "General" msgstr "Ġenerali" +msgctxt "#30001" +msgid "Server Address" +msgstr "Indirizz Tas-Server" + +msgctxt "#30002" +msgid "Server Port" +msgstr "Port Tas-Server" + +msgctxt "#30003" +msgid "Client name" +msgstr "Isem tal-klijent" + +msgctxt "#30004" +msgid "Connection timeout (s)" +msgstr "Konessjoni skadilha l-ħin (s)" + msgctxt "#30005" msgid "Username" msgstr "Username" @@ -28,14 +44,170 @@ msgid "Password" msgstr "Sigriet" +msgctxt "#30100" +msgid "Stream" +msgstr "Stream" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Attiva t-transcoding" + +msgctxt "#30103" +msgid "Height" +msgstr "Għoli" + +msgctxt "#30104" +msgid "Width" +msgstr "Wisgħa" + msgctxt "#30105" msgid "Bitrate" msgstr "Bit Rate" +msgctxt "#30106" +msgid "Audio track" +msgstr "Diska tal-awdjo" + +msgctxt "#30107" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30108" +msgid "RTP" +msgstr "RTP" + +msgctxt "#30109" +msgid "HLS" +msgstr "HLS" + +msgctxt "#30110" +msgid "ASF" +msgstr "ASF" + +msgctxt "#30111" +msgid "Enable Timeshift" +msgstr "Attiva T-Timeshift" + +msgctxt "#30112" +msgid "Timeshift buffer path" +msgstr "Il-Buffer path tat-timeshift" + msgctxt "#30200" msgid "Advanced" msgstr "Avvanzat" +msgctxt "#30201" +msgid "Use channel handle instead of client id" +msgstr "Uża l-handle tal-istazzjon minnflok l-id tal-klijent" + +msgctxt "#30202" +msgid "Show information messages" +msgstr "Uri messaġġi ta' informazzjoni" + +msgctxt "#30203" +msgid "Combine title and episode name for recordings" +msgstr "Għaqqad it-titlu u l-isem tal-episodju mir-rekordings" + +msgctxt "#30204" +msgid "Group Recordings by Series" +msgstr "Għaqqad ir-rekordings fi gruppi skond is-serje" + +msgctxt "#32001" +msgid "Connected to DVBLink Server '%s'" +msgstr "Konness mas- server DVBLink '%s'" + +msgctxt "#32002" +msgid "Found '%d' channels" +msgstr "Instabu '%d' stazzjonijiet" + +msgctxt "#32003" +msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" +msgstr "Ma setax jaqbad mas-server DVBLink '%s' (Kodiċi tal-iżball : %d)" + +msgctxt "#32004" +msgid "Could not get recordings (Error code : %d)" +msgstr "Ma setgħux jinġibdu r-rekordings (Kodiċi tal-iżball : %d)" + +msgctxt "#32006" +msgid "Could not get timers(Error code : %d)" +msgstr "Ma setgħux jinstabu l-arloġġi (Kodiċi tal-iżball : %d)" + +msgctxt "#32007" +msgid "Found %d EPG timers" +msgstr "Instabu %d arloġġi tal-EPG" + +msgctxt "#32008" +msgid "Found %d manual timers" +msgstr "Instabu %d arloġġi manwali" + +msgctxt "#32009" +msgid "Found %d recordings" +msgstr "Instabu %d rekordings" + +msgctxt "#32010" +msgid "Could not get stream for channel %s (Error code : %d)" +msgstr "Ma setax jinstab stream għall-istazzjon %s (Kodiċi tal-iżball : %d)" + +msgctxt "#32011" +msgid "Series recording" +msgstr "Irrekordjar tas-serje" + +msgctxt "#32012" +msgid "Record this episode only" +msgstr "Irrekordja dan l-episodju biss" + +msgctxt "#32013" +msgid "Record all episodes" +msgstr "Irrekordja l-episodji kollha" + +msgctxt "#32014" +msgid "Delete timer" +msgstr "Ħassar arloġġ" + +msgctxt "#32015" +msgid "Delete this timer only" +msgstr "Ħassar dan l-arloġġ biss" + +msgctxt "#32016" +msgid "Delete the entire series" +msgstr "Ħassar is-serje kollha" + +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Spazju qabel (minuti)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Spazju wara (minuti)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Episodji ġodda biss" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Xandar f'kwalunkwe ħin" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "In-Numru t'episodji li għandhom jinżammu" + msgctxt "#32022" msgid "Default" msgstr "Difolt" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Żomm kollox" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Ma setax jindaqq. Is-server ma jiflaħx għat-transcoding" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Tgħaqqadx rekordings individwali fi gruppi" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Irrekordja l-episodji kollha" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.nb_no/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.nb_no/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.nb_no/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.nb_no/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,46 @@ msgid "Delete the entire series" msgstr "Slett hele serien" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Margin før (minutter)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Margin etter (minutter)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Kun nye episoder" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Kringkaste når som helst" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Antall episoder å beholde" + msgctxt "#32022" msgid "Default" msgstr "Standard" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Behold alle" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Avspilling feilet. Serveren støtter ikke transcoding" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Grupper ikke single opptak" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Ta opp alle episoder" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Ta kun opp nye episoder" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.nl_nl/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.nl_nl/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.nl_nl/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.nl_nl/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Groepeer enkele opnamen niet" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Behoudt alle opnamen" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Behoud 1 opname" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Behoud 2 opnamen" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "behoud 3 opnamen" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "behoud 4 opnamen" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Behoud 5 opnamen" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Behoud 6 opnamen" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Behoud 7 opnamen" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Behoud 10 opnamen" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Alle afleveringen opnemen" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Neem alleen nieuwe afleveringen op" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Enkele shot manuele timer" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Eenmalige EPG-gebaseerde timer" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Aangemaakt uit repeterende timer" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Aangemaakt uit serieopnametimer" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Aangemaakt uit repeterende trefwoordtimer" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Repeterende handmatige timer" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Serieopnametimer" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Repeterende trefwoordtimer" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.pl_pl/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.pl_pl/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.pl_pl/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.pl_pl/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -22,11 +22,11 @@ msgctxt "#30001" msgid "Server Address" -msgstr "Adres serwera" +msgstr "Nazwa lub adres serwera" msgctxt "#30002" msgid "Server Port" -msgstr "Port serwera" +msgstr "Numer portu" msgctxt "#30003" msgid "Client name" @@ -34,7 +34,7 @@ msgctxt "#30004" msgid "Connection timeout (s)" -msgstr "Limit czasu połączenia (s)" +msgstr "Limit czasu połączenia (sekundy)" msgctxt "#30005" msgid "Username" @@ -90,7 +90,7 @@ msgctxt "#30112" msgid "Timeshift buffer path" -msgstr "Ścieżka do pliku bufora" +msgstr "Ścieżka do folderu z plikiem przesunięcia czasowego" msgctxt "#30200" msgid "Advanced" @@ -106,7 +106,7 @@ msgctxt "#30203" msgid "Combine title and episode name for recordings" -msgstr "Scalaj tytuł i nazwę odcinka nagrań" +msgstr "Scalaj tytuł i nazwę nagranego odcinka" msgctxt "#30204" msgid "Group Recordings by Series" @@ -166,11 +166,11 @@ msgctxt "#32015" msgid "Delete this timer only" -msgstr "Usuń tylko te zadanie" +msgstr "Usuń tylko to zadanie" msgctxt "#32016" msgid "Delete the entire series" -msgstr "Usuń cały serial" +msgstr "Usuń całą serię" msgctxt "#32017" msgid "Margin before (minutes)" @@ -194,7 +194,7 @@ msgctxt "#32022" msgid "Default" -msgstr "Domyślna" +msgstr "Domyślnie" msgctxt "#32023" msgid "Keep all" @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Nie grupuj pojedynczych nagrań" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Zachowuj wszystkie nagrania" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Zachowuj 1 nagranie" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Zachowuj 2 nagrania" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Zachowuj 3 nagrania" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Zachowuj 4 nagrania" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Zachowuj 5 nagrań" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Zachowuj 6 nagrań" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Zachowuj 7 nagrań" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Zachowuj 10 nagrań" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Nagrywaj wszystkie odcinki" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Nagrywaj tylko nowe odcinki" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Jednorazowe zadanie manualne" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Jednorazowe zadanie wg przewodnika" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Wygenerowane przez zadanie cykliczne" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Wygenerowany przez zadanie nagrywania serii" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Wygenerowane przez zadanie cykliczne wg klucza" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Zadanie cykliczne dodane manualnie" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Zadanie nagrywania serii" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Zadanie cykliczne bazujące na kluczu" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.pt_br/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.pt_br/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.pt_br/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.pt_br/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,47 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Não agrupo gravações únicas" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Manter todas as gravações" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Manter 1 gravação" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Manter 2 gravações" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Manter 3 gravações" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Manter 4 gravações" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Manter 5 gravações" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Manter 6 gravações" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Manter 7 gravações" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Manter 10 gravações" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Gravar todos os episódios" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Gravar somente novos episódios" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.pt_pt/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.pt_pt/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.pt_pt/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.pt_pt/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -50,7 +50,7 @@ msgctxt "#30102" msgid "Enable transcoding" -msgstr "Activar transcodificação" +msgstr "Ativar transcodificação" msgctxt "#30103" msgid "Height" @@ -62,7 +62,7 @@ msgctxt "#30105" msgid "Bitrate" -msgstr "Bitrate" +msgstr "Taxa de dados" msgctxt "#30106" msgid "Audio track" @@ -86,11 +86,11 @@ msgctxt "#30111" msgid "Enable Timeshift" -msgstr "Activar Ver Mais Tarde" +msgstr "Ativar Ver mais tarde" msgctxt "#30112" msgid "Timeshift buffer path" -msgstr "Localização do buffer de Ver Mais Tarde" +msgstr "Caminho do buffer para Ver mais tarde" msgctxt "#30200" msgid "Advanced" @@ -98,7 +98,7 @@ msgctxt "#30201" msgid "Use channel handle instead of client id" -msgstr "Usar expressão do canal em vez do id do cliente" +msgstr "Utilizar manípulo de canal em vez da ID do cliente" msgctxt "#30202" msgid "Show information messages" @@ -114,35 +114,35 @@ msgctxt "#32001" msgid "Connected to DVBLink Server '%s'" -msgstr "Ligado ao Servidor DVBLink '%s'" +msgstr "Ligado ao servidor DVBLink '%s'" msgctxt "#32002" msgid "Found '%d' channels" -msgstr "Foram encontrados '%d' canais" +msgstr "Encontrados '%d' canais" msgctxt "#32003" msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" -msgstr "Não foi possível ligar ao Servidor DVBLink '%s' (Código de erro: %d)" +msgstr "Não foi possível ligar ao servidor DVBLink '%s' (Código de erro: %d)" msgctxt "#32004" msgid "Could not get recordings (Error code : %d)" -msgstr "Não foi possível obter gravações (Código de erro: %d)" +msgstr "Não foi possível obter as gravações (Código de erro: %d)" msgctxt "#32006" msgid "Could not get timers(Error code : %d)" -msgstr "Não foi possível obter temporizadores (Código de erro: %d)" +msgstr "Não foi possível obter os temporizadores (Código de erro: %d)" msgctxt "#32007" msgid "Found %d EPG timers" -msgstr "Foram encontrados %d temporizadores EPG" +msgstr "Encontrados %d temporizadores EPG" msgctxt "#32008" msgid "Found %d manual timers" -msgstr "Foram encontrados %d temporizadores manuais" +msgstr "Encontrados %d temporizadores manuais" msgctxt "#32009" msgid "Found %d recordings" -msgstr "Foram encontradas %d gravações" +msgstr "Encontradas %d gravações" msgctxt "#32010" msgid "Could not get stream for channel %s (Error code : %d)" @@ -150,11 +150,11 @@ msgctxt "#32011" msgid "Series recording" -msgstr "Gravação de series" +msgstr "Gravação de séries" msgctxt "#32012" msgid "Record this episode only" -msgstr "Gravar apenas este episódi" +msgstr "Gravar apenas este episódio" msgctxt "#32013" msgid "Record all episodes" @@ -172,10 +172,22 @@ msgid "Delete the entire series" msgstr "Apagar toda a série" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Margem antes (minutos)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Margem depois (minutos)" + msgctxt "#32019" msgid "New episodes only" msgstr "Apenas novos episódios" +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Emitir em qualquer altura" + msgctxt "#32021" msgid "Number of episodes to keep" msgstr "Número de episódios a manter" @@ -187,3 +199,55 @@ msgctxt "#32023" msgid "Keep all" msgstr "Manter todos" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Falha de reprodução. O servidor não suporta transcodificação." + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Não agrupar registos únicos" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Manter todas as gravações" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Manter 1 gravação" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Manter 2 gravações" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Manter 3 gravações" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Manter 4 gravações" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Manter 5 gravações" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Manter 6 gravações" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Manter 7 gravações" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Manter 10 gravações" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Gravar todos os episódios" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Gravar apenas novos episódios" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ro_ro/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ro_ro/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ro_ro/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ro_ro/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -104,6 +104,14 @@ msgid "Show information messages" msgstr "Afișează mesaje de informare" +msgctxt "#30203" +msgid "Combine title and episode name for recordings" +msgstr "Combină titlul și numele episodului pentru înregistrări" + +msgctxt "#30204" +msgid "Group Recordings by Series" +msgstr "Grupează înregistrările după serii" + msgctxt "#32001" msgid "Connected to DVBLink Server '%s'" msgstr "Conectat la serverul DVBLink '%s'" @@ -140,6 +148,10 @@ msgid "Could not get stream for channel %s (Error code : %d)" msgstr "Nu s-a putut obține fluxul pentru canalul %s (cod de eroare: %d)" +msgctxt "#32011" +msgid "Series recording" +msgstr "Înregistrare serie" + msgctxt "#32012" msgid "Record this episode only" msgstr "Înregistrează doar acest episod" @@ -152,14 +164,34 @@ msgid "Delete timer" msgstr "Șterge cronometru" +msgctxt "#32015" +msgid "Delete this timer only" +msgstr "Șterge doar acest cronometru" + msgctxt "#32016" msgid "Delete the entire series" msgstr "Șterge toată seria" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Margine înainte (minute)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Margin după (minute)" + msgctxt "#32019" msgid "New episodes only" msgstr "Doar episoadele noi" +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Difuzează oricând" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Număr de episoade de păstrat" + msgctxt "#32022" msgid "Default" msgstr "Standard" @@ -171,3 +203,83 @@ msgctxt "#32024" msgid "Playback failed. Server does not support transcoding" msgstr "Redarea a eșuat. Server-ul nu suportă transcodarea" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Nu grupa înregistrările singulare" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Păstrează toate înregistrările" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Păstrează 1 înregistrare" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Păstrează 2 înregistrări" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Păstrează 3 înregistrări" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Păstrează 4 înregistrări" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Păstrează 5 înregistrări" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Păstrează 6 înregistrări" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Păstrează 7 înregistrări" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Păstrează 10 înregistrări" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Înregistrează toate episoadele" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Înregistrează doar noile episoade" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Cronometru manual cu o singură declanșare" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Cronometru bazat pe ghidul electronic cu o singură declanșare" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Generat de cronometru repetant" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Generat de cronometru înregistrare serie" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Generat de cronometru cuvânt cheie repetant" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Cronometru manual repetant" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Cronometru înregistrare serii" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Cronometru bazat pe cuvinte cheie repetant" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ru_ru/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ru_ru/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.ru_ru/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.ru_ru/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Не группировать одиночные записи" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Сохранять все записи" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Сохранять 1 запись" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Сохранять 2 записи" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Сохранять 3 записи" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Сохранять 4 записи" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Сохранять 5 записей" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Сохранять 6 записей" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Сохранять 7 записей" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Сохранять 10 записей" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Запись всех эпизодов" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Записывать только новые серии" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Одноразовый ручной таймер" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Одноразовый таймер на основе EPG" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Создано повторяющимся таймером" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Создано таймером записи серий" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Создано повторяющимся таймером по ключевому слову" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Ручной повторяющийся таймер" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Таймер записи серий" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Повторяющийся таймер по ключевому слову" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sk_sk/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sk_sk/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sk_sk/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sk_sk/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -172,6 +172,46 @@ msgid "Delete the entire series" msgstr "Odstrániť časovač pre celú sériu" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Začať nahrávanie pred začiatkom (minúty)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Skončiť nahrávanie po skončení (minúty)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Len nové epizódy" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Vysielanie kedykoľvek" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Počet epizód, ktoré sa majú ponechať" + msgctxt "#32022" msgid "Default" msgstr "Štandardná" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Ponechať všetko" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Prehrávanie zlyhalo. Server nepodporuje zmenu kódovania." + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Nezoskupovať samostatné nahrávky" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Nahrať všetky epizódy" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Nahrať len nové epizódy" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sl_si/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sl_si/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sl_si/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sl_si/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -176,6 +176,10 @@ msgid "New episodes only" msgstr "Samo nove epizode" +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Oddajaj kadarkoli" + msgctxt "#32021" msgid "Number of episodes to keep" msgstr "Število epizod za hrambo" @@ -195,3 +199,11 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Ne združuj posameznih posnetkov" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Posnemi vse epizode" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Snemaj le nove epizode" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sr_rs/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sr_rs/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sr_rs/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sr_rs/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -20,6 +20,22 @@ msgid "General" msgstr "Опште" +msgctxt "#30001" +msgid "Server Address" +msgstr "Адреса Сервера" + +msgctxt "#30002" +msgid "Server Port" +msgstr "Порт Сервера" + +msgctxt "#30003" +msgid "Client name" +msgstr "Име клијента" + +msgctxt "#30004" +msgid "Connection timeout (s)" +msgstr "Истек времена за повезивање (с)" + msgctxt "#30005" msgid "Username" msgstr "Корисничко име" @@ -32,18 +48,238 @@ msgid "Stream" msgstr "Запис" +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Омогући прекодирање" + +msgctxt "#30103" +msgid "Height" +msgstr "Висина" + +msgctxt "#30104" +msgid "Width" +msgstr "Ширина" + msgctxt "#30105" msgid "Bitrate" -msgstr "Брзина протока" +msgstr "Стопа бита" + +msgctxt "#30106" +msgid "Audio track" +msgstr "Аудио нумера" + +msgctxt "#30107" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30108" +msgid "RTP" +msgstr "RTP" + +msgctxt "#30109" +msgid "HLS" +msgstr "HLS" + +msgctxt "#30110" +msgid "ASF" +msgstr "ASF" + +msgctxt "#30111" +msgid "Enable Timeshift" +msgstr "Омогући померај времена" + +msgctxt "#30112" +msgid "Timeshift buffer path" +msgstr "Путања међумеморије помераја времена" msgctxt "#30200" msgid "Advanced" -msgstr "Напредни" +msgstr "Напредно" + +msgctxt "#30201" +msgid "Use channel handle instead of client id" +msgstr "Користи држач канала уместо id клијента" + +msgctxt "#30202" +msgid "Show information messages" +msgstr "Прикажи информационе поруке" + +msgctxt "#30203" +msgid "Combine title and episode name for recordings" +msgstr "Споји назив и име епизоде за снимања" + +msgctxt "#30204" +msgid "Group Recordings by Series" +msgstr "Групиши снимке по Серији" + +msgctxt "#32001" +msgid "Connected to DVBLink Server '%s'" +msgstr "Повезано са DVBLink Сервером '%s'" + +msgctxt "#32002" +msgid "Found '%d' channels" +msgstr "Пронађено '%d' канала" + +msgctxt "#32003" +msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" +msgstr "Није могуће повезивање са DVBLink Сервером '%s' (Шифра грешке : %d)" + +msgctxt "#32004" +msgid "Could not get recordings (Error code : %d)" +msgstr "Није могуће преузети снимке (Шифра грешке : %d)" + +msgctxt "#32006" +msgid "Could not get timers(Error code : %d)" +msgstr "Није могуће преузети тајмере (Шифра грешке : %d)" + +msgctxt "#32007" +msgid "Found %d EPG timers" +msgstr "Пронађено %d EPG тајмера" + +msgctxt "#32008" +msgid "Found %d manual timers" +msgstr "Пронађено %d ручних тајмера" + +msgctxt "#32009" +msgid "Found %d recordings" +msgstr "Пронађено %d снимака" + +msgctxt "#32010" +msgid "Could not get stream for channel %s (Error code : %d)" +msgstr "Није могуће преузети запис за канал %s (Шифра грешке : %d)" + +msgctxt "#32011" +msgid "Series recording" +msgstr "Снимање серије" + +msgctxt "#32012" +msgid "Record this episode only" +msgstr "Сними само ову епизоду" + +msgctxt "#32013" +msgid "Record all episodes" +msgstr "Сними све епизоде" + +msgctxt "#32014" +msgid "Delete timer" +msgstr "Избриши тајмер" + +msgctxt "#32015" +msgid "Delete this timer only" +msgstr "Избриши само овај тајмер" msgctxt "#32016" msgid "Delete the entire series" -msgstr "Обриши целу серију" +msgstr "Избриши целу серију" + +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Маргина пре (минута)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Маргина после (минута)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Само нове епизоде" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Емитовање било када" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Број епизода за чување" msgctxt "#32022" msgid "Default" msgstr "Подразумевано" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Задржи све" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Неуспела репродукција. Сервер не подржава прекодирање" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Не групиши појединачне снимке" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Задржи све снимке" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Задржи 1 снимак" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Задржи 2 снимка" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Задржи 3 снимка" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Задржи 4 снимка" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Задржи 5 снимака" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Задржи 6 снимака" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Задржи 7 снимака" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Задржи 10 снимака" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Сними све епизоде" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Сними само нове епизоде" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Ручни тајмер једног снимања" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Тајмер једног снимања заснован на EPG" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Генерисано од стране понављајућег тајмера" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Генерисано од стране тајмера за снимање серија" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Генерисано од стране понављајућег тајмера кључних речи" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Понављајући ручни тајмер" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Тајмер за снимање серија" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Понављајући тајмер заснован на кључним речима" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sr_rs@latin/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sr_rs@latin/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sr_rs@latin/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sr_rs@latin/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -20,6 +20,22 @@ msgid "General" msgstr "Opšte" +msgctxt "#30001" +msgid "Server Address" +msgstr "Adresa Servera" + +msgctxt "#30002" +msgid "Server Port" +msgstr "Port Servera" + +msgctxt "#30003" +msgid "Client name" +msgstr "Ime klijenta" + +msgctxt "#30004" +msgid "Connection timeout (s)" +msgstr "Istek vremena za povezivanje" + msgctxt "#30005" msgid "Username" msgstr "Korisničko ime" @@ -32,26 +48,238 @@ msgid "Stream" msgstr "Zapis" +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Omogući prekodiranje" + +msgctxt "#30103" +msgid "Height" +msgstr "Visina" + +msgctxt "#30104" +msgid "Width" +msgstr "Širina" + msgctxt "#30105" msgid "Bitrate" -msgstr "Brzina protoka" +msgstr "Stopa bita" + +msgctxt "#30106" +msgid "Audio track" +msgstr "Audio numera" msgctxt "#30107" msgid "HTTP" msgstr "HTTP" +msgctxt "#30108" +msgid "RTP" +msgstr "RTP" + +msgctxt "#30109" +msgid "HLS" +msgstr "HLS" + +msgctxt "#30110" +msgid "ASF" +msgstr "ASF" + msgctxt "#30111" msgid "Enable Timeshift" -msgstr "Омогући временски помак" +msgstr "Omogući pomeraj vremena" msgctxt "#30112" msgid "Timeshift buffer path" -msgstr "Путања до међумеморије временског помака" +msgstr "Putanja međumemorije pomeraja vremena" msgctxt "#30200" msgid "Advanced" msgstr "Napredno" +msgctxt "#30201" +msgid "Use channel handle instead of client id" +msgstr "Koristi držač kanala umesto id klijenta" + +msgctxt "#30202" +msgid "Show information messages" +msgstr "Prikaži informacione poruke" + +msgctxt "#30203" +msgid "Combine title and episode name for recordings" +msgstr "Spoji naziv i ime epizode za snimanja" + +msgctxt "#30204" +msgid "Group Recordings by Series" +msgstr "Grupiši snimke po Seriji" + +msgctxt "#32001" +msgid "Connected to DVBLink Server '%s'" +msgstr "Povezano sa DVBLink Serverom '%s'" + +msgctxt "#32002" +msgid "Found '%d' channels" +msgstr "Pronađeno '%d' kanala" + +msgctxt "#32003" +msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" +msgstr "Nije moguće povezivanje sa DVBLink Serverom '%s' (Šifra greške : %d)" + +msgctxt "#32004" +msgid "Could not get recordings (Error code : %d)" +msgstr "Nije moguće preuzeti snimke (Šifra greške : %d)" + +msgctxt "#32006" +msgid "Could not get timers(Error code : %d)" +msgstr "Nije moguće preuzeti tajmere (Šifra greške : %d)" + +msgctxt "#32007" +msgid "Found %d EPG timers" +msgstr "Pronađeno %d EPG tajmera" + +msgctxt "#32008" +msgid "Found %d manual timers" +msgstr "Pronađeno %d ručnih tajmera" + +msgctxt "#32009" +msgid "Found %d recordings" +msgstr "Pronađeno %d snimaka" + +msgctxt "#32010" +msgid "Could not get stream for channel %s (Error code : %d)" +msgstr "Nije moguće preuzeti zapis za kanal %s (Šifra greške : %d)" + +msgctxt "#32011" +msgid "Series recording" +msgstr "Snimanje serije" + +msgctxt "#32012" +msgid "Record this episode only" +msgstr "Snimi samo ovu epizodu" + +msgctxt "#32013" +msgid "Record all episodes" +msgstr "Snimi sve epizode" + +msgctxt "#32014" +msgid "Delete timer" +msgstr "Izbriši tajmer" + +msgctxt "#32015" +msgid "Delete this timer only" +msgstr "Izbriši samo ovaj tajmer" + +msgctxt "#32016" +msgid "Delete the entire series" +msgstr "Izbriši celu seriju" + +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Margina pre (minuta)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Margina posle (minuta)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Samo nove epizode" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Emitovanje bilo kada" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Broj epizoda za čuvanje" + msgctxt "#32022" msgid "Default" msgstr "Podrazumevano" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Zadrži sve" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Neuspela reprodukcija. Server ne podržava prekodiranje" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Ne grupiši pojedinačne snimke" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Zadrži sve snimke" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Zadrži 1 snimak" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Zadrži 2 snimka" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Zadrži 3 snimka" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Zadrži 4 snimka" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Zadrži 5 snimaka" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Zadrži 6 snimaka" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Zadrži 7 snimaka" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Zadrži 10 snimaka" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Snimi sve epizode" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Snimi samo nove epizode" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "Ručni tajmer jednog snimanja" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "Tajmer jednog snimanja zasnovan na EPG" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "Generisano od strane ponavljajućeg tajmera" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "Generisano od strane tajmera za snimanje serija" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "Generisano od strane ponavljajućeg tajmera ključnih reči" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "Ponavljajući ručni tajmer" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "Tajmer za snimanje serija" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "Ponavljajući tajmer zasnovan na ključnim rečima" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sv_se/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sv_se/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.sv_se/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.sv_se/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,47 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "Gruppera inte ensamma inspelningar" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "Behåll alla inspelningar" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "Behåll 1 inspelning" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "Behåll 2 inspelningar" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "Behåll 3 inspelningar" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "Behåll 4 inspelningar" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "Behåll 5 inspelningar" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "Behåll 6 inspelningar" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "Behåll 7 inspelningar" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "Behåll 10 inspelningar" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Spela in alla episoder" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Spela bara in nya avsnitt" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.th_th/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.th_th/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.th_th/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.th_th/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -44,6 +44,10 @@ msgid "Advanced" msgstr "ขั้นสูง" +msgctxt "#32013" +msgid "Record all episodes" +msgstr "บันทึกทุกตอน" + msgctxt "#32014" msgid "Delete timer" msgstr "ลบการตั้งเวลา" @@ -51,3 +55,11 @@ msgctxt "#32022" msgid "Default" msgstr "ค่าพื้นฐาน" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "บันทึกทุกตอน" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "บันทึกเฉพาะตอนใหม่" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.tr_tr/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.tr_tr/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.tr_tr/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.tr_tr/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -90,7 +90,7 @@ msgctxt "#30112" msgid "Timeshift buffer path" -msgstr "Zaman Kaydırma tampon bellek yolu" +msgstr "Zaman kaydırma arabellek yolu" msgctxt "#30200" msgid "Advanced" @@ -110,19 +110,19 @@ msgctxt "#30204" msgid "Group Recordings by Series" -msgstr "Kayıtları Diziye Göre Grupla" +msgstr "Kayıtları Dizilere Göre Grupla" msgctxt "#32001" msgid "Connected to DVBLink Server '%s'" -msgstr "DVBLink Sunucusu '%s' ile bağlandı" +msgstr "'%s' DVBLink Sunucusuna bağlandı" msgctxt "#32002" msgid "Found '%d' channels" -msgstr "\"%d\" kanalları bulundu" +msgstr "'%d' kanal bulundu" msgctxt "#32003" msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" -msgstr "DVBLink Sunucusu '%s' bağlantısı yapılamadı (Hata kodu: %d)" +msgstr "'%s' DVBLink Sunucusuna bağlanılamadı (Hata kodu: %d)" msgctxt "#32004" msgid "Could not get recordings (Error code : %d)" @@ -138,7 +138,7 @@ msgctxt "#32008" msgid "Found %d manual timers" -msgstr "%d manuel zamanlayıcı bulundu" +msgstr "El ile ayarlanan %d zamanlayıcı bulundu" msgctxt "#32009" msgid "Found %d recordings" @@ -162,7 +162,7 @@ msgctxt "#32014" msgid "Delete timer" -msgstr "Zamanlayıcı sil" +msgstr "Zamanlayıcıyı sil" msgctxt "#32015" msgid "Delete this timer only" @@ -170,7 +170,7 @@ msgctxt "#32016" msgid "Delete the entire series" -msgstr "Tüm seriyi sil" +msgstr "Tüm dizileri sil" msgctxt "#32017" msgid "Margin before (minutes)" @@ -188,6 +188,26 @@ msgid "Broadcast anytime" msgstr "Her zaman yayın" +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Saklanacak bölüm sayısı" + msgctxt "#32022" msgid "Default" msgstr "Varsayılan" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Hepsini sakla" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Tek kayıtları gruplama" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Tüm bölümleri kaydet" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Sadece yeni bölümleri kaydet" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.uk_ua/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.uk_ua/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.uk_ua/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.uk_ua/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -34,7 +34,7 @@ msgctxt "#30004" msgid "Connection timeout (s)" -msgstr "Затримка зв’язку (с) " +msgstr "Затримка зв’язку (сек) " msgctxt "#30005" msgid "Username" @@ -50,7 +50,7 @@ msgctxt "#30102" msgid "Enable transcoding" -msgstr "Включити конвертування" +msgstr "Увімкнути конвертування" msgctxt "#30103" msgid "Height" @@ -72,14 +72,94 @@ msgid "HTTP" msgstr "HTTP" +msgctxt "#30108" +msgid "RTP" +msgstr "RTP" + +msgctxt "#30109" +msgid "HLS" +msgstr "HLS" + +msgctxt "#30110" +msgid "ASF" +msgstr "ASF" + +msgctxt "#30111" +msgid "Enable Timeshift" +msgstr "Увімкнути зсув у часі" + +msgctxt "#30112" +msgid "Timeshift buffer path" +msgstr "Шлях до буферу зсуву у часі" + msgctxt "#30200" msgid "Advanced" -msgstr "Більше" +msgstr "Додатково" + +msgctxt "#30201" +msgid "Use channel handle instead of client id" +msgstr "Використовувати мітку каналу замість ID клієнта" + +msgctxt "#30202" +msgid "Show information messages" +msgstr "Показати інформаційне повідомлення" + +msgctxt "#30203" +msgid "Combine title and episode name for recordings" +msgstr "Комбінувати назву та ім'я епізоду у записах" + +msgctxt "#30204" +msgid "Group Recordings by Series" +msgstr "Групувати записи за серіалами" + +msgctxt "#32001" +msgid "Connected to DVBLink Server '%s'" +msgstr "З'єднання з сервером DVBLink '%s'" + +msgctxt "#32002" +msgid "Found '%d' channels" +msgstr "Знайдено каналів: '%d'" + +msgctxt "#32003" +msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" +msgstr "Не вдалося з'єднатися з сервером DVBLink '%s' (Код помилки : %d)" + +msgctxt "#32004" +msgid "Could not get recordings (Error code : %d)" +msgstr "Не вдалося отримати записи (Код помилки: %d)" + +msgctxt "#32006" +msgid "Could not get timers(Error code : %d)" +msgstr "Не вдалося отримати таймери (Код помилки: %d)" + +msgctxt "#32007" +msgid "Found %d EPG timers" +msgstr "Знайдено таймерів EPG: %d " + +msgctxt "#32008" +msgid "Found %d manual timers" +msgstr "Знайдено ручних таймерів: %d" + +msgctxt "#32009" +msgid "Found %d recordings" +msgstr "Знайдено записів: %d" + +msgctxt "#32010" +msgid "Could not get stream for channel %s (Error code : %d)" +msgstr "Не вдалося отримати потік каналу %s (Код помилки: %d)" + +msgctxt "#32011" +msgid "Series recording" +msgstr "Запис серіалів" msgctxt "#32012" msgid "Record this episode only" msgstr "Записати тільки цю серію" +msgctxt "#32013" +msgid "Record all episodes" +msgstr "Записати усі серії" + msgctxt "#32014" msgid "Delete timer" msgstr "Видалити таймер" @@ -92,6 +172,46 @@ msgid "Delete the entire series" msgstr "Видалити весь серіал" +msgctxt "#32017" +msgid "Margin before (minutes)" +msgstr "Маржа перед (хв)" + +msgctxt "#32018" +msgid "Margin after (minutes)" +msgstr "Маржа після (хв)" + +msgctxt "#32019" +msgid "New episodes only" +msgstr "Тільки нові серії" + +msgctxt "#32020" +msgid "Broadcast anytime" +msgstr "Трансляція в будь-який час" + +msgctxt "#32021" +msgid "Number of episodes to keep" +msgstr "Кількість серій для збереження" + msgctxt "#32022" msgid "Default" -msgstr "За промовчанням" +msgstr "Як усталено" + +msgctxt "#32023" +msgid "Keep all" +msgstr "Залишити всі" + +msgctxt "#32024" +msgid "Playback failed. Server does not support transcoding" +msgstr "Не вдалося відтворити. Сервер не підтримує перекодування" + +msgctxt "#32025" +msgid "Do not group single recordings" +msgstr "Не групувати окремі записи" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "Записати усі серії" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "Записувати лише нові серії" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.zh_cn/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.zh_cn/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.zh_cn/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.zh_cn/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -207,3 +207,79 @@ msgctxt "#32025" msgid "Do not group single recordings" msgstr "单个录像不分组" + +msgctxt "#32026" +msgid "Keep all recordings" +msgstr "保留全部录像" + +msgctxt "#32027" +msgid "Keep 1 recording" +msgstr "保留 1 录像" + +msgctxt "#32028" +msgid "Keep 2 recordings" +msgstr "保留 2 录像" + +msgctxt "#32029" +msgid "Keep 3 recordings" +msgstr "保留 3 录像" + +msgctxt "#32030" +msgid "Keep 4 recordings" +msgstr "保留 4 录像" + +msgctxt "#32031" +msgid "Keep 5 recordings" +msgstr "保留 5 录像" + +msgctxt "#32032" +msgid "Keep 6 recordings" +msgstr "保留 6 录像" + +msgctxt "#32033" +msgid "Keep 7 recordings" +msgstr "保留 7 录像" + +msgctxt "#32034" +msgid "Keep 10 recordings" +msgstr "保留 10 录像" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "录制所有分集" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "仅录制新剧集" + +msgctxt "#32037" +msgid "Single shot manual timer" +msgstr "单次人工定时器" + +msgctxt "#32038" +msgid "Single shot EPG-based timer" +msgstr "单次基于电子节目单定时器" + +msgctxt "#32039" +msgid "Generated by repeating timer" +msgstr "由重复定时器生成" + +msgctxt "#32040" +msgid "Generated by record series timer" +msgstr "由录像系列定时器生成" + +msgctxt "#32041" +msgid "Generated by repeating keyword timer" +msgstr "由重复关键字定时器生成" + +msgctxt "#32042" +msgid "Repeating manual timer" +msgstr "重复人工定时器" + +msgctxt "#32043" +msgid "Record series timer" +msgstr "录像系列定时器" + +msgctxt "#32044" +msgid "Repeating keyword-based timer" +msgstr "重复关键字定时器" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.zh_tw/strings.po kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.zh_tw/strings.po --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/language/resource.language.zh_tw/strings.po 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/language/resource.language.zh_tw/strings.po 2016-01-10 21:41:24.000000000 +0000 @@ -131,3 +131,11 @@ msgctxt "#32022" msgid "Default" msgstr "預設" + +msgctxt "#32035" +msgid "Record all episodes" +msgstr "記錄所有插曲" + +msgctxt "#32036" +msgid "Record only new episodes" +msgstr "僅錄製新番" diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/skins/skin.confluence/720p/DeleteTimer.xml kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/skins/skin.confluence/720p/DeleteTimer.xml --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/skins/skin.confluence/720p/DeleteTimer.xml 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/skins/skin.confluence/720p/DeleteTimer.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,139 +0,0 @@ - - 10 - - 1 - 240 - 100 - - dialogeffect - - - background image - 0 - 0 - 800 - 300 - DialogBack.png - - - Dialog Header image - 40 - 16 - 720 - 40 - dialogheader.png - - - header label - 40 - 20 - 720 - 30 - font13_title - - center - center - selected - black - - - Close Window button - 710 - 15 - 64 - 32 - - - - - DialogCloseButton-focus.png - DialogCloseButton.png - 10 - 10 - 10 - 10 - system.getbool(input.enablemouse) - - - - 40 - 100 - 720 - 100 - - episode recording - 0 - 0 - 40 - 720 - - font13 - grey2 - white - button-nofocus.png - button-focus2.png - 10 - 10 - 1 - 11 - - - - series recording - 0 - 45 - 40 - 720 - - font13 - grey2 - white - button-nofocus.png - button-focus2.png - 11 - 11 - 10 - 1 - - - - - 190 - 235 - - Ok Button - 0 - 0 - 200 - 40 - center - center - button-nofocus.png - button-focus.png - - font12_title - 11 - 2 - 2 - 10 - - - Cancel Button - 210 - 0 - 200 - 40 - center - center - button-nofocus.png - button-focus.png - - font12_title - 11 - 1 - 1 - 10 - - - - - diff -Nru kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/skins/skin.confluence/720p/RecordPrefs.xml kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/skins/skin.confluence/720p/RecordPrefs.xml --- kodi-pvr-dvblink-1.10.9/pvr.dvblink/resources/skins/skin.confluence/720p/RecordPrefs.xml 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/pvr.dvblink/resources/skins/skin.confluence/720p/RecordPrefs.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,235 +0,0 @@ - - 10 - - 1 - 240 - 100 - - dialogeffect - - - background image - 0 - 0 - 800 - 530 - DialogBack.png - - - Dialog Header image - 40 - 16 - 720 - 40 - dialogheader.png - - - header label - 40 - 20 - 720 - 30 - font13_title - - center - center - selected - black - - - Close Window button - 710 - 15 - 64 - 32 - - - - - DialogCloseButton-focus.png - DialogCloseButton.png - 10 - 10 - 10 - 10 - system.getbool(input.enablemouse) - - - - 40 - 100 - 720 - 360 - - episode recording - 0 - 0 - 40 - 720 - - font13 - grey2 - white - button-nofocus.png - button-focus2.png - 10 - 10 - 1 - 11 - - - - series recording - 0 - 45 - 40 - 720 - - font13 - grey2 - white - button-nofocus.png - button-focus2.png - 11 - 11 - 10 - 12 - - - - Separator - 0 - 95 - 2 - 720 - stretch - separator2.png - - - - Record minutes before - 0 - 107 - 40 - 720 - - 11 - 11 - 11 - 13 - - - - Record minutes after - 0 - 154 - 40 - 720 - - 11 - 11 - 12 - 14 - - - - Separator - 0 - 204 - 2 - 720 - stretch - separator2.png - - - - new only - 0 - 216 - 40 - 720 - - font13 - grey2 - white - button-nofocus.png - button-focus2.png - 10 - 10 - 13 - 15 - - - - anytime - 0 - 261 - 40 - 720 - - font13 - grey2 - white - button-nofocus.png - button-focus2.png - 11 - 11 - 14 - 16 - - - - number to keep - 0 - 306 - 40 - 720 - - 11 - 11 - 15 - 1 - - - - - - 190 - 455 - - Ok Button - 0 - 0 - 200 - 40 - center - center - button-nofocus.png - button-focus.png - - font12_title - 16 - 2 - 2 - 10 - - - Cancel Button - 210 - 0 - 200 - 40 - center - center - button-nofocus.png - button-focus.png - - font12_title - 16 - 1 - 1 - 10 - - - - - diff -Nru kodi-pvr-dvblink-1.10.9/src/base64.cpp kodi-pvr-dvblink-2.0.4/src/base64.cpp --- kodi-pvr-dvblink-1.10.9/src/base64.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/base64.cpp 2016-01-10 21:41:24.000000000 +0000 @@ -34,7 +34,6 @@ "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; - static inline bool is_base64(unsigned char c) { return (isalnum(c) || (c == '+') || (c == '/')); @@ -58,7 +57,7 @@ char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; - for (i = 0; (i <4) ; i++) + for (i = 0; (i < 4); i++) ret += BASE64_CHARS[char_array_4[i]]; i = 0; } @@ -93,12 +92,13 @@ unsigned char char_array_4[4], char_array_3[3]; std::string ret; - while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) + while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { - char_array_4[i++] = encoded_string[in_]; in_++; - if (i ==4) + char_array_4[i++] = encoded_string[in_]; + in_++; + if (i == 4) { - for (i = 0; i <4; i++) + for (i = 0; i < 4; i++) char_array_4[i] = BASE64_CHARS.find(char_array_4[i]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); @@ -113,10 +113,10 @@ if (i) { - for (j = i; j <4; j++) + for (j = i; j < 4; j++) char_array_4[j] = 0; - for (j = 0; j <4; j++) + for (j = 0; j < 4; j++) char_array_4[j] = BASE64_CHARS.find(char_array_4[j]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); diff -Nru kodi-pvr-dvblink-1.10.9/src/base64.h kodi-pvr-dvblink-2.0.4/src/base64.h --- kodi-pvr-dvblink-1.10.9/src/base64.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/base64.h 2016-01-10 21:41:24.000000000 +0000 @@ -1,4 +1,4 @@ #include -std::string base64_encode(char const* , unsigned int len); +std::string base64_encode(char const*, unsigned int len); std::string base64_decode(std::string const& s); diff -Nru kodi-pvr-dvblink-1.10.9/src/client.cpp kodi-pvr-dvblink-2.0.4/src/client.cpp --- kodi-pvr-dvblink-1.10.9/src/client.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/client.cpp 2016-01-10 21:41:24.000000000 +0000 @@ -44,12 +44,12 @@ std::string g_strUserPath = ""; std::string g_strClientPath = ""; -DVBLinkClient* dvblinkclient = NULL; +DVBLinkClient* dvblinkclient = NULL; RecordingStreamer* recording_streamer = NULL; std::string g_szHostname = DEFAULT_HOST; ///< The Host name or IP of the DVBLink Server long g_lPort = DEFAULT_PORT; ///< The DVBLink Connect Server listening port (default: 8080) -bool g_bUseTranscoding = DEFAULT_USETRANSCODING; ///< Use transcoding +bool g_bUseTranscoding = DEFAULT_USETRANSCODING; ///< Use transcoding std::string g_szClientname; ///< Name of dvblink client std::string g_szUsername = DEFAULT_USERNAME; ///< Username std::string g_szPassword = DEFAULT_PASSWORD; ///< Password @@ -60,36 +60,38 @@ std::string g_szAudiotrack = DEFAULT_AUDIOTRACK; ///< Audiotrack to include in stream when using transcoding bool g_bUseTimeshift = DEFAULT_USETIMESHIFT; ///< Use timeshift bool g_bAddRecEpisode2title = DEFAULT_ADDRECEPISODE2TITLE; ///< Concatenate title and episode info for recordings -bool g_bGroupRecBySeries = DEFAULT_GROUPRECBYSERIES; ///< Group Recordings as Directories by series -bool g_bNoGroupSingleRec = DEFAULT_NOGROUP_SINGLE_REC; ///< Do not group single recordings -CHelper_libXBMC_addon *XBMC = NULL; -CHelper_libXBMC_pvr *PVR = NULL; -CHelper_libKODI_guilib *GUI = NULL; +bool g_bGroupRecBySeries = DEFAULT_GROUPRECBYSERIES; ///< Group Recordings as Directories by series +bool g_bNoGroupSingleRec = DEFAULT_NOGROUP_SINGLE_REC; ///< Do not group single recordings +CHelper_libXBMC_addon *XBMC = NULL; +CHelper_libXBMC_pvr *PVR = NULL; +CHelper_libKODI_guilib *GUI = NULL; -extern "C" { +extern "C" +{ static void generate_uuid(std::string& uuid) { int64_t seed_value = PLATFORM::GetTimeMs(); seed_value = seed_value % 1000000000; - srand((unsigned int)seed_value); + srand((unsigned int) seed_value); //fill in uuid string from a template std::string template_str = "xxxx-xx-xx-xx-xxxxxx"; - for (size_t i=0; iRegisterMe(hdl)) @@ -118,10 +120,10 @@ GUI = new CHelper_libKODI_guilib; if (!GUI->RegisterMe(hdl)) { - SAFE_DELETE(GUI); - SAFE_DELETE(PVR); - SAFE_DELETE(XBMC); - return ADDON_STATUS_PERMANENT_FAILURE; + SAFE_DELETE(GUI); + SAFE_DELETE(PVR); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; } XBMC->Log(LOG_DEBUG, "%s - Creating the PVR DVBlink add-on", __FUNCTION__); @@ -130,12 +132,12 @@ generate_uuid(g_szClientname); XBMC->Log(LOG_NOTICE, "Generated guid %s to use as a DVBLink client ID", g_szClientname.c_str()); - m_CurStatus = ADDON_STATUS_UNKNOWN; - g_strUserPath = pvrprops->strUserPath; + m_CurStatus = ADDON_STATUS_UNKNOWN; + g_strUserPath = pvrprops->strUserPath; g_strClientPath = pvrprops->strClientPath; char * buffer = (char*) malloc(128); - buffer[0] = 0; + buffer[0] = 0; /* Connection settings */ /***********************/ @@ -180,7 +182,7 @@ { /* If setting is unknown fallback to defaults */ XBMC->Log(LOG_ERROR, "Couldn't get 'enable_transcoding' setting, falling back to false as default"); - g_bUseTranscoding = DEFAULT_USETRANSCODING; + g_bUseTranscoding = DEFAULT_USETRANSCODING; } /* Read setting "port" from settings.xml */ @@ -210,26 +212,26 @@ /* Read setting "Add episode name to title for recordings" from settings.xml */ if (!XBMC->GetSetting("add_rec_episode_info", &g_bAddRecEpisode2title)) { - /* If setting is unknown fallback to defaults */ - XBMC->Log(LOG_ERROR, "Couldn't get 'add_rec_episode_info' setting, falling back to 'true' as default"); - g_bAddRecEpisode2title = DEFAULT_ADDRECEPISODE2TITLE; + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'add_rec_episode_info' setting, falling back to 'true' as default"); + g_bAddRecEpisode2title = DEFAULT_ADDRECEPISODE2TITLE; } - /* Read setting "Group recordings by title" from settings.xml */ - if (!XBMC->GetSetting("group_recordings_by_series", &g_bGroupRecBySeries)) - { - /* If setting is unknown fallback to defaults */ - XBMC->Log(LOG_ERROR, "Couldn't get 'group_recordings_by_series' setting, falling back to 'true' as default"); - g_bGroupRecBySeries = DEFAULT_GROUPRECBYSERIES; - } + /* Read setting "Group recordings by title" from settings.xml */ + if (!XBMC->GetSetting("group_recordings_by_series", &g_bGroupRecBySeries)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'group_recordings_by_series' setting, falling back to 'true' as default"); + g_bGroupRecBySeries = DEFAULT_GROUPRECBYSERIES; + } - /* Read setting "Group recordings by title" from settings.xml */ - if (!XBMC->GetSetting("no_group_for_single_record", &g_bNoGroupSingleRec)) - { - /* If setting is unknown fallback to defaults */ - XBMC->Log(LOG_ERROR, "Couldn't get 'no_group_for_single_record' setting, falling back to 'false' as default"); - g_bNoGroupSingleRec = DEFAULT_NOGROUP_SINGLE_REC; - } + /* Read setting "Group recordings by title" from settings.xml */ + if (!XBMC->GetSetting("no_group_for_single_record", &g_bNoGroupSingleRec)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'no_group_for_single_record' setting, falling back to 'false' as default"); + g_bNoGroupSingleRec = DEFAULT_NOGROUP_SINGLE_REC; + } /* Read setting "height" from settings.xml */ if (!XBMC->GetSetting("height", &g_iHeight)) @@ -259,7 +261,8 @@ if (XBMC->GetSetting("audiotrack", buffer)) { g_szAudiotrack = buffer; - }else + } + else { /* If setting is unknown fallback to defaults */ XBMC->Log(LOG_ERROR, "Couldn't get 'Audiotrack' setting, falling back to 'eng' as default"); @@ -267,15 +270,16 @@ } /* Log the current settings for debugging purposes */ - XBMC->Log(LOG_DEBUG, "settings: enable_transcoding='%i' host='%s', port=%i", g_bUseTranscoding, g_szHostname.c_str(), g_lPort); - - dvblinkclient = new DVBLinkClient(XBMC, PVR, GUI, g_szClientname, g_szHostname, g_lPort, g_bShowInfoMSG, g_szUsername, g_szPassword, g_bAddRecEpisode2title, g_bGroupRecBySeries, g_bNoGroupSingleRec); + XBMC->Log(LOG_DEBUG, "settings: enable_transcoding='%i' host='%s', port=%i", g_bUseTranscoding, g_szHostname.c_str(), + g_lPort); - if (dvblinkclient->GetStatus()) - m_CurStatus = ADDON_STATUS_OK; - else - m_CurStatus = ADDON_STATUS_LOST_CONNECTION; + dvblinkclient = new DVBLinkClient(XBMC, PVR, GUI, g_szClientname, g_szHostname, g_lPort, g_bShowInfoMSG, g_szUsername, + g_szPassword, g_bAddRecEpisode2title, g_bGroupRecBySeries, g_bNoGroupSingleRec); + if (dvblinkclient->GetStatus()) + m_CurStatus = ADDON_STATUS_OK; + else + m_CurStatus = ADDON_STATUS_LOST_CONNECTION; return m_CurStatus; } @@ -337,16 +341,16 @@ } else if (str == "enable_transcoding") { - XBMC->Log(LOG_INFO, "Changed Setting 'enable_transcoding' from %u to %u", g_bUseTranscoding, *(int*)settingValue); - g_bUseTranscoding = *(bool*) settingValue; - return ADDON_STATUS_NEED_RESTART; + XBMC->Log(LOG_INFO, "Changed Setting 'enable_transcoding' from %u to %u", g_bUseTranscoding, *(int*) settingValue); + g_bUseTranscoding = *(bool*) settingValue; + return ADDON_STATUS_NEED_RESTART; } else if (str == "port") { XBMC->Log(LOG_INFO, "Changed Setting 'port' from %i to %i", g_lPort, *(int*) settingValue); - if (g_lPort != (long)(*(int*) settingValue)) + if (g_lPort != (long) (*(int*) settingValue)) { - g_lPort = (long)(*(int*) settingValue); + g_lPort = (long) (*(int*) settingValue); XBMC->Log(LOG_INFO, "Changed Setting 'port' to %i", g_lPort); return ADDON_STATUS_NEED_RESTART; } @@ -364,21 +368,24 @@ } else if (str == "add_rec_episode_info") { - XBMC->Log(LOG_INFO, "Changed Setting 'add_rec_episode_info' from %u to %u", g_bAddRecEpisode2title, *(int*)settingValue); - g_bAddRecEpisode2title = *(bool*)settingValue; - return ADDON_STATUS_NEED_RESTART; + XBMC->Log(LOG_INFO, "Changed Setting 'add_rec_episode_info' from %u to %u", g_bAddRecEpisode2title, + *(int*) settingValue); + g_bAddRecEpisode2title = *(bool*) settingValue; + return ADDON_STATUS_NEED_RESTART; } else if (str == "group_recordings_by_series") { - XBMC->Log(LOG_INFO, "Changed Setting 'group_recordings_by_series' from %u to %u", g_bGroupRecBySeries, *(int*)settingValue); - g_bGroupRecBySeries = *(bool*)settingValue; + XBMC->Log(LOG_INFO, "Changed Setting 'group_recordings_by_series' from %u to %u", g_bGroupRecBySeries, + *(int*) settingValue); + g_bGroupRecBySeries = *(bool*) settingValue; return ADDON_STATUS_NEED_RESTART; } else if (str == "no_group_for_single_record") { - XBMC->Log(LOG_INFO, "Changed Setting 'no_group_for_single_record' from %u to %u", g_bNoGroupSingleRec, *(int*)settingValue); - g_bNoGroupSingleRec = *(bool*)settingValue; - return ADDON_STATUS_NEED_RESTART; + XBMC->Log(LOG_INFO, "Changed Setting 'no_group_for_single_record' from %u to %u", g_bNoGroupSingleRec, + *(int*) settingValue); + g_bNoGroupSingleRec = *(bool*) settingValue; + return ADDON_STATUS_NEED_RESTART; } else if (str == "height") { @@ -398,7 +405,8 @@ else if (str == "audiotrack") { string tmp_sAudiotrack; - XBMC->Log(LOG_INFO, "Changed Setting 'audiotrack' from %s to %s", g_szAudiotrack.c_str(), (const char*) settingValue); + XBMC->Log(LOG_INFO, "Changed Setting 'audiotrack' from %s to %s", g_szAudiotrack.c_str(), + (const char*) settingValue); tmp_sAudiotrack = g_szAudiotrack; g_szAudiotrack = (const char*) settingValue; if (tmp_sAudiotrack != g_szAudiotrack) @@ -447,14 +455,14 @@ PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) { - pCapabilities->bSupportsEPG = true; - pCapabilities->bSupportsRecordings = true; + pCapabilities->bSupportsEPG = true; + pCapabilities->bSupportsRecordings = true; pCapabilities->bSupportsRecordingsUndelete = false; - pCapabilities->bSupportsTimers = true; - pCapabilities->bSupportsTV = true; - pCapabilities->bSupportsRadio = true; - pCapabilities->bHandlesInputStream = true; - pCapabilities->bSupportsChannelGroups = true; + pCapabilities->bSupportsTimers = true; + pCapabilities->bSupportsTV = true; + pCapabilities->bSupportsRadio = true; + pCapabilities->bHandlesInputStream = true; + pCapabilities->bSupportsChannelGroups = true; return PVR_ERROR_NO_ERROR; } @@ -466,7 +474,7 @@ const char *GetBackendVersion(void) { - static const char * strBackendVersion = "5.x"; + static const char * strBackendVersion = "5.x"; return strBackendVersion; } @@ -482,57 +490,57 @@ PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) { - if (dvblinkclient) - { + if (dvblinkclient) + { if (dvblinkclient->GetStatus()) { - dvblinkclient->GetDriveSpace(iTotal, iUsed); - return PVR_ERROR_NO_ERROR; + dvblinkclient->GetDriveSpace(iTotal, iUsed); + return PVR_ERROR_NO_ERROR; } - } + } return PVR_ERROR_SERVER_ERROR; } PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) { - if (dvblinkclient) + if (dvblinkclient) + { + if (dvblinkclient->GetStatus()) { - if (dvblinkclient->GetStatus()) - { - return dvblinkclient->GetEPGForChannel(handle, channel, iStart, iEnd); - } + return dvblinkclient->GetEPGForChannel(handle, channel, iStart, iEnd); } + } return PVR_ERROR_SERVER_ERROR; } int GetChannelsAmount(void) { - if (dvblinkclient) + if (dvblinkclient) + { + if (dvblinkclient->GetStatus()) + { + return dvblinkclient->GetChannelsAmount(); + } + else { - if (dvblinkclient->GetStatus()) - { - return dvblinkclient->GetChannelsAmount(); - } - else - { - return PVR_ERROR_SERVER_ERROR; - } + return PVR_ERROR_SERVER_ERROR; } - return -1; + } + return -1; } PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) { - if (dvblinkclient) + if (dvblinkclient) + { + if (dvblinkclient->GetStatus()) { - if (dvblinkclient->GetStatus()) - { - return dvblinkclient->GetChannels(handle, bRadio); - } + return dvblinkclient->GetChannels(handle, bRadio); } + } - return PVR_ERROR_SERVER_ERROR; + return PVR_ERROR_SERVER_ERROR; } // live / timshifted stream functions @@ -540,7 +548,8 @@ bool OpenLiveStream(const PVR_CHANNEL &channel) { if (dvblinkclient) - return dvblinkclient->OpenLiveStream(channel, g_bUseTimeshift, g_bUseTranscoding, g_iWidth, g_iHeight, g_iBitrate, g_szAudiotrack); + return dvblinkclient->OpenLiveStream(channel, g_bUseTimeshift, g_bUseTranscoding, g_iWidth, g_iHeight, g_iBitrate, + g_szAudiotrack); return false; } @@ -559,50 +568,50 @@ int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) { if (dvblinkclient) - return dvblinkclient->ReadLiveStream(pBuffer,iBufferSize); + return dvblinkclient->ReadLiveStream(pBuffer, iBufferSize); return 0; } long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) { - if (dvblinkclient) - return dvblinkclient->SeekLiveStream(iPosition,iWhence); - return -1; + if (dvblinkclient) + return dvblinkclient->SeekLiveStream(iPosition, iWhence); + return -1; } long long PositionLiveStream(void) { - if (dvblinkclient) - return dvblinkclient->PositionLiveStream(); - return -1; + if (dvblinkclient) + return dvblinkclient->PositionLiveStream(); + return -1; } long long LengthLiveStream(void) { - if (dvblinkclient) - return dvblinkclient->LengthLiveStream(); - return -1; + if (dvblinkclient) + return dvblinkclient->LengthLiveStream(); + return -1; } time_t GetPlayingTime() { - if (dvblinkclient) - return dvblinkclient->GetPlayingTime(); - return 0; + if (dvblinkclient) + return dvblinkclient->GetPlayingTime(); + return 0; } time_t GetBufferTimeStart() { - if (dvblinkclient) - return dvblinkclient->GetBufferTimeStart(); - return 0; + if (dvblinkclient) + return dvblinkclient->GetBufferTimeStart(); + return 0; } time_t GetBufferTimeEnd() { - if (dvblinkclient) - return dvblinkclient->GetBufferTimeEnd(); - return 0; + if (dvblinkclient) + return dvblinkclient->GetBufferTimeEnd(); + return 0; } void PauseStream(bool bPaused) @@ -611,16 +620,24 @@ bool CanPauseStream(void) { - return g_bUseTimeshift; + return g_bUseTimeshift; } bool CanSeekStream(void) { - return g_bUseTimeshift; + return g_bUseTimeshift; } //recording timers functions +PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) +{ + if (dvblinkclient) + return dvblinkclient->GetTimerTypes(types, size); + + return PVR_ERROR_NOT_IMPLEMENTED; +} + int GetTimersAmount(void) { if (dvblinkclient) @@ -631,13 +648,14 @@ PVR_ERROR GetTimers(ADDON_HANDLE handle) { + /* TODO: Change implementation to get support for the timer features introduced with PVR API 1.9.7 */ if (dvblinkclient) - return dvblinkclient->GetTimers(handle); + return dvblinkclient->GetTimers(handle); return PVR_ERROR_FAILED; } -PVR_ERROR AddTimer(const PVR_TIMER &timer) +PVR_ERROR AddTimer(const PVR_TIMER &timer) { if (dvblinkclient) return dvblinkclient->AddTimer(timer); @@ -653,7 +671,7 @@ return PVR_ERROR_FAILED; } -PVR_ERROR UpdateTimer(const PVR_TIMER &timer) +PVR_ERROR UpdateTimer(const PVR_TIMER &timer) { if (dvblinkclient) return dvblinkclient->UpdateTimer(timer); @@ -661,7 +679,6 @@ return PVR_ERROR_FAILED; } - int GetRecordingsAmount(bool deleted) { if (dvblinkclient) @@ -673,7 +690,7 @@ PVR_ERROR GetRecordings(ADDON_HANDLE handle, bool deleted) { if (dvblinkclient) - return dvblinkclient->GetRecordings(handle); + return dvblinkclient->GetRecordings(handle); return PVR_ERROR_FAILED; } @@ -681,13 +698,13 @@ PVR_ERROR DeleteRecording(const PVR_RECORDING &recording) { if (dvblinkclient) - return dvblinkclient->DeleteRecording(recording); + return dvblinkclient->DeleteRecording(recording); - return PVR_ERROR_FAILED; + return PVR_ERROR_FAILED; } -PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) -{ +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) +{ return PVR_ERROR_NOT_IMPLEMENTED; } @@ -714,67 +731,67 @@ bool OpenRecordedStream(const PVR_RECORDING &recording) { - //close previous stream to be sure - CloseRecordedStream(); + //close previous stream to be sure + CloseRecordedStream(); - bool ret_val = false; - std::string url; - if (dvblinkclient->GetRecordingURL(recording.strRecordingId, url)) + bool ret_val = false; + std::string url; + if (dvblinkclient->GetRecordingURL(recording.strRecordingId, url)) + { + recording_streamer = new RecordingStreamer(XBMC, g_szClientname, g_szHostname, g_lPort, g_szUsername, g_szPassword); + if (recording_streamer->OpenRecordedStream(recording.strRecordingId, url)) { - recording_streamer = new RecordingStreamer(XBMC, g_szClientname, g_szHostname, g_lPort, g_szUsername, g_szPassword); - if (recording_streamer->OpenRecordedStream(recording.strRecordingId, url)) - { - ret_val = true; - } - else - { - delete recording_streamer; - recording_streamer = NULL; - } + ret_val = true; } - return ret_val; + else + { + delete recording_streamer; + recording_streamer = NULL; + } + } + return ret_val; } void CloseRecordedStream(void) { - if (recording_streamer != NULL) - { - recording_streamer->CloseRecordedStream(); - delete recording_streamer; - recording_streamer = NULL; - } + if (recording_streamer != NULL) + { + recording_streamer->CloseRecordedStream(); + delete recording_streamer; + recording_streamer = NULL; + } } int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize) { - if (recording_streamer != NULL) - return recording_streamer->ReadRecordedStream(pBuffer, iBufferSize); + if (recording_streamer != NULL) + return recording_streamer->ReadRecordedStream(pBuffer, iBufferSize); - return -1; + return -1; } long long SeekRecordedStream(long long iPosition, int iWhence /* = SEEK_SET */) { - if (recording_streamer != NULL) - return recording_streamer->SeekRecordedStream(iPosition, iWhence); + if (recording_streamer != NULL) + return recording_streamer->SeekRecordedStream(iPosition, iWhence); - return -1; + return -1; } long long PositionRecordedStream(void) { - if (recording_streamer != NULL) - return recording_streamer->PositionRecordedStream(); + if (recording_streamer != NULL) + return recording_streamer->PositionRecordedStream(); - return -1; + return -1; } long long LengthRecordedStream(void) { - if (recording_streamer != NULL) - return recording_streamer->LengthRecordedStream(); + if (recording_streamer != NULL) + return recording_streamer->LengthRecordedStream(); - return -1; + return -1; } /** UNUSED API FUNCTIONS */ @@ -784,7 +801,6 @@ return PVR_ERROR_NOT_IMPLEMENTED; } - PVR_ERROR OpenDialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; @@ -822,26 +838,26 @@ int GetChannelGroupsAmount(void) { - if (dvblinkclient) - return dvblinkclient->GetChannelGroupsAmount(); + if (dvblinkclient) + return dvblinkclient->GetChannelGroupsAmount(); - return -1; + return -1; } PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { - if (dvblinkclient) - return dvblinkclient->GetChannelGroups(handle, bRadio); + if (dvblinkclient) + return dvblinkclient->GetChannelGroups(handle, bRadio); - return PVR_ERROR_NOT_IMPLEMENTED; + return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) { - if (dvblinkclient) - return dvblinkclient->GetChannelGroupMembers(handle, group); + if (dvblinkclient) + return dvblinkclient->GetChannelGroupMembers(handle, group); - return PVR_ERROR_NOT_IMPLEMENTED; + return PVR_ERROR_NOT_IMPLEMENTED; } void DemuxReset(void) @@ -852,7 +868,6 @@ { } - PVR_ERROR RenameRecording(const PVR_RECORDING &recording) { return PVR_ERROR_NOT_IMPLEMENTED; @@ -897,9 +912,12 @@ return 0; } +bool IsTimeshifting(void) +{ + return false; +} - -bool SeekTime(int,bool,double*) +bool SeekTime(int, bool, double*) { return false; } diff -Nru kodi-pvr-dvblink-1.10.9/src/client.h kodi-pvr-dvblink-2.0.4/src/client.h --- kodi-pvr-dvblink-1.10.9/src/client.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/client.h 2016-01-10 21:41:24.000000000 +0000 @@ -22,7 +22,7 @@ * http://www.gnu.org/copyleft/gpl.html * */ - + #pragma once #include "kodi/libXBMC_addon.h" #include "kodi/libXBMC_pvr.h" @@ -42,4 +42,3 @@ #define DEFAULT_ADDRECEPISODE2TITLE true #define DEFAULT_GROUPRECBYSERIES true #define DEFAULT_NOGROUP_SINGLE_REC false - diff -Nru kodi-pvr-dvblink-1.10.9/src/DialogDeleteTimer.cpp kodi-pvr-dvblink-2.0.4/src/DialogDeleteTimer.cpp --- kodi-pvr-dvblink-1.10.9/src/DialogDeleteTimer.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/DialogDeleteTimer.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2005-2011 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include "DialogDeleteTimer.h" -#include "kodi/libKODI_guilib.h" - -using namespace ADDON; - -#define BUTTON_OK 1 -#define BUTTON_CANCEL 2 -#define BUTTON_CLOSE 22 - -#define RADIO_BUTTON_EPISODE 10 -#define RADIO_BUTTON_SERIES 11 -#define LABEL_SHOWNAME 20 - - -CDialogDeleteTimer::CDialogDeleteTimer(CHelper_libXBMC_addon* xbmc, CHelper_libKODI_guilib* gui, bool delSeries) -{ - XBMC = xbmc; - GUI = gui; - DeleteSeries = delSeries; - - // specify the xml of the window here - _confirmed = -1; - _window = GUI->Window_create("DeleteTimer.xml", "Confluence", false, true); - - // needed for every dialog - _window->m_cbhdl = this; - _window->CBOnInit = OnInitCB; - _window->CBOnFocus = OnFocusCB; - _window->CBOnClick = OnClickCB; - _window->CBOnAction = OnActionCB; -} - -CDialogDeleteTimer::~CDialogDeleteTimer() -{ - GUI->Window_destroy(_window); -} - -bool CDialogDeleteTimer::OnInit() -{ - // init radio buttons - _radioDelEpisode = GUI->Control_getRadioButton(_window, RADIO_BUTTON_EPISODE); - _radioDelSeries = GUI->Control_getRadioButton(_window, RADIO_BUTTON_SERIES); - _radioDelEpisode->SetSelected(!DeleteSeries); - _radioDelSeries->SetSelected(DeleteSeries); - - return true; -} - -bool CDialogDeleteTimer::OnClick(int controlId) -{ - switch(controlId) - { - case BUTTON_OK: // save value from GUI, then FALLS THROUGH TO CANCEL - DeleteSeries = _radioDelSeries->IsSelected(); - case BUTTON_CANCEL: // handle releasing of objects - case BUTTON_CLOSE: - if (_confirmed == -1) // if not previously confirmed, set to cancel value - _confirmed = 0; - _window->Close(); - GUI->Control_releaseRadioButton(_radioDelEpisode); - GUI->Control_releaseRadioButton(_radioDelSeries); - break; - case RADIO_BUTTON_EPISODE: - DeleteSeries = !_radioDelEpisode->IsSelected(); - _radioDelSeries->SetSelected(DeleteSeries); - break; - case RADIO_BUTTON_SERIES: - DeleteSeries = _radioDelSeries->IsSelected(); - _radioDelEpisode->SetSelected(!DeleteSeries); - break; - } - - return true; -} - -bool CDialogDeleteTimer::OnInitCB(GUIHANDLE cbhdl) -{ - CDialogDeleteTimer* dialog = static_cast(cbhdl); - return dialog->OnInit(); -} - -bool CDialogDeleteTimer::OnClickCB(GUIHANDLE cbhdl, int controlId) -{ - CDialogDeleteTimer* dialog = static_cast(cbhdl); - if (controlId == BUTTON_OK) - dialog->_confirmed = 1; - //dialog->_confirmed = (controlId == BUTTON_OK); - return dialog->OnClick(controlId); -} - -bool CDialogDeleteTimer::OnFocusCB(GUIHANDLE cbhdl, int controlId) -{ - CDialogDeleteTimer* dialog = static_cast(cbhdl); - return dialog->OnFocus(controlId); -} - -bool CDialogDeleteTimer::OnActionCB(GUIHANDLE cbhdl, int actionId) -{ - CDialogDeleteTimer* dialog = static_cast(cbhdl); - return dialog->OnAction(actionId); -} - -bool CDialogDeleteTimer::Show() -{ - if (_window) - return _window->Show(); - - return false; -} - -void CDialogDeleteTimer::Close() -{ - if (_window) - _window->Close(); -} - -int CDialogDeleteTimer::DoModal() -{ - if (_window) - _window->DoModal(); - return _confirmed; // return true if user didn't cancel dialog -} - -bool CDialogDeleteTimer::OnFocus(int controlId) -{ - return true; -} - -bool CDialogDeleteTimer::OnAction(int actionId) -{ - if (actionId == ADDON_ACTION_CLOSE_DIALOG || actionId == ADDON_ACTION_PREVIOUS_MENU || actionId == 92/*back*/) - return OnClick(BUTTON_CANCEL); - else - return false; -} diff -Nru kodi-pvr-dvblink-1.10.9/src/DialogDeleteTimer.h kodi-pvr-dvblink-2.0.4/src/DialogDeleteTimer.h --- kodi-pvr-dvblink-1.10.9/src/DialogDeleteTimer.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/DialogDeleteTimer.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#pragma once - -#include "client.h" -#include "kodi/libKODI_guilib.h" - -class CDialogDeleteTimer -{ - -public: - CDialogDeleteTimer(ADDON::CHelper_libXBMC_addon* xbmc, CHelper_libKODI_guilib* gui, bool recSeries); - virtual ~CDialogDeleteTimer(); - - bool Show(); - void Close(); - int DoModal(); //-1=>dialog load failed, 0=>canceled, 1=>confirmed - - // dialog specific return params - bool DeleteSeries; // values returned - -private: - CAddonGUIRadioButton *_radioDelEpisode; - CAddonGUIRadioButton *_radioDelSeries; - - // following is needed for every dialog -private: - CAddonGUIWindow *_window; - CHelper_libKODI_guilib* GUI; - ADDON::CHelper_libXBMC_addon* XBMC; - int _confirmed; //-1=>dialog load failed, 0=>canceled, 1=>confirmed - - bool OnClick(int controlId); - bool OnFocus(int controlId); - bool OnInit(); - bool OnAction(int actionId); - - static bool OnClickCB(GUIHANDLE cbhdl, int controlId); - static bool OnFocusCB(GUIHANDLE cbhdl, int controlId); - static bool OnInitCB(GUIHANDLE cbhdl); - static bool OnActionCB(GUIHANDLE cbhdl, int actionId); -}; - diff -Nru kodi-pvr-dvblink-1.10.9/src/DialogRecordPref.cpp kodi-pvr-dvblink-2.0.4/src/DialogRecordPref.cpp --- kodi-pvr-dvblink-1.10.9/src/DialogRecordPref.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/DialogRecordPref.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,230 +0,0 @@ -/* - * Copyright (C) 2005-2011 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include "DialogRecordPref.h" -#include "kodi/libKODI_guilib.h" - -using namespace ADDON; - -#define BUTTON_OK 1 -#define BUTTON_CANCEL 2 -#define BUTTON_CLOSE 22 - -#define RADIO_BUTTON_EPISODE 10 -#define RADIO_BUTTON_SERIES 11 -#define SPIN_MARGIN_BEFORE 12 -#define SPIN_MARGIN_AFTER 13 -#define RADIO_BUTTON_NEW_ONLY 14 -#define RADIO_BUTTON_ANYTIME 15 -#define SPIN_REC_TO_KEEP 16 - -CDialogRecordPref::CDialogRecordPref(CHelper_libXBMC_addon* xbmc, CHelper_libKODI_guilib* gui) -{ - RecSeries = false; - newOnly = true; - anytime = true; - marginBefore = c_default_margin; - marginAfter = c_default_margin; - numberToKeep = c_keep_all_recordings; - - GUI = gui; - XBMC = xbmc; - - // needed for every dialog - _confirmed = -1; // init to failed load value (due to xml file not being found) - _window = GUI->Window_create("RecordPrefs.xml", "Confluence", false, true); - _window->m_cbhdl = this; - _window->CBOnInit = OnInitCB; - _window->CBOnFocus = OnFocusCB; - _window->CBOnClick = OnClickCB; - _window->CBOnAction = OnActionCB; -} - -CDialogRecordPref::~CDialogRecordPref() -{ - GUI->Window_destroy(_window); -} - -bool CDialogRecordPref::OnInit() -{ - // init radio buttons - _radioRecEpisode = GUI->Control_getRadioButton(_window, RADIO_BUTTON_EPISODE); - _radioRecSeries = GUI->Control_getRadioButton(_window, RADIO_BUTTON_SERIES); - _radioNewOnly = GUI->Control_getRadioButton(_window, RADIO_BUTTON_NEW_ONLY); - _radioAnytime = GUI->Control_getRadioButton(_window, RADIO_BUTTON_ANYTIME); - _marginBefore = GUI->Control_getSpin(_window, SPIN_MARGIN_BEFORE); - _marginAfter = GUI->Control_getSpin(_window, SPIN_MARGIN_AFTER); - _marginNumberToKeep = GUI->Control_getSpin(_window, SPIN_REC_TO_KEEP); - - _radioRecEpisode->SetSelected(!RecSeries); - _radioRecSeries->SetSelected(RecSeries); - - PopulateMarginSpin(_marginBefore); - _marginBefore->SetValue(marginBefore); - - PopulateMarginSpin(_marginAfter); - _marginAfter->SetValue(marginAfter); - - PopulateKeepSpin(_marginNumberToKeep); - _marginNumberToKeep->SetValue(numberToKeep); - - _radioNewOnly->SetSelected(newOnly); - _radioAnytime->SetSelected(anytime); - - HideShowSeriesControls(RecSeries); - - return true; -} - -void CDialogRecordPref::PopulateMarginSpin(CAddonGUISpinControl* spin) -{ - spin->AddLabel(XBMC->GetLocalizedString(32022), c_default_margin); - spin->AddLabel("0", 0); - spin->AddLabel("1", 1); - spin->AddLabel("2", 2); - spin->AddLabel("3", 3); - spin->AddLabel("4", 4); - spin->AddLabel("5", 5); - spin->AddLabel("10", 10); - spin->AddLabel("15", 15); - spin->AddLabel("30", 30); - spin->AddLabel("60", 60); -} - -void CDialogRecordPref::PopulateKeepSpin(CAddonGUISpinControl* spin) -{ - spin->AddLabel(XBMC->GetLocalizedString(32023), c_keep_all_recordings); - spin->AddLabel("1", 1); - spin->AddLabel("2", 2); - spin->AddLabel("3", 3); - spin->AddLabel("4", 4); - spin->AddLabel("5", 5); - spin->AddLabel("6", 6); - spin->AddLabel("7", 7); - spin->AddLabel("10", 10); -} - -bool CDialogRecordPref::OnClick(int controlId) -{ - switch(controlId) - { - case BUTTON_OK: // save value from GUI, then FALLS THROUGH TO CANCEL - RecSeries = _radioRecSeries->IsSelected(); - newOnly = _radioNewOnly->IsSelected(); - anytime = _radioAnytime->IsSelected(); - marginBefore = _marginBefore->GetValue(); - marginAfter = _marginAfter->GetValue(); - numberToKeep = _marginNumberToKeep->GetValue(); - case BUTTON_CANCEL: - case BUTTON_CLOSE: - if (_confirmed == -1) // if not previously confirmed, set to cancel value - _confirmed = 0; - _window->Close(); - GUI->Control_releaseRadioButton(_radioRecEpisode); - GUI->Control_releaseRadioButton(_radioRecSeries); - GUI->Control_releaseRadioButton(_radioNewOnly); - GUI->Control_releaseRadioButton(_radioAnytime); - GUI->Control_releaseSpin(_marginBefore); - GUI->Control_releaseSpin(_marginAfter); - GUI->Control_releaseSpin(_marginNumberToKeep); - break; - case RADIO_BUTTON_EPISODE: - RecSeries = !_radioRecEpisode->IsSelected(); - _radioRecSeries->SetSelected(RecSeries); - HideShowSeriesControls(RecSeries); - break; - case RADIO_BUTTON_SERIES: - RecSeries = _radioRecSeries->IsSelected(); - _radioRecEpisode->SetSelected(!RecSeries); - HideShowSeriesControls(RecSeries); - break; - } - - return true; -} - -void CDialogRecordPref::HideShowSeriesControls(bool bShow) -{ - _radioNewOnly->SetVisible(bShow); - _radioAnytime->SetVisible(bShow); - _marginNumberToKeep->SetVisible(bShow); -} - -bool CDialogRecordPref::OnInitCB(GUIHANDLE cbhdl) -{ - CDialogRecordPref* dialog = static_cast(cbhdl); - return dialog->OnInit(); -} - -bool CDialogRecordPref::OnClickCB(GUIHANDLE cbhdl, int controlId) -{ - CDialogRecordPref* dialog = static_cast(cbhdl); - if (controlId == BUTTON_OK) - dialog->_confirmed = 1; - return dialog->OnClick(controlId); -} - -bool CDialogRecordPref::OnFocusCB(GUIHANDLE cbhdl, int controlId) -{ - CDialogRecordPref* dialog = static_cast(cbhdl); - return dialog->OnFocus(controlId); -} - -bool CDialogRecordPref::OnActionCB(GUIHANDLE cbhdl, int actionId) -{ - CDialogRecordPref* dialog = static_cast(cbhdl); - return dialog->OnAction(actionId); -} - -bool CDialogRecordPref::Show() -{ - if (_window) - return _window->Show(); - - return false; -} - -void CDialogRecordPref::Close() -{ - if (_window) - _window->Close(); -} - -int CDialogRecordPref::DoModal() -{ - if (_window) - _window->DoModal(); - return _confirmed; // return true if user didn't cancel dialog -} - -bool CDialogRecordPref::OnFocus(int controlId) -{ - return true; -} - -bool CDialogRecordPref::OnAction(int actionId) -{ - if (actionId == ADDON_ACTION_CLOSE_DIALOG || actionId == ADDON_ACTION_PREVIOUS_MENU || actionId == 92/*back*/) - return OnClick(BUTTON_CANCEL); - else - return false; -} diff -Nru kodi-pvr-dvblink-1.10.9/src/DialogRecordPref.h kodi-pvr-dvblink-2.0.4/src/DialogRecordPref.h --- kodi-pvr-dvblink-1.10.9/src/DialogRecordPref.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/DialogRecordPref.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#pragma once - -#include "client.h" -#include "kodi/libKODI_guilib.h" - -class CDialogRecordPref -{ -public: - static const int c_keep_all_recordings = 0; - static const int c_default_margin = -1; - -public: - CDialogRecordPref(ADDON::CHelper_libXBMC_addon* xbmc, CHelper_libKODI_guilib* gui); - virtual ~CDialogRecordPref(); - - bool Show(); - void Close(); - int DoModal(); // returns -1=> load failed, 0=>canceled, 1=>confirmed - - // dialog specific params - bool RecSeries; - bool newOnly; - bool anytime; - int marginBefore; - int marginAfter; - int numberToKeep; - -private: - CAddonGUIRadioButton *_radioRecEpisode; - CAddonGUIRadioButton *_radioRecSeries; - CAddonGUIRadioButton *_radioNewOnly; - CAddonGUIRadioButton *_radioAnytime; - CAddonGUISpinControl *_marginBefore; - CAddonGUISpinControl *_marginAfter; - CAddonGUISpinControl *_marginNumberToKeep; - - // following is needed for every dialog -private: - CHelper_libKODI_guilib* GUI; - ADDON::CHelper_libXBMC_addon* XBMC; - CAddonGUIWindow *_window; - int _confirmed; //-1=> load failed, 0=>canceled, 1=>confirmed - - bool OnClick(int controlId); - bool OnFocus(int controlId); - bool OnInit(); - bool OnAction(int actionId); - - void HideShowSeriesControls(bool bShow); - void PopulateMarginSpin(CAddonGUISpinControl* spin); - void PopulateKeepSpin(CAddonGUISpinControl* spin); - - static bool OnClickCB(GUIHANDLE cbhdl, int controlId); - static bool OnFocusCB(GUIHANDLE cbhdl, int controlId); - static bool OnInitCB(GUIHANDLE cbhdl); - static bool OnActionCB(GUIHANDLE cbhdl, int actionId); -}; - diff -Nru kodi-pvr-dvblink-1.10.9/src/DVBLinkClient.cpp kodi-pvr-dvblink-2.0.4/src/DVBLinkClient.cpp --- kodi-pvr-dvblink-1.10.9/src/DVBLinkClient.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/DVBLinkClient.cpp 2016-01-10 21:41:24.000000000 +0000 @@ -22,17 +22,18 @@ * http://www.gnu.org/copyleft/gpl.html * */ - +#include #include "DVBLinkClient.h" #include "platform/util/StdString.h" #include "kodi/libKODI_guilib.h" -#include "DialogRecordPref.h" -#include "DialogDeleteTimer.h" using namespace dvblinkremote; using namespace dvblinkremotehttp; using namespace ADDON; +static int default_rec_limit_ = dcrn_keep_all; +static int default_rec_show_type_ = dcrs_record_all; + std::string DVBLinkClient::GetBuildInRecorderObjectID() { std::string result = ""; @@ -42,9 +43,11 @@ getPlaybackObjectRequest.RequestedItemType = GetPlaybackObjectRequest::REQUESTED_ITEM_TYPE_ALL; getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = true; GetPlaybackObjectResponse getPlaybackObjectResponse; - if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, NULL)) == DVBLINK_REMOTE_STATUS_OK) + if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, + NULL)) == DVBLINK_REMOTE_STATUS_OK) { - for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackContainers().begin(); it < getPlaybackObjectResponse.GetPlaybackContainers().end(); it++) + for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackContainers().begin(); + it < getPlaybackObjectResponse.GetPlaybackContainers().end(); it++) { PlaybackContainer * container = (PlaybackContainer *) *it; if (strcmp(container->SourceID.c_str(), DVBLINK_BUILD_IN_RECORDER_SOURCE_ID) == 0) @@ -58,8 +61,9 @@ return result; } -DVBLinkClient::DVBLinkClient(CHelper_libXBMC_addon* xbmc, CHelper_libXBMC_pvr* pvr, CHelper_libKODI_guilib* gui, std::string clientname, std::string hostname, - long port, bool showinfomsg, std::string username, std::string password, bool add_episode_to_rec_title, bool group_recordings_by_series, bool no_group_single_rec) +DVBLinkClient::DVBLinkClient(CHelper_libXBMC_addon* xbmc, CHelper_libXBMC_pvr* pvr, CHelper_libKODI_guilib* gui, + std::string clientname, std::string hostname, long port, bool showinfomsg, std::string username, + std::string password, bool add_episode_to_rec_title, bool group_recordings_by_series, bool no_group_single_rec) { PVR = pvr; XBMC = xbmc; @@ -76,8 +80,9 @@ favorites_supported_ = false; transcoding_supported_ = false; - m_httpClient = new HttpPostClient(XBMC,hostname, port, username, password); - m_dvblinkRemoteCommunication = DVBLinkRemote::Connect((HttpClient&)*m_httpClient, m_hostname.c_str(), port, username.c_str(), password.c_str(), this); + m_httpClient = new HttpPostClient(XBMC, hostname, port, username, password); + m_dvblinkRemoteCommunication = DVBLinkRemote::Connect((HttpClient&) *m_httpClient, m_hostname.c_str(), port, + username.c_str(), password.c_str(), this); DVBLinkRemoteStatusCode status; m_timerCount = -1; @@ -88,22 +93,23 @@ ServerInfo si; if ((status = m_dvblinkRemoteCommunication->GetServerInfo(server_info_request, si, NULL)) == DVBLINK_REMOTE_STATUS_OK) { - int server_build = atoi(si.build_.c_str()); + int server_build = atoi(si.build_.c_str()); - //server with build earlier than 11410 does not support setting margins - setting_margins_supported_ = (server_build >= 11405); + //server with build earlier than 11410 does not support setting margins + setting_margins_supported_ = (server_build >= 11405); } GetStreamingCapabilitiesRequest streamin_caps_request; StreamingCapabilities streaming_caps; status = m_dvblinkRemoteCommunication->GetStreamingCapabilities(streamin_caps_request, streaming_caps, NULL); if (status == DVBLINK_REMOTE_STATUS_OK) - transcoding_supported_ = streaming_caps.IsTranscoderSupported(dvblinkremote::StreamingCapabilities::STREAMING_TRANSCODER_H264); + transcoding_supported_ = streaming_caps.IsTranscoderSupported( + dvblinkremote::StreamingCapabilities::STREAMING_TRANSCODER_H264); GetFavoritesRequest favorites_request; status = m_dvblinkRemoteCommunication->GetFavorites(favorites_request, channel_favorites_, NULL); favorites_supported_ = (status == DVBLINK_REMOTE_STATUS_OK); - + GetChannelsRequest request; m_channels = new ChannelList(); m_stream = new Stream(); @@ -113,7 +119,7 @@ if ((status = m_dvblinkRemoteCommunication->GetChannels(request, *m_channels, &error)) == DVBLINK_REMOTE_STATUS_OK) { int iChannelUnique = 0; - for (std::vector::iterator it = m_channels->begin(); it < m_channels->end(); it++) + for (std::vector::iterator it = m_channels->begin(); it < m_channels->end(); it++) { Channel* channel = (*it); int channel_id = ++iChannelUnique; @@ -121,8 +127,8 @@ inverse_channel_map_[channel->GetID()] = channel_id; } m_connected = true; - - XBMC->Log(LOG_INFO, "Connected to DVBLink Server '%s'", m_hostname.c_str()); + + XBMC->Log(LOG_INFO, "Connected to DVBLink Server '%s'", m_hostname.c_str()); if (m_showinfomsg) { XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32001), m_hostname.c_str()); @@ -142,8 +148,10 @@ } else { - XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32003), m_hostname.c_str(), (int)status); - XBMC->Log(LOG_ERROR, "Could not connect to DVBLink Server '%s' on port '%i' with username '%s' (Error code : %d Description : %s)", hostname.c_str(), port, username.c_str(), (int)status,error.c_str()); + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32003), m_hostname.c_str(), (int) status); + XBMC->Log(LOG_ERROR, + "Could not connect to DVBLink Server '%s' on port '%i' with username '%s' (Error code : %d Description : %s)", + hostname.c_str(), port, username.c_str(), (int) status, error.c_str()); } } @@ -167,7 +175,6 @@ return NULL; } - bool DVBLinkClient::GetStatus() { return m_connected; @@ -181,10 +188,10 @@ PVR_ERROR DVBLinkClient::GetChannels(ADDON_HANDLE handle, bool bRadio) { XBMC->Log(LOG_INFO, "Getting channels (%d channels on server)", m_channelMap.size()); - for (std::map::iterator it=m_channelMap.begin(); it!=m_channelMap.end(); ++it) + for (std::map::iterator it = m_channelMap.begin(); it != m_channelMap.end(); ++it) { Channel* channel = (*it).second; - + bool isRadio = (channel->GetChannelType() == Channel::CHANNEL_TYPE_RADIO); if (isRadio == bRadio) @@ -194,13 +201,13 @@ xbmcChannel.bIsRadio = isRadio; if (channel->Number != -1) { - xbmcChannel.iChannelNumber = channel->Number; - xbmcChannel.iSubChannelNumber = channel->SubNumber; + xbmcChannel.iChannelNumber = channel->Number; + xbmcChannel.iSubChannelNumber = channel->SubNumber; } xbmcChannel.iEncryptionSystem = 0; xbmcChannel.iUniqueId = (*it).first; - PVR_STRCPY(xbmcChannel.strChannelName,channel->GetName().c_str()); + PVR_STRCPY(xbmcChannel.strChannelName, channel->GetName().c_str()); CStdString stream; //PVR_STRCPY(xbmcChannel.strIconPath, "special://userdata/addon_data/pvr.dvblink/channel.png"); @@ -212,65 +219,313 @@ int DVBLinkClient::GetChannelGroupsAmount(void) { - if (!favorites_supported_) - return -1; + if (!favorites_supported_) + return -1; - return channel_favorites_.favorites_.size(); + return channel_favorites_.favorites_.size(); } PVR_ERROR DVBLinkClient::GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { - if (!favorites_supported_) - return PVR_ERROR_NOT_IMPLEMENTED; + if (!favorites_supported_) + return PVR_ERROR_NOT_IMPLEMENTED; - for (size_t i = 0; iTransferChannelGroup(handle, &group); - } + PVR->TransferChannelGroup(handle, &group); + } - return PVR_ERROR_NO_ERROR; + return PVR_ERROR_NO_ERROR; } PVR_ERROR DVBLinkClient::GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) { - if (!favorites_supported_) - return PVR_ERROR_NOT_IMPLEMENTED; + if (!favorites_supported_) + return PVR_ERROR_NOT_IMPLEMENTED; - for (size_t i = 0; iGetChannelType() == dvblinkremote::Channel::CHANNEL_TYPE_RADIO); - for (size_t j = 0; jGetChannelType() == dvblinkremote::Channel::CHANNEL_TYPE_RADIO); - - if (group.bIsRadio != isRadio) - continue; - - PVR_CHANNEL_GROUP_MEMBER member; - memset(&member, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); - PVR_STRCPY(member.strGroupName, group.strGroupName); - member.iChannelUniqueId = inverse_channel_map_[chlist[j]]; - if (ch->Number != -1) - member.iChannelNumber = ch->Number; + if (group.bIsRadio != isRadio) + continue; - PVR->TransferChannelGroupMember(handle, &member); - } - } + PVR_CHANNEL_GROUP_MEMBER member; + memset(&member, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); + PVR_STRCPY(member.strGroupName, group.strGroupName); + member.iChannelUniqueId = inverse_channel_map_[chlist[j]]; + if (ch->Number != -1) + member.iChannelNumber = ch->Number; + + PVR->TransferChannelGroupMember(handle, &member); + } } - return PVR_ERROR_NO_ERROR; + } + return PVR_ERROR_NO_ERROR; +} + +namespace +{ +struct TimerType: PVR_TIMER_TYPE +{ + TimerType(unsigned int id, unsigned int attributes, const std::string &description, + const std::vector > &maxRecordingsValues, int maxRecordingsDefault, + const std::vector > &dupEpisodesValues, int dupEpisodesDefault) + { + memset(this, 0, sizeof(PVR_TIMER_TYPE)); + + iId = id; + iAttributes = attributes; + iMaxRecordingsSize = maxRecordingsValues.size(); + iMaxRecordingsDefault = maxRecordingsDefault; + iPreventDuplicateEpisodesSize = dupEpisodesValues.size(); + iPreventDuplicateEpisodesDefault = dupEpisodesDefault; + strncpy(strDescription, description.c_str(), sizeof(strDescription) - 1); + + int i = 0; + for (auto it = maxRecordingsValues.begin(); it != maxRecordingsValues.end(); ++it, ++i) + { + maxRecordings[i].iValue = it->first; + strncpy(maxRecordings[i].strDescription, it->second.c_str(), sizeof(maxRecordings[i].strDescription) - 1); + } + + i = 0; + for (auto it = dupEpisodesValues.begin(); it != dupEpisodesValues.end(); ++it, ++i) + { + preventDuplicateEpisodes[i].iValue = it->first; + strncpy(preventDuplicateEpisodes[i].strDescription, it->second.c_str(), + sizeof(preventDuplicateEpisodes[i].strDescription) - 1); + } + } +}; + +} + +PVR_ERROR DVBLinkClient::GetTimerTypes(PVR_TIMER_TYPE types[], int *size) +{ + /* PVR_Timer.iMaxRecordings values and presentation. */ + static std::vector > recordingLimitValues; + if (recordingLimitValues.size() == 0) + { + recordingLimitValues.push_back(std::make_pair(dcrn_keep_all, XBMC->GetLocalizedString(32026))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_1, XBMC->GetLocalizedString(32027))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_2, XBMC->GetLocalizedString(32028))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_3, XBMC->GetLocalizedString(32029))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_4, XBMC->GetLocalizedString(32030))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_5, XBMC->GetLocalizedString(32031))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_6, XBMC->GetLocalizedString(32032))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_7, XBMC->GetLocalizedString(32033))); + recordingLimitValues.push_back(std::make_pair(dcrn_keep_10, XBMC->GetLocalizedString(32034))); + } + + /* PVR_Timer.iPreventDuplicateEpisodes values and presentation.*/ + static std::vector > showTypeValues; + if (showTypeValues.size() == 0) + { + showTypeValues.push_back(std::make_pair(dcrs_record_all, XBMC->GetLocalizedString(32035))); + showTypeValues.push_back(std::make_pair(dcrs_record_new_only, XBMC->GetLocalizedString(32036))); + } + + static std::vector > emptyList; + + static const unsigned int TIMER_MANUAL_ATTRIBS = PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE + | PVR_TIMER_TYPE_SUPPORTS_CHANNELS | PVR_TIMER_TYPE_SUPPORTS_START_TIME | PVR_TIMER_TYPE_SUPPORTS_END_TIME + | PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN; + + static const unsigned int TIMER_CREATED_MANUAL_ATTRIBS = PVR_TIMER_TYPE_IS_MANUAL + | PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE | PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN + | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES; + + static const unsigned int TIMER_EPG_ATTRIBS = PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE + | PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN; + + static const unsigned int TIMER_REPEATING_MANUAL_ATTRIBS = PVR_TIMER_TYPE_IS_REPEATING + | PVR_TIMER_TYPE_SUPPORTS_WEEKDAYS | PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS; + + static const unsigned int TIMER_CREATED_REPEATING_MANUAL_ATTRIBS = PVR_TIMER_TYPE_IS_MANUAL + | PVR_TIMER_TYPE_IS_REPEATING | PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE + | PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN | PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS + | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES; + + static const unsigned int TIMER_REPEATING_EPG_ATTRIBS = PVR_TIMER_TYPE_IS_REPEATING + | PVR_TIMER_TYPE_SUPPORTS_START_ANYTIME | PVR_TIMER_TYPE_SUPPORTS_RECORD_ONLY_NEW_EPISODES + | PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS; + + static const unsigned int TIMER_REPEATING_KEYWORD_ATTRIBS = PVR_TIMER_TYPE_SUPPORTS_TITLE_EPG_MATCH + | PVR_TIMER_TYPE_SUPPORTS_CHANNELS | PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN | PVR_TIMER_TYPE_IS_REPEATING + | PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS; + + static const unsigned int TIMER_CREATED_REPEATING_KEYWORD_ATTRIBS = PVR_TIMER_TYPE_SUPPORTS_START_END_MARGIN + | PVR_TIMER_TYPE_IS_REPEATING | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES | PVR_TIMER_TYPE_SUPPORTS_MAX_RECORDINGS; + + static const unsigned int TIMER_MANUAL_CHILD_ATTRIBUTES = PVR_TIMER_TYPE_IS_MANUAL + | PVR_TIMER_TYPE_FORBIDS_EPG_TAG_ON_CREATE | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES; + + static const unsigned int TIMER_EPG_CHILD_ATTRIBUTES = PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE + | PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES; + + static const unsigned int TIMER_KEYWORD_CHILD_ATTRIBUTES = PVR_TIMER_TYPE_FORBIDS_NEW_INSTANCES; + + /* Timer types definition.*/ + static std::vector > timerTypes; + if (timerTypes.size() == 0) + { + timerTypes.push_back( + /* One-shot manual (time and channel based) */ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_ONCE_MANUAL, + /* Attributes. */ + TIMER_MANUAL_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32037), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* One-shot manual (time and channel based) - already created, disable editing of some attributes*/ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_CREATED_ONCE_MANUAL, + /* Attributes. */ + TIMER_CREATED_MANUAL_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32037), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* One-shot epg based */ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_ONCE_EPG, + /* Attributes. */ + TIMER_EPG_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32038), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Read-only one-shot for timers generated by timerec */ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_ONCE_MANUAL_CHILD, + /* Attributes. */ + TIMER_MANUAL_CHILD_ATTRIBUTES, + /* Description. */ + XBMC->GetLocalizedString(32039), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Read-only one-shot for timers generated by autorec */ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_ONCE_EPG_CHILD, + /* Attributes. */ + TIMER_EPG_CHILD_ATTRIBUTES, + /* Description. */ + XBMC->GetLocalizedString(32040), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Child Keyword based */ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_ONCE_KEYWORD_CHILD, + /* Attributes. */ + TIMER_KEYWORD_CHILD_ATTRIBUTES, + /* Description. */ + XBMC->GetLocalizedString(32041), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Repeating manual (time and channel based) Parent */ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_REPEATING_MANUAL, + /* Attributes. */ + TIMER_MANUAL_ATTRIBS | TIMER_REPEATING_MANUAL_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32042), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Repeating manual (time and channel based) Parent - already created, so disable editing of some attributes*/ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_CREATED_REPEATING_MANUAL, + /* Attributes. */ + TIMER_CREATED_REPEATING_MANUAL_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32042), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Repeating epg based Parent*/ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_REPEATING_EPG, + /* Attributes. */ + TIMER_EPG_ATTRIBS | TIMER_REPEATING_EPG_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32043), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Repeating Keyword (Generic) based */ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_REPEATING_KEYWORD, + /* Attributes. */ + TIMER_REPEATING_KEYWORD_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32044), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + + timerTypes.push_back( + /* Repeating Keyword (Generic) based - already created, disable editing of some elements*/ + std::unique_ptr(new TimerType( + /* Type id. */ + TIMER_CREATED_REPEATING_KEYWORD, + /* Attributes. */ + TIMER_CREATED_REPEATING_KEYWORD_ATTRIBS, + /* Description. */ + XBMC->GetLocalizedString(32044), + /* Values definitions for attributes. */ + recordingLimitValues, default_rec_limit_, showTypeValues, default_rec_show_type_))); + } + + /* Copy data to target array. */ + int i = 0; + for (auto it = timerTypes.begin(); it != timerTypes.end(); ++it, ++i) + types[i] = **it; + + *size = timerTypes.size(); + return PVR_ERROR_NO_ERROR; } int DVBLinkClient::GetTimersAmount() @@ -278,10 +533,9 @@ return m_timerCount; } - int DVBLinkClient::GetInternalUniqueIdFromChannelId(const std::string& channelId) { - for (std::map::iterator it=m_channelMap.begin(); it!=m_channelMap.end(); ++it) + for (std::map::iterator it = m_channelMap.begin(); it != m_channelMap.end(); ++it) { Channel * channel = (*it).second; int id = (*it).first; @@ -295,62 +549,256 @@ std::string DVBLinkClient::make_timer_hash(const std::string& timer_id, const std::string& schedule_id) { - std::string res = schedule_id + "#" + timer_id; - return res; + std::string res = schedule_id + "#" + timer_id; + return res; } bool DVBLinkClient::parse_timer_hash(const char* timer_hash, std::string& timer_id, std::string& schedule_id) { - bool ret_val = false; + bool ret_val = false; + + std::string timer = timer_hash; + size_t pos = timer.find('#'); + if (pos != std::string::npos) + { + timer_id = timer.c_str() + pos + 1; + schedule_id = timer.substr(0, pos); + ret_val = true; + } + + return ret_val; +} + +#define SCHEDULE_ID_OFFSET 10000 + +static int get_kodi_idx_from_schedule_idx(int schedule_id) +{ + return schedule_id + SCHEDULE_ID_OFFSET; +} + +static bool is_timer_a_schedule(int idx) +{ + return idx >= SCHEDULE_ID_OFFSET ? true : false; +} + +int DVBLinkClient::GetSchedules(ADDON_HANDLE handle) +{ + int added_count = 0; + int total_count = 0; + + schedule_map_.clear(); + + GetSchedulesRequest request; + StoredSchedules response; - std::string timer = timer_hash; - size_t pos = timer.find('#'); - if (pos != std::string::npos) + DVBLinkRemoteStatusCode status; + std::string error; + if ((status = m_dvblinkRemoteCommunication->GetSchedules(request, response, &error)) != DVBLINK_REMOTE_STATUS_OK) + { + XBMC->Log(LOG_ERROR, "Could not get Schedules (Error code : %d Description : %s)", (int) status, error.c_str()); + return added_count; + } + + int schedule_num = response.GetManualSchedules().size() + response.GetEpgSchedules().size(); + + XBMC->Log(LOG_INFO, "Found %d schedules", schedule_num); + + if (m_showinfomsg) + { + XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32007), schedule_num); + } + + //manual schedules + StoredManualScheduleList& manual_schedules = response.GetManualSchedules(); + for (size_t i = 0; i < manual_schedules.size(); i++) + { + schedule_map_[manual_schedules[i]->GetID()] = schedule_desc(-1, TIMER_CREATED_ONCE_MANUAL, + manual_schedules[i]->MarginBefore, manual_schedules[i]->MarginAfter); + + if (manual_schedules[i]->GetDayMask() != 0) { - timer_id = timer.c_str() + pos + 1; - schedule_id = timer.substr(0, pos); - ret_val = true; + int kodi_idx = get_kodi_idx_from_schedule_idx(total_count); + schedule_map_[manual_schedules[i]->GetID()] = schedule_desc(kodi_idx, TIMER_CREATED_REPEATING_MANUAL, + manual_schedules[i]->MarginBefore, manual_schedules[i]->MarginAfter); + + PVR_TIMER timer; + memset(&timer, 0, sizeof(PVR_TIMER)); + timer.iEpgUid = PVR_TIMER_NO_EPG_UID; + + //misuse strDirectory to keep id of the timer + PVR_STRCPY(timer.strDirectory, manual_schedules[i]->GetID().c_str()); + timer.iClientIndex = kodi_idx; + timer.iClientChannelUid = GetInternalUniqueIdFromChannelId(manual_schedules[i]->GetChannelID()); + timer.state = PVR_TIMER_STATE_SCHEDULED; + timer.iTimerType = TIMER_CREATED_REPEATING_MANUAL; + timer.iMarginStart = manual_schedules[i]->MarginBefore / 60; + timer.iMarginEnd = manual_schedules[i]->MarginAfter / 60; + timer.iMaxRecordings = manual_schedules[i]->RecordingsToKeep; + + strncpy(timer.strTitle, manual_schedules[i]->Title.c_str(), sizeof(timer.strTitle) - 1); + timer.startTime = manual_schedules[i]->GetStartTime(); + timer.endTime = manual_schedules[i]->GetStartTime() + manual_schedules[i]->GetDuration(); + + PVR->TransferTimerEntry(handle, &timer); + XBMC->Log(LOG_INFO, "Added EPG schedule : %s", manual_schedules[i]->GetID().c_str()); + + added_count += 1; } + total_count += 1; + } - return ret_val; -} + //epg based schedules + StoredEpgScheduleList& epg_schedules = response.GetEpgSchedules(); + for (size_t i = 0; i < epg_schedules.size(); i++) + { + schedule_map_[epg_schedules[i]->GetID()] = schedule_desc(-1, TIMER_ONCE_EPG, epg_schedules[i]->MarginBefore, + epg_schedules[i]->MarginAfter); + + if (epg_schedules[i]->Repeat) + { + int kodi_idx = get_kodi_idx_from_schedule_idx(total_count); + schedule_map_[epg_schedules[i]->GetID()] = schedule_desc(kodi_idx, TIMER_REPEATING_EPG, + epg_schedules[i]->MarginBefore, epg_schedules[i]->MarginAfter); + + PVR_TIMER timer; + memset(&timer, 0, sizeof(PVR_TIMER)); + + //misuse strDirectory to keep id of the timer + PVR_STRCPY(timer.strDirectory, epg_schedules[i]->GetID().c_str()); + timer.iClientIndex = kodi_idx; + timer.iClientChannelUid = GetInternalUniqueIdFromChannelId(epg_schedules[i]->GetChannelID()); + timer.state = PVR_TIMER_STATE_SCHEDULED; + timer.iTimerType = TIMER_REPEATING_EPG; + timer.iMarginStart = epg_schedules[i]->MarginBefore / 60; + timer.iMarginEnd = epg_schedules[i]->MarginAfter / 60; + + timer.iMaxRecordings = epg_schedules[i]->RecordingsToKeep; + timer.bStartAnyTime = epg_schedules[i]->RecordSeriesAnytime; + timer.iPreventDuplicateEpisodes = epg_schedules[i]->NewOnly ? dcrs_record_new_only : dcrs_record_all; + strncpy(timer.strTitle, epg_schedules[i]->program_name_.c_str(), sizeof(timer.strTitle) - 1); + + //the original program, used for scheduling, can already be gone for a long time + timer.iEpgUid = PVR_TIMER_NO_EPG_UID; + + PVR->TransferTimerEntry(handle, &timer); + XBMC->Log(LOG_INFO, "Added EPG schedule : %s", epg_schedules[i]->GetID().c_str()); + + added_count += 1; + } + total_count += 1; + } + + //epg based schedules + StoredByPatternScheduleList& bp_schedules = response.GetByPatternSchedules(); + for (size_t i = 0; i < bp_schedules.size(); i++) + { + int kodi_idx = get_kodi_idx_from_schedule_idx(total_count); + schedule_map_[bp_schedules[i]->GetID()] = schedule_desc(kodi_idx, TIMER_CREATED_REPEATING_KEYWORD, + bp_schedules[i]->MarginBefore, bp_schedules[i]->MarginAfter); + + PVR_TIMER timer; + memset(&timer, 0, sizeof(PVR_TIMER)); + + //misuse strDirectory to keep id of the timer + PVR_STRCPY(timer.strDirectory, bp_schedules[i]->GetID().c_str()); + timer.iClientIndex = kodi_idx; + if (bp_schedules[i]->GetChannelID().size() > 0) + timer.iClientChannelUid = GetInternalUniqueIdFromChannelId(bp_schedules[i]->GetChannelID()); + else + timer.iClientChannelUid = PVR_TIMER_ANY_CHANNEL; + + timer.state = PVR_TIMER_STATE_SCHEDULED; + timer.iTimerType = TIMER_CREATED_REPEATING_KEYWORD; + timer.iMarginStart = bp_schedules[i]->MarginBefore / 60; + timer.iMarginEnd = bp_schedules[i]->MarginAfter / 60; + strncpy(timer.strEpgSearchString, bp_schedules[i]->GetKeyphrase().c_str(), sizeof(timer.strEpgSearchString) - 1); + strncpy(timer.strTitle, bp_schedules[i]->GetKeyphrase().c_str(), sizeof(timer.strTitle) - 1); + timer.iEpgUid = PVR_TIMER_NO_EPG_UID; + + PVR->TransferTimerEntry(handle, &timer); + XBMC->Log(LOG_INFO, "Added EPG schedule : %s", bp_schedules[i]->GetID().c_str()); + + added_count += 1; + total_count += 1; + } + + return added_count; +} PVR_ERROR DVBLinkClient::GetTimers(ADDON_HANDLE handle) { PVR_ERROR result = PVR_ERROR_FAILED; PLATFORM::CLockObject critsec(m_mutex); + m_timerCount = 0; + + //get schedules first + int schedule_count = GetSchedules(handle); + GetRecordingsRequest recordingsRequest; RecordingList recordings; DVBLinkRemoteStatusCode status; std::string error; - if ((status = m_dvblinkRemoteCommunication->GetRecordings(recordingsRequest, recordings, &error)) != DVBLINK_REMOTE_STATUS_OK) + if ((status = m_dvblinkRemoteCommunication->GetRecordings(recordingsRequest, recordings, &error)) + != DVBLINK_REMOTE_STATUS_OK) { - XBMC->Log(LOG_ERROR, "Could not get timers (Error code : %d Description : %s)", (int)status, error.c_str()); + XBMC->Log(LOG_ERROR, "Could not get timers (Error code : %d Description : %s)", (int) status, error.c_str()); return result; } XBMC->Log(LOG_INFO, "Found %d timers", recordings.size()); - + if (m_showinfomsg) { XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32007), recordings.size()); } - for (size_t i=0; i < recordings.size(); i++) + unsigned int index = PVR_TIMER_NO_CLIENT_INDEX + 1; + for (size_t i = 0; i < recordings.size(); i++, index++) { Recording* rec = recordings[i]; PVR_TIMER xbmcTimer; memset(&xbmcTimer, 0, sizeof(PVR_TIMER)); + + xbmcTimer.iTimerType = PVR_TIMER_TYPE_NONE; + //find parent schedule type + if (schedule_map_.find(rec->GetScheduleID()) != schedule_map_.end()) + { + int schedule_type = schedule_map_[rec->GetScheduleID()].schedule_kodi_type; + switch (schedule_type) + { + case TIMER_CREATED_ONCE_MANUAL: + case TIMER_ONCE_EPG: + //for once timers - copy parent attribute (there was no separate schedule submitted to kodi) + xbmcTimer.iTimerType = schedule_type; + break; + case TIMER_CREATED_REPEATING_MANUAL: + xbmcTimer.iTimerType = TIMER_ONCE_MANUAL_CHILD; + xbmcTimer.iParentClientIndex = schedule_map_[rec->GetScheduleID()].schedule_kodi_idx; + break; + case TIMER_REPEATING_EPG: + xbmcTimer.iTimerType = TIMER_ONCE_EPG_CHILD; + xbmcTimer.iParentClientIndex = schedule_map_[rec->GetScheduleID()].schedule_kodi_idx; + break; + case TIMER_CREATED_REPEATING_KEYWORD: + xbmcTimer.iTimerType = TIMER_ONCE_KEYWORD_CHILD; + xbmcTimer.iParentClientIndex = schedule_map_[rec->GetScheduleID()].schedule_kodi_idx; + break; + } + //copy margins + xbmcTimer.iMarginStart = schedule_map_[rec->GetScheduleID()].schedule_margin_before / 60; + xbmcTimer.iMarginEnd = schedule_map_[rec->GetScheduleID()].schedule_margin_after / 60; + } + //fake index - xbmcTimer.iClientIndex = i; + xbmcTimer.iClientIndex = index; //misuse strDirectory to keep id of the timer std::string timer_hash = make_timer_hash(rec->GetID(), rec->GetScheduleID()); PVR_STRCPY(xbmcTimer.strDirectory, timer_hash.c_str()); - + xbmcTimer.iClientChannelUid = GetInternalUniqueIdFromChannelId(rec->GetChannelID()); xbmcTimer.state = PVR_TIMER_STATE_SCHEDULED; if (rec->IsActive) @@ -360,11 +808,9 @@ if (!rec->GetProgram().IsRecord) xbmcTimer.state = PVR_TIMER_STATE_CANCELLED; - xbmcTimer.bIsRepeating = rec->GetProgram().IsRepeatRecord; - xbmcTimer.iEpgUid = rec->GetProgram().GetStartTime(); - - xbmcTimer.startTime =rec->GetProgram().GetStartTime(); + + xbmcTimer.startTime = rec->GetProgram().GetStartTime(); xbmcTimer.endTime = rec->GetProgram().GetStartTime() + rec->GetProgram().GetDuration(); PVR_STRCPY(xbmcTimer.strTitle, rec->GetProgram().GetTitle().c_str()); PVR_STRCPY(xbmcTimer.strSummary, rec->GetProgram().ShortDescription.c_str()); @@ -374,7 +820,8 @@ if (genre_type == EPG_GENRE_USE_STRING) { xbmcTimer.iGenreType = EPG_EVENT_CONTENTMASK_UNDEFINED; - } else + } + else { xbmcTimer.iGenreType = genre_type; xbmcTimer.iGenreSubType = genre_subtype; @@ -384,163 +831,201 @@ XBMC->Log(LOG_INFO, "Added EPG timer : %s", rec->GetProgram().GetTitle().c_str()); } - m_timerCount = recordings.size(); + m_timerCount = recordings.size() + schedule_count; + result = PVR_ERROR_NO_ERROR; return result; } bool DVBLinkClient::get_dvblink_program_id(std::string& channelId, int start_time, std::string& dvblink_program_id) { - bool ret_val = false; + bool ret_val = false; - EpgSearchResult epgSearchResult; - if (DoEPGSearch(epgSearchResult, channelId, start_time, start_time)) + EpgSearchResult epgSearchResult; + if (DoEPGSearch(epgSearchResult, channelId, start_time, start_time)) + { + if (epgSearchResult.size() > 0 && epgSearchResult.at(0)->GetEpgData().size() > 0) { - if (epgSearchResult.size() > 0 && epgSearchResult.at(0)->GetEpgData().size() > 0) - { - dvblink_program_id = epgSearchResult.at(0)->GetEpgData().at(0)->GetID(); - ret_val = true; - } + dvblink_program_id = epgSearchResult.at(0)->GetEpgData().at(0)->GetID(); + ret_val = true; } + } - return ret_val; + return ret_val; } static bool is_bit_set(int bit_num, unsigned char bit_field) { - unsigned char mask = (0x01 << bit_num); - return (bit_field & mask) != 0; + unsigned char mask = (0x01 << bit_num); + return (bit_field & mask) != 0; } PVR_ERROR DVBLinkClient::AddTimer(const PVR_TIMER &timer) { - PVR_ERROR result = PVR_ERROR_FAILED; - PLATFORM::CLockObject critsec(m_mutex); - DVBLinkRemoteStatusCode status; - AddScheduleRequest * addScheduleRequest = NULL; - std::string channelId = m_channelMap[timer.iClientChannelUid]->GetID(); - if (timer.iEpgUid != -1) - { - bool record_series = false; - bool newOnly = true; - bool anytime = true; - int marginBefore = CDialogRecordPref::c_default_margin; - int marginAfter = CDialogRecordPref::c_default_margin; - int numberToKeep = CDialogRecordPref::c_keep_all_recordings; - //do not ask if record is pressed during watching - if (timer.startTime != 0) - { - // ask how to record this program - CDialogRecordPref vWindow(XBMC, GUI); - int dlg_res = vWindow.DoModal(); - if (dlg_res == 1) - { - record_series = vWindow.RecSeries; - newOnly = vWindow.newOnly; - anytime = vWindow.anytime; - marginBefore = vWindow.marginBefore == CDialogRecordPref::c_default_margin ? CDialogRecordPref::c_default_margin : vWindow.marginBefore * 60; - marginAfter = vWindow.marginAfter == CDialogRecordPref::c_default_margin ? CDialogRecordPref::c_default_margin : vWindow.marginAfter * 60;; - numberToKeep = vWindow.numberToKeep; - } else - { - if (dlg_res == 0) - return PVR_ERROR_NO_ERROR; - } - } + PVR_ERROR result = PVR_ERROR_FAILED; + PLATFORM::CLockObject critsec(m_mutex); + DVBLinkRemoteStatusCode status; + AddScheduleRequest * addScheduleRequest = NULL; - std::string dvblink_program_id; - if (get_dvblink_program_id(channelId, timer.iEpgUid, dvblink_program_id)) - { - if (!setting_margins_supported_) - { - marginBefore = CDialogRecordPref::c_default_margin; - marginAfter = CDialogRecordPref::c_default_margin; - } - addScheduleRequest = new AddScheduleByEpgRequest(channelId, dvblink_program_id, record_series, newOnly, anytime, numberToKeep, marginBefore, marginAfter); - } - else - { - return PVR_ERROR_FAILED; - } + int marginBefore = -1; + int marginAfter = -1; + if (setting_margins_supported_) + { + marginBefore = timer.iMarginStart * 60; + marginAfter = timer.iMarginEnd * 60; + } + + int numberToKeep = timer.iMaxRecordings; + if (numberToKeep < 0) + numberToKeep = dcrn_keep_all; + + switch (timer.iTimerType) + { + case TIMER_ONCE_MANUAL: + { + std::string channelId = m_channelMap[timer.iClientChannelUid]->GetID(); + time_t start_time = timer.startTime; + //check for instant recording + if (start_time == 0) + time(&start_time); + + time_t duration = timer.endTime - start_time; + long day_mask = 0; + addScheduleRequest = new AddManualScheduleRequest(channelId, start_time, duration, day_mask, timer.strTitle, 0, + marginBefore, marginAfter); } - else + break; + case TIMER_REPEATING_MANUAL: { - time_t start_time = timer.startTime; - time_t duration = timer.endTime - timer.startTime; - long day_mask = 0; - if (timer.bIsRepeating) + std::string channelId = m_channelMap[timer.iClientChannelUid]->GetID(); + time_t start_time = timer.startTime; + time_t duration = timer.endTime - timer.startTime; + long day_mask = 0; + if (timer.iWeekdays > 0) // repeating timer? + { + //change day mask to DVBLink server format (Sun - first day) + bool bcarry = (timer.iWeekdays & 0x40) == 0x40; + day_mask = (timer.iWeekdays << 1) & 0x7F; + if (bcarry) + day_mask |= 0x01; + //find first now/future time, which matches the day mask + start_time = timer.startTime > timer.firstDay ? timer.startTime : timer.firstDay; + for (size_t i = 0; i < 7; i++) { - //change day mask to DVBLink server format (Sun - first day) - bool bcarry = (timer.iWeekdays & 0x40) == 0x40; - day_mask = (timer.iWeekdays << 1) & 0x7F; - if (bcarry) - day_mask |= 0x01; - //find first now/future time, which matches the day mask - start_time = timer.startTime > timer.firstDay ? timer.startTime : timer.firstDay; - for (size_t i = 0; i < 7; i++) - { - tm* local_start_time = localtime(&start_time); - if (is_bit_set(local_start_time->tm_wday, (unsigned char)day_mask)) - break; - start_time += time_t(24 * 3600); - } + tm* local_start_time = localtime(&start_time); + if (is_bit_set(local_start_time->tm_wday, (unsigned char) day_mask)) + break; + start_time += time_t(24 * 3600); } - addScheduleRequest = new AddManualScheduleRequest(channelId, start_time, duration, day_mask, timer.strTitle); + } + addScheduleRequest = new AddManualScheduleRequest(channelId, start_time, duration, day_mask, timer.strTitle, + numberToKeep, marginBefore, marginAfter); + } + break; + case TIMER_ONCE_EPG: + { + std::string channelId = m_channelMap[timer.iClientChannelUid]->GetID(); + + std::string dvblink_program_id; + if (get_dvblink_program_id(channelId, timer.iEpgUid, dvblink_program_id)) + { + addScheduleRequest = new AddScheduleByEpgRequest(channelId, dvblink_program_id, false, true, true, + dcrn_keep_all, marginBefore, marginAfter); + } + } + break; + case TIMER_REPEATING_EPG: + { + std::string channelId = m_channelMap[timer.iClientChannelUid]->GetID(); + bool record_series = true; + bool newOnly = timer.iPreventDuplicateEpisodes == dcrs_record_all ? false : true; + bool anytime = timer.bStartAnyTime; + + std::string dvblink_program_id; + if (get_dvblink_program_id(channelId, timer.iEpgUid, dvblink_program_id)) + { + addScheduleRequest = new AddScheduleByEpgRequest(channelId, dvblink_program_id, record_series, newOnly, anytime, + numberToKeep, marginBefore, marginAfter); + } + } + break; + case TIMER_REPEATING_KEYWORD: + { + //empty string is "any channel" + std::string channelId; + if (timer.iClientChannelUid != PVR_TIMER_ANY_CHANNEL) + channelId = m_channelMap[timer.iClientChannelUid]->GetID(); + + std::string key_phrase = timer.strEpgSearchString; + long genre_mask = 0; //any genre + + addScheduleRequest = new AddScheduleByPatternRequest(channelId, key_phrase, genre_mask, numberToKeep, + marginBefore, marginAfter); } - + break; + } + + if (addScheduleRequest != NULL) + { std::string error; if ((status = m_dvblinkRemoteCommunication->AddSchedule(*addScheduleRequest, &error)) == DVBLINK_REMOTE_STATUS_OK) { - XBMC->Log(LOG_INFO, "Timer added"); - PVR->TriggerTimerUpdate(); - result = PVR_ERROR_NO_ERROR; + XBMC->Log(LOG_INFO, "Timer added"); + PVR->TriggerTimerUpdate(); + result = PVR_ERROR_NO_ERROR; } else { - result = PVR_ERROR_FAILED; - XBMC->Log(LOG_ERROR, "Could not add timer (Error code : %d Description : %s)", (int)status, error.c_str()); + result = PVR_ERROR_FAILED; + XBMC->Log(LOG_ERROR, "Could not add timer (Error code : %d Description : %s)", (int) status, error.c_str()); } SAFE_DELETE(addScheduleRequest); - return result; + } + else + { + result = PVR_ERROR_FAILED; + } + return result; } PVR_ERROR DVBLinkClient::DeleteTimer(const PVR_TIMER &timer) { PVR_ERROR result = PVR_ERROR_FAILED; PLATFORM::CLockObject critsec(m_mutex); - DVBLinkRemoteStatusCode status; - - //timer id hash is kept in strDirectory! - std::string timer_id; - std::string schedule_id; - parse_timer_hash(timer.strDirectory, timer_id, schedule_id); + DVBLinkRemoteStatusCode status = DVBLINK_REMOTE_STATUS_ERROR; + std::string error; - bool cancel_series = true; - if (timer.bIsRepeating) + switch (timer.iTimerType) { - //show dialog and ask: cancel series or just this episode - CDialogDeleteTimer vWindow(XBMC, GUI, cancel_series); - int dlg_res = vWindow.DoModal(); - if (dlg_res == 1) - { - cancel_series = vWindow.DeleteSeries; - } else - { - if (dlg_res == 0) - return PVR_ERROR_NO_ERROR; - } - } + case TIMER_CREATED_ONCE_MANUAL: + case TIMER_ONCE_EPG: + case TIMER_ONCE_MANUAL_CHILD: + case TIMER_ONCE_EPG_CHILD: + case TIMER_ONCE_KEYWORD_CHILD: + { + //this is a timer + + //timer id hash is kept in strDirectory! + std::string timer_id; + std::string schedule_id; + parse_timer_hash(timer.strDirectory, timer_id, schedule_id); - std::string error; - if (cancel_series) - { - RemoveScheduleRequest removeSchedule(schedule_id); - status = m_dvblinkRemoteCommunication->RemoveSchedule(removeSchedule, &error); - } - else - { RemoveRecordingRequest removeRecording(timer_id); status = m_dvblinkRemoteCommunication->RemoveRecording(removeRecording, &error); + } + break; + case TIMER_CREATED_REPEATING_MANUAL: + case TIMER_REPEATING_EPG: + case TIMER_CREATED_REPEATING_KEYWORD: + { + //this is a schedule + + //schedule id is in the timer.strDirectory + std::string schedule_id = timer.strDirectory; + RemoveScheduleRequest removeSchedule(schedule_id); + status = m_dvblinkRemoteCommunication->RemoveSchedule(removeSchedule, &error); + } + break; } if (status == DVBLINK_REMOTE_STATUS_OK) @@ -551,15 +1036,73 @@ } else { - XBMC->Log(LOG_ERROR, "Timer could not be deleted (Error code : %d Description : %s)", (int)status, error.c_str()); + XBMC->Log(LOG_ERROR, "Timer could not be deleted (Error code : %d Description : %s)", (int) status, error.c_str()); } return result; } PVR_ERROR DVBLinkClient::UpdateTimer(const PVR_TIMER &timer) { - //DVBLink serverdoes not support timer update (e.g. delete/re-create) - return PVR_ERROR_FAILED; + PVR_ERROR result = PVR_ERROR_NO_ERROR; + PLATFORM::CLockObject critsec(m_mutex); + + std::string schedule_id; + switch (timer.iTimerType) + { + case TIMER_CREATED_ONCE_MANUAL: + case TIMER_ONCE_EPG: + { + //this is a timer + + //timer id hash is kept in strDirectory! + std::string timer_id; + parse_timer_hash(timer.strDirectory, timer_id, schedule_id); + } + break; + case TIMER_CREATED_REPEATING_MANUAL: + case TIMER_REPEATING_EPG: + case TIMER_CREATED_REPEATING_KEYWORD: + { + //this is a schedule + + //schedule id is in the timer.strDirectory + schedule_id = timer.strDirectory; + } + break; + case TIMER_ONCE_MANUAL_CHILD: + case TIMER_ONCE_EPG_CHILD: + case TIMER_ONCE_KEYWORD_CHILD: + //children entities are not editable + break; + } + + if (schedule_id.size() > 0) + { + bool new_only = timer.iPreventDuplicateEpisodes == dcrs_record_new_only; + bool recordSeriesAnytime = timer.bStartAnyTime; + int recordingsToKeep = timer.iMaxRecordings; + int margin_before = timer.iMarginStart * 60; + int margin_after = timer.iMarginEnd * 60; + + UpdateScheduleRequest update_request(schedule_id, new_only, recordSeriesAnytime, recordingsToKeep, margin_before, + margin_after); + + std::string error; + DVBLinkRemoteStatusCode status = m_dvblinkRemoteCommunication->UpdateSchedule(update_request, &error); + + if (status == DVBLINK_REMOTE_STATUS_OK) + { + XBMC->Log(LOG_INFO, "Schedule %s was updated", schedule_id.c_str()); + PVR->TriggerTimerUpdate(); + result = PVR_ERROR_NO_ERROR; + } + else + { + XBMC->Log(LOG_ERROR, "Schedule %s update failed (Error code : %d Description : %s)", schedule_id.c_str(), + (int) status, error.c_str()); + } + } + return result; } int DVBLinkClient::GetRecordingsAmount() @@ -577,14 +1120,14 @@ getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = true; GetPlaybackObjectResponse getPlaybackObjectResponse; - - if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, NULL)) == DVBLINK_REMOTE_STATUS_OK) + if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, + NULL)) == DVBLINK_REMOTE_STATUS_OK) { - for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackContainers().begin(); it < getPlaybackObjectResponse.GetPlaybackContainers().end(); it++) + for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackContainers().begin(); + it < getPlaybackObjectResponse.GetPlaybackContainers().end(); it++) { PlaybackContainer * container = (PlaybackContainer *) *it; - - + if (container->GetObjectID().find("F6F08949-2A07-4074-9E9D-423D877270BB") != std::string::npos) { result = container->GetObjectID(); @@ -598,15 +1141,16 @@ PVR_ERROR DVBLinkClient::DeleteRecording(const PVR_RECORDING& recording) { -// PLATFORM::CLockObject critsec(m_mutex); +// PLATFORM::CLockObject critsec(m_mutex); PVR_ERROR result = PVR_ERROR_FAILED; DVBLinkRemoteStatusCode status; RemovePlaybackObjectRequest remoteObj(recording.strRecordingId); - + std::string error; if ((status = m_dvblinkRemoteCommunication->RemovePlaybackObject(remoteObj, &error)) != DVBLINK_REMOTE_STATUS_OK) { - XBMC->Log(LOG_ERROR, "Recording %s could not be deleted (Error code: %d Description : %s)", recording.strTitle, (int)status, error.c_str()); + XBMC->Log(LOG_ERROR, "Recording %s could not be deleted (Error code: %d Description : %s)", recording.strTitle, + (int) status, error.c_str()); return result; } @@ -618,163 +1162,180 @@ static std::string get_subtitle(int season, int episode, const std::string& episode_name, int year) { - std::string se_str; - char buf[1024]; + std::string se_str; + char buf[1024]; - if (season > 0 || episode > 0) + if (season > 0 || episode > 0) + { + se_str += "("; + if (season > 0) { - se_str += "("; - if (season > 0) - { - sprintf(buf, "S%02d", season); - se_str += buf; - } - if (episode > 0) - { - sprintf(buf, "E%02d", episode); - se_str += buf; - } - se_str += ")"; + sprintf(buf, "S%02d", season); + se_str += buf; } - - if (year > 0) + if (episode > 0) { - if (se_str.size() > 0) - se_str += " "; - - se_str += "["; - sprintf(buf, "%04d", year); - se_str += buf; - se_str += "]"; + sprintf(buf, "E%02d", episode); + se_str += buf; } + se_str += ")"; + } - if (episode_name.size() > 0) - { - if (se_str.size() > 0) - se_str += " - "; + if (year > 0) + { + if (se_str.size() > 0) + se_str += " "; - se_str += episode_name; - } + se_str += "["; + sprintf(buf, "%04d", year); + se_str += buf; + se_str += "]"; + } + + if (episode_name.size() > 0) + { + if (se_str.size() > 0) + se_str += " - "; + + se_str += episode_name; + } - return se_str; + return se_str; } PVR_ERROR DVBLinkClient::GetRecordings(ADDON_HANDLE handle) { - PLATFORM::CLockObject critsec(m_mutex); - PVR_ERROR result = PVR_ERROR_FAILED; - DVBLinkRemoteStatusCode status; - m_recording_id_to_url_map.clear(); - - GetPlaybackObjectRequest getPlaybackObjectRequest(m_hostname.c_str(), m_recordingsid_by_date); - getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = true; - GetPlaybackObjectResponse getPlaybackObjectResponse; + PLATFORM::CLockObject critsec(m_mutex); + PVR_ERROR result = PVR_ERROR_FAILED; + DVBLinkRemoteStatusCode status; + m_recording_id_to_url_map.clear(); - std::string error; - if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, &error)) != DVBLINK_REMOTE_STATUS_OK) + GetPlaybackObjectRequest getPlaybackObjectRequest(m_hostname.c_str(), m_recordingsid_by_date); + getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = true; + GetPlaybackObjectResponse getPlaybackObjectResponse; + + std::string error; + if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, + &error)) != DVBLINK_REMOTE_STATUS_OK) + { + XBMC->Log(LOG_ERROR, "Could not get recordings (Error code : %d Description : %s)", (int) status, error.c_str()); + //XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32004), (int)status); + return result; + } + + XBMC->Log(LOG_INFO, "Found %d recordings", getPlaybackObjectResponse.GetPlaybackItems().size()); + + if (m_showinfomsg) + { + XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32009), + getPlaybackObjectResponse.GetPlaybackItems().size()); + } + + std::map schedule_to_num_map; + if (no_group_single_rec_) + { + //build a map with scheule id -> number of recordings + for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackItems().begin(); + it < getPlaybackObjectResponse.GetPlaybackItems().end(); it++) { - XBMC->Log(LOG_ERROR, "Could not get recordings (Error code : %d Description : %s)", (int)status, error.c_str()); - //XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32004), (int)status); - return result; + RecordedTvItem * tvitem = (RecordedTvItem *) *it; + if (tvitem->ScheduleId.size() > 0 && tvitem->SeriesSchedule) + { + if (schedule_to_num_map.find(tvitem->ScheduleId) == schedule_to_num_map.end()) + schedule_to_num_map[tvitem->ScheduleId] = 0; + + schedule_to_num_map[tvitem->ScheduleId] = schedule_to_num_map[tvitem->ScheduleId] + 1; + } } + } - XBMC->Log(LOG_INFO, "Found %d recordings", getPlaybackObjectResponse.GetPlaybackItems().size()); + for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackItems().begin(); + it < getPlaybackObjectResponse.GetPlaybackItems().end(); it++) + { + RecordedTvItem * tvitem = (RecordedTvItem *) *it; + PVR_RECORDING xbmcRecording; + memset(&xbmcRecording, 0, sizeof(PVR_RECORDING)); + + PVR_STRCPY(xbmcRecording.strRecordingId, tvitem->GetObjectID().c_str()); + + std::string title = tvitem->GetMetadata().GetTitle(); + if (m_add_episode_to_rec_title) + { + //form a title as "name - (SxxExx) subtitle" because XBMC does not display episode/season information almost anywhere + std::string se_str = get_subtitle(tvitem->GetMetadata().SeasonNumber, tvitem->GetMetadata().EpisodeNumber, + tvitem->GetMetadata().SubTitle, (int) tvitem->GetMetadata().Year); + if (se_str.size() > 0) + title += " - " + se_str; + } + PVR_STRCPY(xbmcRecording.strTitle, title.c_str()); + PVR_STRCPY(xbmcRecording.strEpisodeName, tvitem->GetMetadata().SubTitle.c_str()); + if (tvitem->GetMetadata().SeasonNumber > 0) + xbmcRecording.iSeriesNumber = tvitem->GetMetadata().SeasonNumber; + else + xbmcRecording.iSeriesNumber = -1; - if (m_showinfomsg) + if (tvitem->GetMetadata().EpisodeNumber > 0) + xbmcRecording.iEpisodeNumber = tvitem->GetMetadata().EpisodeNumber; + else + xbmcRecording.iEpisodeNumber = -1; + xbmcRecording.iYear = tvitem->GetMetadata().Year; + + xbmcRecording.recordingTime = tvitem->GetMetadata().GetStartTime(); + PVR_STRCPY(xbmcRecording.strPlot, tvitem->GetMetadata().ShortDescription.c_str()); + PVR_STRCPY(xbmcRecording.strPlotOutline, tvitem->GetMetadata().SubTitle.c_str()); + // PVR_STRCPY(xbmcRecording.strStreamURL, tvitem->GetPlaybackUrl().c_str()); + m_recording_id_to_url_map[xbmcRecording.strRecordingId] = tvitem->GetPlaybackUrl(); + xbmcRecording.iDuration = tvitem->GetMetadata().GetDuration(); + PVR_STRCPY(xbmcRecording.strChannelName, tvitem->ChannelName.c_str()); + PVR_STRCPY(xbmcRecording.strThumbnailPath, tvitem->GetThumbnailUrl().c_str()); + int genre_type, genre_subtype; + SetEPGGenre(tvitem->GetMetadata(), genre_type, genre_subtype); + if (genre_type == EPG_GENRE_USE_STRING) { - XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32009), getPlaybackObjectResponse.GetPlaybackItems().size()); + xbmcRecording.iGenreType = EPG_EVENT_CONTENTMASK_UNDEFINED; } - - std::map schedule_to_num_map; - if (no_group_single_rec_) + else { - //build a map with scheule id -> number of recordings - for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackItems().begin(); it < getPlaybackObjectResponse.GetPlaybackItems().end(); it++) - { - RecordedTvItem * tvitem = (RecordedTvItem *)*it; - if (tvitem->ScheduleId.size() > 0 && tvitem->SeriesSchedule) - { - if (schedule_to_num_map.find(tvitem->ScheduleId) == schedule_to_num_map.end()) - schedule_to_num_map[tvitem->ScheduleId] = 0; - - schedule_to_num_map[tvitem->ScheduleId] = schedule_to_num_map[tvitem->ScheduleId] + 1; - } - } + xbmcRecording.iGenreType = genre_type; + xbmcRecording.iGenreSubType = genre_subtype; } - for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackItems().begin(); it < getPlaybackObjectResponse.GetPlaybackItems().end(); it++) + if (m_group_recordings_by_series) { - RecordedTvItem * tvitem = (RecordedTvItem *)*it; - PVR_RECORDING xbmcRecording; - memset(&xbmcRecording, 0, sizeof(PVR_RECORDING)); - - PVR_STRCPY(xbmcRecording.strRecordingId, tvitem->GetObjectID().c_str()); - - std::string title = tvitem->GetMetadata().GetTitle(); - if (m_add_episode_to_rec_title) - { - //form a title as "name - (SxxExx) subtitle" because XBMC does not display episode/season information almost anywhere - std::string se_str = get_subtitle(tvitem->GetMetadata().SeasonNumber, tvitem->GetMetadata().EpisodeNumber, tvitem->GetMetadata().SubTitle, (int)tvitem->GetMetadata().Year); - if (se_str.size() > 0) - title += " - " + se_str; - } - PVR_STRCPY(xbmcRecording.strTitle, title.c_str()); + if (tvitem->ScheduleId.size() > 0 && tvitem->SeriesSchedule && tvitem->ScheduleName.size() > 0) + { + bool b = true; - xbmcRecording.recordingTime = tvitem->GetMetadata().GetStartTime(); - PVR_STRCPY(xbmcRecording.strPlot, tvitem->GetMetadata().ShortDescription.c_str()); - PVR_STRCPY(xbmcRecording.strPlotOutline, tvitem->GetMetadata().SubTitle.c_str()); - // PVR_STRCPY(xbmcRecording.strStreamURL, tvitem->GetPlaybackUrl().c_str()); - m_recording_id_to_url_map[xbmcRecording.strRecordingId] = tvitem->GetPlaybackUrl(); - xbmcRecording.iDuration = tvitem->GetMetadata().GetDuration(); - PVR_STRCPY(xbmcRecording.strChannelName, tvitem->ChannelName.c_str()); - PVR_STRCPY(xbmcRecording.strThumbnailPath, tvitem->GetThumbnailUrl().c_str()); - int genre_type, genre_subtype; - SetEPGGenre(tvitem->GetMetadata(), genre_type, genre_subtype); - if (genre_type == EPG_GENRE_USE_STRING) - { - xbmcRecording.iGenreType = EPG_EVENT_CONTENTMASK_UNDEFINED; - } - else - { - xbmcRecording.iGenreType = genre_type; - xbmcRecording.iGenreSubType = genre_subtype; - } + if (no_group_single_rec_ && schedule_to_num_map.find(tvitem->ScheduleId) != schedule_to_num_map.end() + && schedule_to_num_map[tvitem->ScheduleId] < 2) + b = false; - if (m_group_recordings_by_series) - { - if (tvitem->ScheduleId.size() > 0 && tvitem->SeriesSchedule && tvitem->ScheduleName.size() > 0) - { - bool b = true; - - if (no_group_single_rec_ && schedule_to_num_map.find(tvitem->ScheduleId) != schedule_to_num_map.end() && schedule_to_num_map[tvitem->ScheduleId] < 2) - b = false; - - if (b) - PVR_STRCPY(xbmcRecording.strDirectory, tvitem->ScheduleName.c_str()); - } - } + if (b) + PVR_STRCPY(xbmcRecording.strDirectory, tvitem->ScheduleName.c_str()); + } + } - PVR->TransferRecordingEntry(handle, &xbmcRecording); + PVR->TransferRecordingEntry(handle, &xbmcRecording); - } - m_recordingCount = getPlaybackObjectResponse.GetPlaybackItems().size(); - result = PVR_ERROR_NO_ERROR; - return result; + } + m_recordingCount = getPlaybackObjectResponse.GetPlaybackItems().size(); + result = PVR_ERROR_NO_ERROR; + return result; } bool DVBLinkClient::GetRecordingURL(const char* recording_id, std::string& url) { - bool ret_val = false; - if (m_recording_id_to_url_map.find(recording_id) != m_recording_id_to_url_map.end()) - { - url = m_recording_id_to_url_map[recording_id]; - ret_val = true; - } - else - { - XBMC->Log(LOG_ERROR, "Could not get playback url for recording %s)", recording_id); - } - return ret_val; + bool ret_val = false; + if (m_recording_id_to_url_map.find(recording_id) != m_recording_id_to_url_map.end()) + { + url = m_recording_id_to_url_map[recording_id]; + ret_val = true; + } + else + { + XBMC->Log(LOG_ERROR, "Could not get playback url for recording %s)", recording_id); + } + return ret_val; } void DVBLinkClient::GetDriveSpace(long long *iTotal, long long *iUsed) @@ -785,14 +1346,14 @@ *iUsed = 0; RecordingSettings settings; DVBLinkRemoteStatusCode status; - if ((status = m_dvblinkRemoteCommunication->GetRecordingSettings(recordingsettingsrequest, settings, NULL)) == DVBLINK_REMOTE_STATUS_OK) + if ((status = m_dvblinkRemoteCommunication->GetRecordingSettings(recordingsettingsrequest, settings, NULL)) + == DVBLINK_REMOTE_STATUS_OK) { *iTotal = settings.TotalSpace; *iUsed = (settings.TotalSpace - settings.AvailableSpace); } } - int DVBLinkClient::GetCurrentChannelId() { return m_currentChannelId; @@ -802,10 +1363,12 @@ { DVBLinkRemoteStatusCode status; std::string error; - if ((status = m_dvblinkRemoteCommunication->PlayChannel(*streamRequest, *m_stream, &error)) != DVBLINK_REMOTE_STATUS_OK) + if ((status = m_dvblinkRemoteCommunication->PlayChannel(*streamRequest, *m_stream, &error)) + != DVBLINK_REMOTE_STATUS_OK) { - XBMC->Log(LOG_ERROR, "Could not start streaming for channel %i (Error code : %d)", channel.iUniqueId, (int)status,error.c_str()); - XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32010), channel.strChannelName, (int)status); + XBMC->Log(LOG_ERROR, "Could not start streaming for channel %i (Error code : %d)", channel.iUniqueId, (int) status, + error.c_str()); + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32010), channel.strChannelName, (int) status); return false; } @@ -814,105 +1377,107 @@ return true; } -bool DVBLinkClient::OpenLiveStream(const PVR_CHANNEL &channel, bool use_timeshift, bool use_transcoder, int width, int height, int bitrate, std::string audiotrack) +bool DVBLinkClient::OpenLiveStream(const PVR_CHANNEL &channel, bool use_timeshift, bool use_transcoder, int width, + int height, int bitrate, std::string audiotrack) { - bool ret_val = false; + bool ret_val = false; - //if transcoding is requested and no transcoder is supported return false - if (use_transcoder && !transcoding_supported_) - { - XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32024)); - return false; - } - - PLATFORM::CLockObject critsec(m_mutex); + //if transcoding is requested and no transcoder is supported return false + if (use_transcoder && !transcoding_supported_) + { + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32024)); + return false; + } - if (m_live_streamer) - { - SAFE_DELETE(m_live_streamer); - } - //time-shifted playback always uses raw http stream type - no transcoding option is possible now - if (use_timeshift) - m_live_streamer = new TimeShiftBuffer(XBMC); - else - m_live_streamer = new LiveTVStreamer(XBMC); + PLATFORM::CLockObject critsec(m_mutex); - //adjust transcoded height and width if needed - int w = width == 0 ? GUI->GetScreenWidth() : width; - int h = height == 0 ? GUI->GetScreenHeight() : height; + if (m_live_streamer) + { + SAFE_DELETE(m_live_streamer); + } + //time-shifted playback always uses raw http stream type - no transcoding option is possible now + if (use_timeshift) + m_live_streamer = new TimeShiftBuffer(XBMC); + else + m_live_streamer = new LiveTVStreamer(XBMC); + + //adjust transcoded height and width if needed + int w = width == 0 ? GUI->GetScreenWidth() : width; + int h = height == 0 ? GUI->GetScreenHeight() : height; - Channel * c = m_channelMap[channel.iUniqueId]; + Channel * c = m_channelMap[channel.iUniqueId]; - StreamRequest* sr = m_live_streamer->GetStreamRequest(c->GetDvbLinkID(), m_clientname, m_hostname, use_transcoder, w, h, bitrate, audiotrack); - if (sr != NULL) + StreamRequest* sr = m_live_streamer->GetStreamRequest(c->GetDvbLinkID(), m_clientname, m_hostname, use_transcoder, w, + h, bitrate, audiotrack); + if (sr != NULL) + { + std::string url; + if (StartStreaming(channel, sr, url)) { - std::string url; - if (StartStreaming(channel, sr, url)) - { - m_live_streamer->Start(url); - ret_val = true; - } - else - { - delete m_live_streamer; - m_live_streamer = NULL; - } - delete sr; + m_live_streamer->Start(url); + ret_val = true; } else { - XBMC->Log(LOG_ERROR, "m_live_streamer->GetStreamRequest returned NULL. (channel %i)", channel.iUniqueId); - delete m_live_streamer; - m_live_streamer = NULL; + delete m_live_streamer; + m_live_streamer = NULL; } - return ret_val; + delete sr; + } + else + { + XBMC->Log(LOG_ERROR, "m_live_streamer->GetStreamRequest returned NULL. (channel %i)", channel.iUniqueId); + delete m_live_streamer; + m_live_streamer = NULL; + } + return ret_val; } int DVBLinkClient::ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) { - if (m_live_streamer) - return m_live_streamer->ReadData(pBuffer, iBufferSize); + if (m_live_streamer) + return m_live_streamer->ReadData(pBuffer, iBufferSize); return 0; } long long DVBLinkClient::SeekLiveStream(long long iPosition, int iWhence) { - if (m_live_streamer) - return m_live_streamer->Seek(iPosition, iWhence); + if (m_live_streamer) + return m_live_streamer->Seek(iPosition, iWhence); return 0; } long long DVBLinkClient::PositionLiveStream(void) { - if (m_live_streamer) - return m_live_streamer->Position(); + if (m_live_streamer) + return m_live_streamer->Position(); return 0; } long long DVBLinkClient::LengthLiveStream(void) { - if (m_live_streamer) - return m_live_streamer->Length(); + if (m_live_streamer) + return m_live_streamer->Length(); return 0; } time_t DVBLinkClient::GetPlayingTime() { - if (m_live_streamer) - return m_live_streamer->GetPlayingTime(); + if (m_live_streamer) + return m_live_streamer->GetPlayingTime(); return 0; } time_t DVBLinkClient::GetBufferTimeStart() { - if (m_live_streamer) - return m_live_streamer->GetBufferTimeStart(); + if (m_live_streamer) + return m_live_streamer->GetBufferTimeStart(); return 0; } time_t DVBLinkClient::GetBufferTimeEnd() { - if (m_live_streamer) - return m_live_streamer->GetBufferTimeEnd(); + if (m_live_streamer) + return m_live_streamer->GetBufferTimeEnd(); return 0; } @@ -920,12 +1485,12 @@ { PLATFORM::CLockObject critsec(m_mutex); StopStreamRequest * request; - + if (m_live_streamer != NULL) { - m_live_streamer->Stop(); - SAFE_DELETE(m_live_streamer); - m_live_streamer = NULL; + m_live_streamer->Stop(); + SAFE_DELETE(m_live_streamer); + m_live_streamer = NULL; } if (bUseChlHandle) @@ -941,10 +1506,9 @@ std::string error; if ((status = m_dvblinkRemoteCommunication->StopChannel(*request, &error)) != DVBLINK_REMOTE_STATUS_OK) { - XBMC->Log(LOG_ERROR, "Could not stop stream (Error code : %d Description : %s)", (int)status, error.c_str()); + XBMC->Log(LOG_ERROR, "Could not stop stream (Error code : %d Description : %s)", (int) status, error.c_str()); } - SAFE_DELETE(request); } @@ -965,7 +1529,6 @@ genre_subtype = 0x03; } - if (metadata.IsCatEducational) { genre_type = EPG_EVENT_CONTENTMASK_EDUCATIONALSCIENCE; @@ -979,7 +1542,9 @@ if (metadata.IsCatMovie) { genre_type = EPG_EVENT_CONTENTMASK_MOVIEDRAMA; - genre_subtype =metadata.IsCatThriller ? 0x01 : metadata.IsCatScifi ? 0x03 :metadata.IsCatHorror ? 0x03 : metadata.IsCatComedy ? 0x04 : metadata.IsCatSoap ? 0x05 : metadata.IsCatRomance ? 0x06 :metadata.IsCatDrama ? 0x08 : 0; + genre_subtype = metadata.IsCatThriller ? 0x01 : metadata.IsCatScifi ? 0x03 : metadata.IsCatHorror ? 0x03 : + metadata.IsCatComedy ? 0x04 : metadata.IsCatSoap ? 0x05 : metadata.IsCatRomance ? 0x06 : + metadata.IsCatDrama ? 0x08 : 0; } if (metadata.IsCatKids) @@ -998,7 +1563,8 @@ } } -bool DVBLinkClient::DoEPGSearch(EpgSearchResult& epgSearchResult, const std::string& channelId, const long startTime, const long endTime, const std::string& programId) +bool DVBLinkClient::DoEPGSearch(EpgSearchResult& epgSearchResult, const std::string& channelId, const long startTime, + const long endTime, const std::string& programId) { PLATFORM::CLockObject critsec(m_mutex); EpgSearchRequest epgSearchRequest(channelId, startTime, endTime); @@ -1009,7 +1575,8 @@ DVBLinkRemoteStatusCode status; - if ((status = m_dvblinkRemoteCommunication->SearchEpg(epgSearchRequest, epgSearchResult, NULL)) == DVBLINK_REMOTE_STATUS_OK) + if ((status = m_dvblinkRemoteCommunication->SearchEpg(epgSearchRequest, epgSearchResult, NULL)) + == DVBLINK_REMOTE_STATUS_OK) { return true; } @@ -1023,43 +1590,43 @@ Channel * c = m_channelMap[channel.iUniqueId]; EpgSearchResult epgSearchResult; - if (DoEPGSearch(epgSearchResult,c->GetID(), iStart, iEnd)) + if (DoEPGSearch(epgSearchResult, c->GetID(), iStart, iEnd)) { - for (std::vector::iterator it = epgSearchResult.begin(); it < epgSearchResult.end(); it++) + for (std::vector::iterator it = epgSearchResult.begin(); it < epgSearchResult.end(); it++) { - ChannelEpgData* channelEpgData = (ChannelEpgData*)*it; + ChannelEpgData* channelEpgData = (ChannelEpgData*) *it; EpgData& epgData = channelEpgData->GetEpgData(); - for (std::vector::iterator pIt = epgData.begin(); pIt < epgData.end(); pIt++) + for (std::vector::iterator pIt = epgData.begin(); pIt < epgData.end(); pIt++) { - Program* p = (Program*)*pIt; + Program* p = (Program*) *pIt; EPG_TAG broadcast; memset(&broadcast, 0, sizeof(EPG_TAG)); broadcast.iUniqueBroadcastId = p->GetStartTime(); broadcast.strTitle = p->GetTitle().c_str(); - broadcast.iChannelNumber = channel.iChannelNumber; - broadcast.startTime = p->GetStartTime(); - broadcast.endTime = p->GetStartTime() + p->GetDuration(); - broadcast.strPlot = p->ShortDescription.c_str(); - broadcast.strCast = p->Actors.c_str(); - broadcast.strDirector = p->Directors.c_str(); - broadcast.strWriter = p->Writers.c_str(); - broadcast.iYear = p->Year; - broadcast.strIconPath = p->Image.c_str(); - broadcast.iGenreType = 0; - broadcast.iGenreSubType = 0; + broadcast.iChannelNumber = channel.iChannelNumber; + broadcast.startTime = p->GetStartTime(); + broadcast.endTime = p->GetStartTime() + p->GetDuration(); + broadcast.strPlot = p->ShortDescription.c_str(); + broadcast.strCast = p->Actors.c_str(); + broadcast.strDirector = p->Directors.c_str(); + broadcast.strWriter = p->Writers.c_str(); + broadcast.iYear = p->Year; + broadcast.strIconPath = p->Image.c_str(); + broadcast.iGenreType = 0; + broadcast.iGenreSubType = 0; broadcast.strGenreDescription = ""; - broadcast.firstAired = 0; - broadcast.iParentalRating = 0; - broadcast.iStarRating = p->Rating; - broadcast.bNotify = false; - broadcast.iSeriesNumber = p->SeasonNumber; - broadcast.iEpisodeNumber = p->EpisodeNumber; - broadcast.iEpisodePartNumber = 0; - broadcast.strEpisodeName = p->SubTitle.c_str(); - broadcast.strIMDBNumber = NULL; // unused - broadcast.strOriginalTitle = NULL; // unused - broadcast.strPlotOutline = NULL; + broadcast.firstAired = 0; + broadcast.iParentalRating = 0; + broadcast.iStarRating = p->Rating; + broadcast.bNotify = false; + broadcast.iSeriesNumber = p->SeasonNumber; + broadcast.iEpisodeNumber = p->EpisodeNumber; + broadcast.iEpisodePartNumber = 0; + broadcast.strEpisodeName = p->SubTitle.c_str(); + broadcast.strIMDBNumber = NULL; // unused + broadcast.strOriginalTitle = NULL; // unused + broadcast.strPlotOutline = NULL; int genre_type, genre_subtype; SetEPGGenre(*p, genre_type, genre_subtype); @@ -1069,6 +1636,8 @@ else broadcast.iGenreSubType = genre_subtype; + broadcast.iFlags = EPG_TAG_FLAG_UNDEFINED; + PVR->TransferEpgEntry(handle, &broadcast); } } @@ -1076,7 +1645,8 @@ } else { - XBMC->Log(LOG_NOTICE, "Not EPG data found for channel : %s with id : %i", channel.strChannelName, channel.iUniqueId); + XBMC->Log(LOG_NOTICE, "Not EPG data found for channel : %s with id : %i", channel.strChannelName, + channel.iUniqueId); } return result; } @@ -1088,14 +1658,14 @@ { StopThread(); } - + SAFE_DELETE(m_dvblinkRemoteCommunication); SAFE_DELETE(m_httpClient); SAFE_DELETE(m_channels); SAFE_DELETE(m_stream); if (m_live_streamer) { - m_live_streamer->Stop(); - SAFE_DELETE(m_live_streamer); + m_live_streamer->Stop(); + SAFE_DELETE(m_live_streamer); } } diff -Nru kodi-pvr-dvblink-1.10.9/src/DVBLinkClient.h kodi-pvr-dvblink-2.0.4/src/DVBLinkClient.h --- kodi-pvr-dvblink-1.10.9/src/DVBLinkClient.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/DVBLinkClient.h 2016-01-10 21:41:24.000000000 +0000 @@ -22,7 +22,7 @@ * http://www.gnu.org/copyleft/gpl.html * */ - + #pragma once #include "platform/os.h" @@ -45,11 +45,63 @@ typedef std::map recording_id_to_url_map_t; -class DVBLinkClient : public PLATFORM::CThread, public dvblinkremote::DVBLinkRemoteLocker +/* timer type ids */ +#define TIMER_ONCE_MANUAL (PVR_TIMER_TYPE_NONE + 1) +#define TIMER_ONCE_EPG (PVR_TIMER_TYPE_NONE + 2) +#define TIMER_ONCE_MANUAL_CHILD (PVR_TIMER_TYPE_NONE + 3) +#define TIMER_ONCE_EPG_CHILD (PVR_TIMER_TYPE_NONE + 4) +#define TIMER_ONCE_KEYWORD_CHILD (PVR_TIMER_TYPE_NONE + 5) +#define TIMER_REPEATING_MANUAL (PVR_TIMER_TYPE_NONE + 6) +#define TIMER_REPEATING_EPG (PVR_TIMER_TYPE_NONE + 7) +#define TIMER_REPEATING_KEYWORD (PVR_TIMER_TYPE_NONE + 8) +#define TIMER_CREATED_ONCE_MANUAL (PVR_TIMER_TYPE_NONE + 9) +#define TIMER_CREATED_REPEATING_MANUAL (PVR_TIMER_TYPE_NONE + 10) +#define TIMER_CREATED_REPEATING_KEYWORD (PVR_TIMER_TYPE_NONE + 11) + +enum dvblink_client_rec_num_e +{ + dcrn_keep_all = 0, + dcrn_keep_1 = 1, + dcrn_keep_2 = 2, + dcrn_keep_3 = 3, + dcrn_keep_4 = 4, + dcrn_keep_5 = 5, + dcrn_keep_6 = 6, + dcrn_keep_7 = 7, + dcrn_keep_10 = 10 +}; + +enum dvblink_client_rec_showtype_e +{ + dcrs_record_all = 0, dcrs_record_new_only = 1 +}; + +struct schedule_desc +{ + schedule_desc(int idx, int type, int margin_before, int margin_after) + { + schedule_kodi_idx = idx; + schedule_kodi_type = type; + schedule_margin_before = margin_before; + schedule_margin_after = margin_after; + } + + schedule_desc() + { + } + + int schedule_kodi_idx; + int schedule_kodi_type; + int schedule_margin_before; + int schedule_margin_after; +}; + +class DVBLinkClient: public PLATFORM::CThread, public dvblinkremote::DVBLinkRemoteLocker { public: - DVBLinkClient(ADDON::CHelper_libXBMC_addon* xbmc, CHelper_libXBMC_pvr* pvr, CHelper_libKODI_guilib* gui, std::string clientname, std::string hostname, long port, - bool showinfomsg, std::string username, std::string password, bool add_episode_to_rec_title, bool group_recordings_by_series, bool no_group_single_rec); + DVBLinkClient(ADDON::CHelper_libXBMC_addon* xbmc, CHelper_libXBMC_pvr* pvr, CHelper_libKODI_guilib* gui, + std::string clientname, std::string hostname, long port, bool showinfomsg, std::string username, + std::string password, bool add_episode_to_rec_title, bool group_recordings_by_series, bool no_group_single_rec); ~DVBLinkClient(void); int GetChannelsAmount(); PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio); @@ -57,6 +109,7 @@ int GetRecordingsAmount(); PVR_ERROR GetRecordings(ADDON_HANDLE handle); PVR_ERROR DeleteRecording(const PVR_RECORDING& recording); + PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size); int GetTimersAmount(); PVR_ERROR GetTimers(ADDON_HANDLE handle); PVR_ERROR AddTimer(const PVR_TIMER &timer); @@ -67,7 +120,8 @@ PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group); bool GetStatus(); bool StartStreaming(const PVR_CHANNEL &channel, dvblinkremote::StreamRequest* streamRequest, std::string& stream_url); - bool OpenLiveStream(const PVR_CHANNEL &channel, bool use_timeshift, bool use_transcoder, int width, int height, int bitrate, std::string audiotrack); + bool OpenLiveStream(const PVR_CHANNEL &channel, bool use_timeshift, bool use_transcoder, int width, int height, + int bitrate, std::string audiotrack); void StopStreaming(bool bUseChlHandle); int GetCurrentChannelId(); void GetDriveSpace(long long *iTotal, long long *iUsed); @@ -81,40 +135,42 @@ bool GetRecordingURL(const char* recording_id, std::string& url); private: - bool DoEPGSearch(dvblinkremote::EpgSearchResult& epgSearchResult, const std::string& channelId, const long startTime, const long endTime, const std::string & programId = ""); + bool DoEPGSearch(dvblinkremote::EpgSearchResult& epgSearchResult, const std::string& channelId, const long startTime, + const long endTime, const std::string & programId = ""); void SetEPGGenre(dvblinkremote::ItemMetadata& metadata, int& genre_type, int& genre_subtype); std::string GetBuildInRecorderObjectID(); std::string GetRecordedTVByDateObjectID(const std::string& buildInRecoderObjectID); int GetInternalUniqueIdFromChannelId(const std::string& channelId); virtual void * Process(void); bool get_dvblink_program_id(std::string& channelId, int start_time, std::string& dvblink_program_id); + int GetSchedules(ADDON_HANDLE handle); std::string make_timer_hash(const std::string& timer_id, const std::string& schedule_id); bool parse_timer_hash(const char* timer_hash, std::string& timer_id, std::string& schedule_id); virtual void lock() { - m_comm_mutex.Lock(); + m_comm_mutex.Lock(); } virtual void unlock() { - m_comm_mutex.Unlock(); + m_comm_mutex.Unlock(); } - HttpPostClient* m_httpClient; + HttpPostClient* m_httpClient; dvblinkremote::IDVBLinkRemoteConnection* m_dvblinkRemoteCommunication; bool m_connected; - std::map m_channelMap; + std::map m_channelMap; dvblinkremote::Stream * m_stream; int m_currentChannelId; dvblinkremote::ChannelList* m_channels; long m_timerCount; long m_recordingCount; - PLATFORM::CMutex m_mutex; + PLATFORM::CMutex m_mutex; CHelper_libXBMC_pvr *PVR; - ADDON::CHelper_libXBMC_addon *XBMC; - CHelper_libKODI_guilib *GUI; + ADDON::CHelper_libXBMC_addon *XBMC; + CHelper_libKODI_guilib *GUI; std::string m_clientname; std::string m_hostname; LiveStreamerBase* m_live_streamer; @@ -133,6 +189,7 @@ std::map inverse_channel_map_; bool no_group_single_rec_; PLATFORM::CMutex m_comm_mutex; + std::map schedule_map_; }; /*! diff -Nru kodi-pvr-dvblink-1.10.9/src/HttpPostClient.cpp kodi-pvr-dvblink-2.0.4/src/HttpPostClient.cpp --- kodi-pvr-dvblink-1.10.9/src/HttpPostClient.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/HttpPostClient.cpp 2016-01-10 21:41:24.000000000 +0000 @@ -21,7 +21,7 @@ * http://www.gnu.org/copyleft/gpl.html * */ - + #include "HttpPostClient.h" #include "base64.h" @@ -29,25 +29,22 @@ using namespace ADDON; #ifdef TARGET_WINDOWS - #pragma warning(disable:4005) // Disable "warning C4005: '_WINSOCKAPI_' : macro redefinition" - #include - #pragma warning(default:4005) - #define close(s) closesocket(s) +#pragma warning(disable:4005) // Disable "warning C4005: '_WINSOCKAPI_' : macro redefinition" +#include +#pragma warning(default:4005) +#define close(s) closesocket(s) #else - #include - #include - #include - #include - #include +#include +#include +#include +#include +#include #endif - - #define SEND_RQ(MSG) \ /*cout<> 4), *pbuf++ = to_hex(*pstr & 15); pstr++; } @@ -80,7 +77,8 @@ return buf; } -HttpPostClient::HttpPostClient(CHelper_libXBMC_addon *XBMC, const std::string& server, const int serverport, const std::string& username, const std::string& password) +HttpPostClient::HttpPostClient(CHelper_libXBMC_addon *XBMC, const std::string& server, const int serverport, + const std::string& username, const std::string& password) { this->XBMC = XBMC; m_server = server; @@ -97,26 +95,27 @@ char content_header[100]; buffer.append("POST /cs/ HTTP/1.0\r\n"); - sprintf(content_header,"Host: %s:%d\r\n",m_server.c_str(),(int)m_serverport); + sprintf(content_header, "Host: %s:%d\r\n", m_server.c_str(), (int) m_serverport); buffer.append(content_header); buffer.append("Content-Type: application/x-www-form-urlencoded\r\n"); if (m_username.compare("") != 0) { - sprintf(content_header,"%s:%s",m_username.c_str(),m_password.c_str()); - sprintf(content_header, "Authorization: Basic %s\r\n",base64_encode((const char*)content_header,strlen(content_header)).c_str()); + sprintf(content_header, "%s:%s", m_username.c_str(), m_password.c_str()); + sprintf(content_header, "Authorization: Basic %s\r\n", + base64_encode((const char*) content_header, strlen(content_header)).c_str()); buffer.append(content_header); } - sprintf(content_header,"Content-Length: %ld\r\n",request.ContentLength); + sprintf(content_header, "Content-Length: %ld\r\n", request.ContentLength); buffer.append(content_header); buffer.append("\r\n"); buffer.append(request.GetRequestData()); - #ifdef TARGET_WINDOWS +#ifdef TARGET_WINDOWS { - WSADATA WsaData; + WSADATA WsaData; WSAStartup(0x0101, &WsaData); } - #endif +#endif sockaddr_in sin; int sock = socket(AF_INET, SOCK_STREAM, 0); @@ -125,16 +124,16 @@ return -100; } sin.sin_family = AF_INET; - sin.sin_port = htons((unsigned short)m_serverport); + sin.sin_port = htons((unsigned short) m_serverport); struct hostent * host_addr = gethostbyname(m_server.c_str()); - if (host_addr==NULL) + if (host_addr == NULL) { return -103; } - sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ; + sin.sin_addr.s_addr = *((int*) *host_addr->h_addr_list); - if (connect(sock, (const struct sockaddr *)&sin, sizeof(sockaddr_in)) == -1 ) + if (connect(sock, (const struct sockaddr *) &sin, sizeof(sockaddr_in)) == -1) { return -101; } @@ -146,75 +145,76 @@ int read_size = 0; std::string response; while ((read_size = recv(sock, read_buffer, read_buffer_size, 0)) > 0) - response.append(read_buffer, read_buffer + read_size); + response.append(read_buffer, read_buffer + read_size); close(sock); if (response.size() > 0) { - //header - std::string::size_type n = response.find("\r\n"); - if (n != std::string::npos) - { - std::string header = response.substr(0, n); - if (header.find("200 OK") != std::string::npos) - ret_code = 200; - if (header.find("401 Unauthorized") != std::string::npos) - ret_code = -401; - - if (ret_code == 200) - { - //body - const char* body_sep = "\r\n\r\n"; - n = response.find(body_sep); - if (n != std::string::npos) - { - m_responseData.assign(response.c_str() + n + strlen(body_sep)); - } else - { - ret_code = -105; - } - } - } - else - { - ret_code = -104; - } - } - else - { - ret_code = -102; - } - - //TODO: Use xbmc file code when it allows to post content-type application/x-www-form-urlencoded and authentication - /* - void* hFile = XBMC->OpenFileForWrite(request.GetUrl().c_str(), 0); - if (hFile != NULL) - { - - int rc = XBMC->WriteFile(hFile, buffer.c_str(), buffer.length()); - if (rc >= 0) + //header + std::string::size_type n = response.find("\r\n"); + if (n != std::string::npos) { - std::string result; - result.clear(); - char buffer[1024]; - while (XBMC->ReadFileString(hFile, buffer, 1023)) - result.append(buffer); + std::string header = response.substr(0, n); + if (header.find("200 OK") != std::string::npos) + ret_code = 200; + if (header.find("401 Unauthorized") != std::string::npos) + ret_code = -401; + if (ret_code == 200) + { + //body + const char* body_sep = "\r\n\r\n"; + n = response.find(body_sep); + if (n != std::string::npos) + { + m_responseData.assign(response.c_str() + n + strlen(body_sep)); + } + else + { + ret_code = -105; + } + } } else { - XBMC->Log(LOG_ERROR, "can not write to %s",request.GetUrl().c_str()); + ret_code = -104; } - - XBMC->CloseFile(hFile); } else { - XBMC->Log(LOG_ERROR, "can not open %s for write", request.GetUrl().c_str()); + ret_code = -102; } - */ + //TODO: Use xbmc file code when it allows to post content-type application/x-www-form-urlencoded and authentication + /* + void* hFile = XBMC->OpenFileForWrite(request.GetUrl().c_str(), 0); + if (hFile != NULL) + { + + int rc = XBMC->WriteFile(hFile, buffer.c_str(), buffer.length()); + if (rc >= 0) + { + std::string result; + result.clear(); + char buffer[1024]; + while (XBMC->ReadFileString(hFile, buffer, 1023)) + result.append(buffer); + + } + else + { + XBMC->Log(LOG_ERROR, "can not write to %s",request.GetUrl().c_str()); + } + + XBMC->CloseFile(hFile); + } + else + { + XBMC->Log(LOG_ERROR, "can not open %s for write", request.GetUrl().c_str()); + } + + */ return ret_code; } @@ -242,7 +242,7 @@ void HttpPostClient::UrlEncode(const std::string& str, std::string& outEncodedStr) { - char* encodedstring = url_encode(str.c_str()); + char* encodedstring = url_encode(str.c_str()); outEncodedStr.append(encodedstring); free(encodedstring); } diff -Nru kodi-pvr-dvblink-1.10.9/src/HttpPostClient.h kodi-pvr-dvblink-2.0.4/src/HttpPostClient.h --- kodi-pvr-dvblink-1.10.9/src/HttpPostClient.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/HttpPostClient.h 2016-01-10 21:41:24.000000000 +0000 @@ -23,27 +23,28 @@ */ #pragma once - + #include "libdvblinkremote/dvblinkremote.h" #include "libdvblinkremote/dvblinkremotehttp.h" #include "kodi/libXBMC_addon.h" -class HttpPostClient : public dvblinkremotehttp::HttpClient +class HttpPostClient: public dvblinkremotehttp::HttpClient { -public : +public: bool SendRequest(dvblinkremotehttp::HttpWebRequest& request); dvblinkremotehttp::HttpWebResponse* GetResponse(); void GetLastError(std::string& err); void UrlEncode(const std::string& str, std::string& outEncodedStr); - HttpPostClient(ADDON::CHelper_libXBMC_addon *XBMC, const std::string& server, const int serverport, const std::string& username, const std::string& password); + HttpPostClient(ADDON::CHelper_libXBMC_addon *XBMC, const std::string& server, const int serverport, + const std::string& username, const std::string& password); -private : +private: int SendPostRequest(dvblinkremotehttp::HttpWebRequest& request); std::string m_server; long m_serverport; std::string m_username; std::string m_password; - ADDON::CHelper_libXBMC_addon *XBMC; + ADDON::CHelper_libXBMC_addon *XBMC; std::string m_responseData; int m_lastReqeuestErrorCode; diff -Nru kodi-pvr-dvblink-1.10.9/src/RecordingStreamer.cpp kodi-pvr-dvblink-2.0.4/src/RecordingStreamer.cpp --- kodi-pvr-dvblink-1.10.9/src/RecordingStreamer.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/RecordingStreamer.cpp 2016-01-10 21:41:24.000000000 +0000 @@ -25,120 +25,125 @@ #include #include "RecordingStreamer.h" - + using namespace dvblinkremotehttp; using namespace dvblinkremote; using namespace ADDON; -RecordingStreamer::RecordingStreamer(ADDON::CHelper_libXBMC_addon* xbmc, const std::string& client_id, - const std::string& hostname, long port, const std::string& username, const std::string& password) - : xbmc_(xbmc), playback_handle_(NULL), client_id_(client_id), hostname_(hostname), username_(username), password_(password), port_(port), check_delta_(30) -{ - http_client_ = new HttpPostClient(xbmc_, hostname_, port_, username_, password_); - dvblink_remote_con_ = DVBLinkRemote::Connect((HttpClient&)*http_client_, hostname_.c_str(), port_, username_.c_str(), password_.c_str(), this); +RecordingStreamer::RecordingStreamer(ADDON::CHelper_libXBMC_addon* xbmc, const std::string& client_id, + const std::string& hostname, long port, const std::string& username, const std::string& password) : + xbmc_(xbmc), playback_handle_(NULL), client_id_(client_id), hostname_(hostname), username_(username), password_( + password), port_(port), check_delta_(30) +{ + http_client_ = new HttpPostClient(xbmc_, hostname_, port_, username_, password_); + dvblink_remote_con_ = DVBLinkRemote::Connect((HttpClient&) *http_client_, hostname_.c_str(), port_, username_.c_str(), + password_.c_str(), this); } RecordingStreamer::~RecordingStreamer() { - delete dvblink_remote_con_; - delete http_client_; + delete dvblink_remote_con_; + delete http_client_; } bool RecordingStreamer::OpenRecordedStream(const char* recording_id, std::string& url) { - recording_id_ = recording_id; - url_ = url; - cur_pos_ = 0; + recording_id_ = recording_id; + url_ = url; + cur_pos_ = 0; - prev_check_ = time(NULL); - get_recording_info(recording_id_, recording_size_, is_in_recording_); + prev_check_ = time(NULL); + get_recording_info(recording_id_, recording_size_, is_in_recording_); - playback_handle_ = xbmc_->OpenFile(url_.c_str(), 0); + playback_handle_ = xbmc_->OpenFile(url_.c_str(), 0); - return playback_handle_ != NULL; + return playback_handle_ != NULL; } void RecordingStreamer::CloseRecordedStream(void) { - if (playback_handle_ != NULL) - { - xbmc_->CloseFile(playback_handle_); - playback_handle_ = NULL; - } + if (playback_handle_ != NULL) + { + xbmc_->CloseFile(playback_handle_); + playback_handle_ = NULL; + } } int RecordingStreamer::ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize) { - //if this is recording in progress - update its size every minute - if (is_in_recording_) + //if this is recording in progress - update its size every minute + if (is_in_recording_) + { + time_t now = time(NULL); + if (now - prev_check_ > check_delta_) { - time_t now = time(NULL); - if (now - prev_check_ > check_delta_) - { - get_recording_info(recording_id_, recording_size_, is_in_recording_); - - //reopen original data connection to refresh its file size - xbmc_->CloseFile(playback_handle_); - playback_handle_ = xbmc_->OpenFile(url_.c_str(), 0); - xbmc_->SeekFile(playback_handle_, cur_pos_, SEEK_SET); + get_recording_info(recording_id_, recording_size_, is_in_recording_); - prev_check_ = now; - } + //reopen original data connection to refresh its file size + xbmc_->CloseFile(playback_handle_); + playback_handle_ = xbmc_->OpenFile(url_.c_str(), 0); + xbmc_->SeekFile(playback_handle_, cur_pos_, SEEK_SET); + + prev_check_ = now; } + } - unsigned int n = xbmc_->ReadFile(playback_handle_, pBuffer, iBufferSize); - cur_pos_ += n; + unsigned int n = xbmc_->ReadFile(playback_handle_, pBuffer, iBufferSize); + cur_pos_ += n; - return n; + return n; } long long RecordingStreamer::SeekRecordedStream(long long iPosition, int iWhence /* = SEEK_SET */) { - cur_pos_ = xbmc_->SeekFile(playback_handle_, iPosition, iWhence); - return cur_pos_; + cur_pos_ = xbmc_->SeekFile(playback_handle_, iPosition, iWhence); + return cur_pos_; } long long RecordingStreamer::PositionRecordedStream(void) { - return cur_pos_; + return cur_pos_; } long long RecordingStreamer::LengthRecordedStream(void) { - return recording_size_; + return recording_size_; } -bool RecordingStreamer::get_recording_info(const std::string& recording_id, long long& recording_size, bool& is_in_recording) +bool RecordingStreamer::get_recording_info(const std::string& recording_id, long long& recording_size, + bool& is_in_recording) { - bool ret_val = false; - recording_size = -1; - is_in_recording = false; - - GetPlaybackObjectRequest getPlaybackObjectRequest(hostname_.c_str(), recording_id); - getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = false; - GetPlaybackObjectResponse getPlaybackObjectResponse; - - std::string error; - if (dvblink_remote_con_->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, &error) != DVBLINK_REMOTE_STATUS_OK) + bool ret_val = false; + recording_size = -1; + is_in_recording = false; + + GetPlaybackObjectRequest getPlaybackObjectRequest(hostname_.c_str(), recording_id); + getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = false; + GetPlaybackObjectResponse getPlaybackObjectResponse; + + std::string error; + if (dvblink_remote_con_->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse, &error) + != DVBLINK_REMOTE_STATUS_OK) + { + xbmc_->Log(LOG_ERROR, "RecordingStreamer::get_recording_info: Could not get recording info for recording id %s", + recording_id.c_str()); + } + else + { + PlaybackItemList& item_list = getPlaybackObjectResponse.GetPlaybackItems(); + if (item_list.size() > 0) { - xbmc_->Log(LOG_ERROR, "RecordingStreamer::get_recording_info: Could not get recording info for recording id %s", recording_id.c_str()); + PlaybackItem* item = item_list[0]; + RecordedTvItem* rectv_item = static_cast(item); + recording_size = rectv_item->Size; + is_in_recording = rectv_item->State == RecordedTvItem::RECORDED_TV_ITEM_STATE_IN_PROGRESS; + ret_val = true; } else { - PlaybackItemList& item_list = getPlaybackObjectResponse.GetPlaybackItems(); - if (item_list.size() > 0) - { - PlaybackItem* item = item_list[0]; - RecordedTvItem* rectv_item = static_cast(item); - recording_size = rectv_item->Size; - is_in_recording = rectv_item->State == RecordedTvItem::RECORDED_TV_ITEM_STATE_IN_PROGRESS; - ret_val = true; - } - else - { - } } + } - return ret_val; + return ret_val; } diff -Nru kodi-pvr-dvblink-1.10.9/src/RecordingStreamer.h kodi-pvr-dvblink-2.0.4/src/RecordingStreamer.h --- kodi-pvr-dvblink-1.10.9/src/RecordingStreamer.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/RecordingStreamer.h 2016-01-10 21:41:24.000000000 +0000 @@ -22,7 +22,7 @@ * http://www.gnu.org/copyleft/gpl.html * */ - + #pragma once #include "platform/os.h" @@ -30,50 +30,50 @@ #include "platform/threads/threads.h" #include "platform/threads/mutex.h" #include "platform/util/util.h" - #include "libdvblinkremote/dvblinkremote.h" #include "HttpPostClient.h" -class RecordingStreamer : public dvblinkremote::DVBLinkRemoteLocker +class RecordingStreamer: public dvblinkremote::DVBLinkRemoteLocker { -public : - RecordingStreamer(ADDON::CHelper_libXBMC_addon* xbmc, const std::string& client_id, const std::string& hostname, long port, const std::string& username, const std::string& password); - virtual ~RecordingStreamer(); - - bool OpenRecordedStream(const char* recording_id, std::string& url); - void CloseRecordedStream(void); - int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize); - long long SeekRecordedStream(long long iPosition, int iWhence /* = SEEK_SET */); - long long PositionRecordedStream(void); - long long LengthRecordedStream(void); +public: + RecordingStreamer(ADDON::CHelper_libXBMC_addon* xbmc, const std::string& client_id, const std::string& hostname, + long port, const std::string& username, const std::string& password); + virtual ~RecordingStreamer(); + + bool OpenRecordedStream(const char* recording_id, std::string& url); + void CloseRecordedStream(void); + int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize); + long long SeekRecordedStream(long long iPosition, int iWhence /* = SEEK_SET */); + long long PositionRecordedStream(void); + long long LengthRecordedStream(void); protected: - ADDON::CHelper_libXBMC_addon* xbmc_; - std::string recording_id_; - std::string url_; - long long recording_size_; - bool is_in_recording_; - void* playback_handle_; - long long cur_pos_; - std::string client_id_; - std::string hostname_; - std::string username_; - std::string password_; - HttpPostClient* http_client_; - dvblinkremote::IDVBLinkRemoteConnection* dvblink_remote_con_; - long port_; - time_t prev_check_; - time_t check_delta_; - PLATFORM::CMutex m_comm_mutex; - - bool get_recording_info(const std::string& recording_id, long long& recording_size, bool& is_in_recording); - - virtual void lock() - { - m_comm_mutex.Lock(); - } - - virtual void unlock() - { - m_comm_mutex.Unlock(); - } + ADDON::CHelper_libXBMC_addon* xbmc_; + std::string recording_id_; + std::string url_; + long long recording_size_; + bool is_in_recording_; + void* playback_handle_; + long long cur_pos_; + std::string client_id_; + std::string hostname_; + std::string username_; + std::string password_; + HttpPostClient* http_client_; + dvblinkremote::IDVBLinkRemoteConnection* dvblink_remote_con_; + long port_; + time_t prev_check_; + time_t check_delta_; + PLATFORM::CMutex m_comm_mutex; + + bool get_recording_info(const std::string& recording_id, long long& recording_size, bool& is_in_recording); + + virtual void lock() + { + m_comm_mutex.Lock(); + } + + virtual void unlock() + { + m_comm_mutex.Unlock(); + } }; diff -Nru kodi-pvr-dvblink-1.10.9/src/TimeShiftBuffer.cpp kodi-pvr-dvblink-2.0.4/src/TimeShiftBuffer.cpp --- kodi-pvr-dvblink-1.10.9/src/TimeShiftBuffer.cpp 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/TimeShiftBuffer.cpp 2016-01-10 21:41:24.000000000 +0000 @@ -22,71 +22,70 @@ * http://www.gnu.org/copyleft/gpl.html * */ - + #include "TimeShiftBuffer.h" using namespace ADDON; using namespace dvblinkremote; //base live streaming class -LiveStreamerBase::LiveStreamerBase(CHelper_libXBMC_addon * XBMC) - : m_streamHandle(NULL) +LiveStreamerBase::LiveStreamerBase(CHelper_libXBMC_addon * XBMC) : + m_streamHandle(NULL) { - this->XBMC = XBMC; + this->XBMC = XBMC; } LiveStreamerBase::~LiveStreamerBase(void) { - Stop(); + Stop(); } int LiveStreamerBase::ReadData(unsigned char *pBuffer, unsigned int iBufferSize) { - return XBMC->ReadFile(m_streamHandle, pBuffer, iBufferSize); + return XBMC->ReadFile(m_streamHandle, pBuffer, iBufferSize); } bool LiveStreamerBase::Start(std::string& streampath) { - streampath_ = streampath; - m_streamHandle = XBMC->OpenFile(streampath_.c_str(), 0); - return m_streamHandle != NULL; + streampath_ = streampath; + m_streamHandle = XBMC->OpenFile(streampath_.c_str(), 0); + return m_streamHandle != NULL; } void LiveStreamerBase::Stop() { - if (m_streamHandle != NULL) - { - XBMC->CloseFile(m_streamHandle); - m_streamHandle = NULL; - } + if (m_streamHandle != NULL) + { + XBMC->CloseFile(m_streamHandle); + m_streamHandle = NULL; + } } - //live streaming class LiveTVStreamer::LiveTVStreamer(CHelper_libXBMC_addon* XBMC) : LiveStreamerBase(XBMC) { } -StreamRequest* LiveTVStreamer::GetStreamRequest(long dvblink_channel_id, const std::string& client_id, const std::string& host_name, - bool use_transcoder, int width, int height, int bitrate, std::string audiotrack) +StreamRequest* LiveTVStreamer::GetStreamRequest(long dvblink_channel_id, const std::string& client_id, + const std::string& host_name, bool use_transcoder, int width, int height, int bitrate, std::string audiotrack) { - StreamRequest* streamRequest = NULL; + StreamRequest* streamRequest = NULL; - TranscodingOptions options(width, height); - options.SetBitrate(bitrate); - options.SetAudioTrack(audiotrack); + TranscodingOptions options(width, height); + options.SetBitrate(bitrate); + options.SetAudioTrack(audiotrack); - if (use_transcoder) - { - streamRequest = new H264TSStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str(), options); - } - else - { - streamRequest = new RawHttpStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str()); - } + if (use_transcoder) + { + streamRequest = new H264TSStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str(), options); + } + else + { + streamRequest = new RawHttpStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str()); + } - return streamRequest; + return streamRequest; } //timeshifted live streaming class @@ -102,25 +101,25 @@ { } -StreamRequest* TimeShiftBuffer::GetStreamRequest(long dvblink_channel_id, const std::string& client_id, const std::string& host_name, - bool use_transcoder, int width, int height, int bitrate, std::string audiotrack) +StreamRequest* TimeShiftBuffer::GetStreamRequest(long dvblink_channel_id, const std::string& client_id, + const std::string& host_name, bool use_transcoder, int width, int height, int bitrate, std::string audiotrack) { - StreamRequest* streamRequest = NULL; + StreamRequest* streamRequest = NULL; - TranscodingOptions options(width, height); - options.SetBitrate(bitrate); - options.SetAudioTrack(audiotrack); + TranscodingOptions options(width, height); + options.SetBitrate(bitrate); + options.SetAudioTrack(audiotrack); - if (use_transcoder) - { - streamRequest = new H264TSTimeshiftStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str(), options); - } - else - { - streamRequest = new RawHttpTimeshiftStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str()); - } + if (use_transcoder) + { + streamRequest = new H264TSTimeshiftStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str(), options); + } + else + { + streamRequest = new RawHttpTimeshiftStreamRequest(host_name.c_str(), dvblink_channel_id, client_id.c_str()); + } - return streamRequest; + return streamRequest; } long long TimeShiftBuffer::Seek(long long iPosition, int iWhence) @@ -179,8 +178,8 @@ { //add zero at the end to turn response into string resp_buf[read] = '\0'; - char* token = strtok( resp_buf, ","); - while( token != NULL ) + char* token = strtok(resp_buf, ","); + while (token != NULL) { response_values.push_back(token); /* Get next token: */ @@ -214,11 +213,10 @@ req_url += "&get_stats=1"; std::vector response_values; - if (ExecuteServerRequest(req_url, response_values) && - response_values.size() == 3) + if (ExecuteServerRequest(req_url, response_values) && response_values.size() == 3) { length = atoll(response_values[0].c_str()); - duration = (time_t)atoll(response_values[1].c_str()); + duration = (time_t) atoll(response_values[1].c_str()); cur_pos = atoll(response_values[2].c_str()); ret_val = true; } @@ -239,10 +237,10 @@ time_t duration; if (GetBufferParams(length, duration, cur_pos)) { - if (length > 0) - ret_val = now - (time_t)((length - cur_pos) * duration / length); - else - ret_val = now; + if (length > 0) + ret_val = now - (time_t) ((length - cur_pos) * duration / length); + else + ret_val = now; } last_pos_ = ret_val; diff -Nru kodi-pvr-dvblink-1.10.9/src/TimeShiftBuffer.h kodi-pvr-dvblink-2.0.4/src/TimeShiftBuffer.h --- kodi-pvr-dvblink-1.10.9/src/TimeShiftBuffer.h 2015-07-30 17:28:55.000000000 +0000 +++ kodi-pvr-dvblink-2.0.4/src/TimeShiftBuffer.h 2016-01-10 21:41:24.000000000 +0000 @@ -22,7 +22,7 @@ * http://www.gnu.org/copyleft/gpl.html * */ - + #pragma once #include "kodi/libXBMC_addon.h" @@ -33,41 +33,61 @@ class LiveStreamerBase { public: - LiveStreamerBase(ADDON::CHelper_libXBMC_addon * XBMC); - virtual ~LiveStreamerBase(); - - virtual bool Start(std::string& streampath); - virtual void Stop(); - virtual int ReadData(unsigned char *pBuffer, unsigned int iBufferSize); - - virtual long long Seek(long long iPosition, int iWhence){ return -1; } - virtual long long Position(){ return -1; } - virtual long long Length(){ return -1; } - - virtual time_t GetPlayingTime(){ return 0; } - virtual time_t GetBufferTimeStart(){ return 0; } - virtual time_t GetBufferTimeEnd(){ return 0; } + LiveStreamerBase(ADDON::CHelper_libXBMC_addon * XBMC); + virtual ~LiveStreamerBase(); - virtual dvblinkremote::StreamRequest* GetStreamRequest(long dvblink_channel_id, const std::string& client_id, const std::string& host_name, - bool use_transcoder, int width, int height, int bitrate, std::string audiotrack) {return NULL;} + virtual bool Start(std::string& streampath); + virtual void Stop(); + virtual int ReadData(unsigned char *pBuffer, unsigned int iBufferSize); + + virtual long long Seek(long long iPosition, int iWhence) + { + return -1; + } + virtual long long Position() + { + return -1; + } + virtual long long Length() + { + return -1; + } + + virtual time_t GetPlayingTime() + { + return 0; + } + virtual time_t GetBufferTimeStart() + { + return 0; + } + virtual time_t GetBufferTimeEnd() + { + return 0; + } + + virtual dvblinkremote::StreamRequest* GetStreamRequest(long dvblink_channel_id, const std::string& client_id, + const std::string& host_name, bool use_transcoder, int width, int height, int bitrate, std::string audiotrack) + { + return NULL; + } protected: - void * m_streamHandle; - ADDON::CHelper_libXBMC_addon * XBMC; - std::string streampath_; + void * m_streamHandle; + ADDON::CHelper_libXBMC_addon * XBMC; + std::string streampath_; }; -class LiveTVStreamer : public LiveStreamerBase +class LiveTVStreamer: public LiveStreamerBase { public: - LiveTVStreamer(ADDON::CHelper_libXBMC_addon * XBMC); + LiveTVStreamer(ADDON::CHelper_libXBMC_addon * XBMC); - virtual dvblinkremote::StreamRequest* GetStreamRequest(long dvblink_channel_id, const std::string& client_id, const std::string& host_name, - bool use_transcoder, int width, int height, int bitrate, std::string audiotrack); + virtual dvblinkremote::StreamRequest* GetStreamRequest(long dvblink_channel_id, const std::string& client_id, + const std::string& host_name, bool use_transcoder, int width, int height, int bitrate, std::string audiotrack); }; - -class TimeShiftBuffer : public LiveStreamerBase +class TimeShiftBuffer: public LiveStreamerBase { public: TimeShiftBuffer(ADDON::CHelper_libXBMC_addon * XBMC); @@ -81,8 +101,8 @@ virtual time_t GetBufferTimeStart(); virtual time_t GetBufferTimeEnd(); - virtual dvblinkremote::StreamRequest* GetStreamRequest(long dvblink_channel_id, const std::string& client_id, const std::string& host_name, - bool use_transcoder, int width, int height, int bitrate, std::string audiotrack); + virtual dvblinkremote::StreamRequest* GetStreamRequest(long dvblink_channel_id, const std::string& client_id, + const std::string& host_name, bool use_transcoder, int width, int height, int bitrate, std::string audiotrack); protected: bool ExecuteServerRequest(const std::string& url, std::vector& response_values);