[SCM] kodi-pvr-mythtv/master: Imported Upstream version 4.7.2+git20160820

rbalint at users.alioth.debian.org rbalint at users.alioth.debian.org
Wed Nov 9 20:50:18 UTC 2016


The following commit has been merged in the master branch:
commit 3a956209e31622d1e4d4327010d6036bb6a92c75
Author: Balint Reczey <balint at balintreczey.hu>
Date:   Mon Oct 10 16:24:12 2016 +0200

    Imported Upstream version 4.7.2+git20160820

diff --git a/.travis.yml b/.travis.yml
index 45e7bf8..bc31465 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,6 +7,10 @@ language: cpp
 # Linux. We need Trusty in order to get up to date versions of 
 # cmake and g++.
 #
+env:
+  global:
+    - app_id=pvr.mythtv
+
 matrix:
   include:
     - os: linux
@@ -36,8 +40,8 @@ before_install:
 #
 before_script:
   - cd $TRAVIS_BUILD_DIR/..
-  - git clone -b Jarvis --depth=1 https://github.com/xbmc/xbmc.git
-  - cd pvr.mythtv && mkdir build && cd build
-  - cmake -DADDONS_TO_BUILD=pvr.mythtv -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/project/cmake/addons
+  - git clone --depth=1 https://github.com/xbmc/xbmc.git
+  - cd ${app_id} && mkdir build && cd build
+  - cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/project/cmake/addons
 
 script: make
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 79d1b98..ceee5bd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,12 +7,12 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR})
 enable_language(CXX)
 enable_language(C)
 
-find_package(kodi REQUIRED)
+find_package(Kodi REQUIRED)
 find_package(kodiplatform REQUIRED)
-find_package(platform REQUIRED)
+find_package(p8-platform REQUIRED)
 
 include_directories(${kodiplatform_INCLUDE_DIRS}
-                    ${platform_INCLUDE_DIRS}
+                    ${p8-platform_INCLUDE_DIRS}
                     ${KODI_INCLUDE_DIR}
                     ${PROJECT_SOURCE_DIR}/lib/cppmyth/src)
 
@@ -54,7 +54,7 @@ set(MYTHTV_SOURCES src/avinfo.cpp
 
 add_subdirectory(lib/cppmyth)
 
-set(DEPLIBS ${platform_LIBRARIES} cppmyth)
+set(DEPLIBS ${p8-platform_LIBRARIES} cppmyth)
 if(WIN32)
   list(APPEND DEPLIBS ws2_32)
 else()
diff --git a/README.md b/README.md
index af16a4a..0c18b20 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Build Status](https://travis-ci.org/kodi-pvr/pvr.mythtv.svg?branch=Jarvis)](https://travis-ci.org/kodi-pvr/pvr.mythtv)
+[![Build Status](https://travis-ci.org/kodi-pvr/pvr.mythtv.svg?branch=master)](https://travis-ci.org/kodi-pvr/pvr.mythtv)
 [![Coverity Scan Build Status](https://scan.coverity.com/projects/5120/badge.svg)](https://scan.coverity.com/projects/5120)
 
 # MythTV PVR
@@ -8,8 +8,8 @@ MythTV PVR client addon for [Kodi] (http://kodi.tv)
 
 ### Linux
 
-1. `git clone -b Jarvis https://github.com/xbmc/xbmc.git`
-2. `git clone -b Jarvis https://github.com/kodi-pvr/pvr.mythtv.git`
+1. `git clone https://github.com/xbmc/xbmc.git`
+2. `git clone https://github.com/kodi-pvr/pvr.mythtv.git`
 3. `cd pvr.mythtv && mkdir build && cd build`
 4. `cmake -DADDONS_TO_BUILD=pvr.mythtv -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/project/cmake/addons`
 5. `make`
diff --git a/lib/cppmyth/CMakeLists.txt b/lib/cppmyth/CMakeLists.txt
index 92b58b8..a00041e 100644
--- a/lib/cppmyth/CMakeLists.txt
+++ b/lib/cppmyth/CMakeLists.txt
@@ -22,7 +22,7 @@ endif ()
 
 ###############################################################################
 # set lib version here
-set (CPPMYTH_LIB_VERSION "2.4.0")
+set (CPPMYTH_LIB_VERSION "2.7.0")
 set (CPPMYTH_LIB_SOVERSION "2")
 
 ###############################################################################
diff --git a/lib/cppmyth/src/mythdebug.cpp b/lib/cppmyth/src/mythdebug.cpp
index 9cf8804..6eb2b40 100644
--- a/lib/cppmyth/src/mythdebug.cpp
+++ b/lib/cppmyth/src/mythdebug.cpp
@@ -27,7 +27,7 @@
 #include <cstring>
 #include <ctype.h>
 
-#ifdef _MSC_VER
+#if defined(_MSC_VER) && _MSC_VER < 1900
 #define snprintf _snprintf
 #endif
 
diff --git a/lib/cppmyth/src/private/builtin.h b/lib/cppmyth/src/private/builtin.h
index 81c894d..94a3792 100644
--- a/lib/cppmyth/src/private/builtin.h
+++ b/lib/cppmyth/src/private/builtin.h
@@ -100,7 +100,7 @@ static CC_INLINE void uint8_to_string(uint8_t num, char *str)
 #define TIMESTAMP_UTC_LEN (sizeof("YYYY-MM-DDTHH:MM:SSZ") - 1)
 #define TIMESTAMP_LEN     (sizeof("YYYY-MM-DDTHH:MM:SS") - 1)
 #define DATESTAMP_LEN     (sizeof("YYYY-MM-DD") - 1)
-#define INVALID_TIME      (time_t)(-1)
+#define INVALID_TIME      (time_t)(0)
 
 #if !HAVE_TIMEGM && !defined(timegm)
 #define timegm __timegm
diff --git a/lib/cppmyth/src/private/mythwscontent.cpp b/lib/cppmyth/src/private/mythwscontent.cpp
index ff6cfe1..33ed7ad 100644
--- a/lib/cppmyth/src/private/mythwscontent.cpp
+++ b/lib/cppmyth/src/private/mythwscontent.cpp
@@ -56,14 +56,14 @@ CT_t Myth::ContentTypeFromMime(const char *mime)
   return CT_UNKNOWN;
 }
 
-const char *Myth::MimeFromContentType(CT_t ct)
+const char* Myth::MimeFromContentType(CT_t ct)
 {
   if (ct >= 0 && ct < CT_UNKNOWN)
     return mimetypes[ct].content_type;
   return mimetypes[CT_UNKNOWN].content_type;
 }
 
-const char *Myth::ExtnFromContentType(CT_t ct)
+const char* Myth::ExtnFromContentType(CT_t ct)
 {
   if (ct >= 0 && ct < CT_UNKNOWN)
     return mimetypes[ct].extn;
diff --git a/lib/cppmyth/src/private/mythwscontent.h b/lib/cppmyth/src/private/mythwscontent.h
index 688bccc..76184ed 100644
--- a/lib/cppmyth/src/private/mythwscontent.h
+++ b/lib/cppmyth/src/private/mythwscontent.h
@@ -39,9 +39,9 @@ namespace Myth
     CT_UNKNOWN  // Keep at last
   } CT_t;
 
-  CT_t ContentTypeFromMime(const char *mime);
-  const char *MimeFromContentType(CT_t ct);
-  const char *ExtnFromContentType(CT_t ct);
+  CT_t ContentTypeFromMime(const char* mime);
+  const char* MimeFromContentType(CT_t ct);
+  const char* ExtnFromContentType(CT_t ct);
 
 }
 
diff --git a/lib/cppmyth/src/private/mythwsrequest.cpp b/lib/cppmyth/src/private/mythwsrequest.cpp
index 1f9ffd3..66ec443 100644
--- a/lib/cppmyth/src/private/mythwsrequest.cpp
+++ b/lib/cppmyth/src/private/mythwsrequest.cpp
@@ -88,19 +88,24 @@ void WSRequest::SetContentCustom(CT_t contentType, const char *content)
   m_contentData = content;
 }
 
+void WSRequest::SetHeader(const std::string& field, const std::string& value)
+{
+  m_headers[field] = value;
+}
+
 void WSRequest::ClearContent()
 {
   m_contentData.clear();
   m_contentType = CT_FORM;
 }
 
-void WSRequest::MakeMessageGET(std::string& msg) const
+void WSRequest::MakeMessageGET(std::string& msg, const char* method) const
 {
   char buf[32];
 
   msg.clear();
   msg.reserve(256);
-  msg.append("GET ").append(m_service_url);
+  msg.append(method).append(" ").append(m_service_url);
   if (!m_contentData.empty())
     msg.append("?").append(m_contentData);
   msg.append(" " REQUEST_PROTOCOL "\r\n");
@@ -111,17 +116,19 @@ void WSRequest::MakeMessageGET(std::string& msg) const
   if (m_accept != CT_NONE)
     msg.append("Accept: ").append(MimeFromContentType(m_accept)).append("\r\n");
   msg.append("Accept-Charset: ").append(m_charset).append("\r\n");
+  for (std::map<std::string, std::string>::const_iterator it = m_headers.begin(); it != m_headers.end(); ++it)
+    msg.append(it->first).append(": ").append(it->second).append("\r\n");
   msg.append("\r\n");
 }
 
-void WSRequest::MakeMessagePOST(std::string& msg) const
+void WSRequest::MakeMessagePOST(std::string& msg, const char* method) const
 {
   char buf[32];
   size_t content_len = m_contentData.size();
 
   msg.clear();
   msg.reserve(256);
-  msg.append("POST ").append(m_service_url).append(" HTTP/1.1\r\n");
+  msg.append(method).append(" ").append(m_service_url).append(" " REQUEST_PROTOCOL "\r\n");
   sprintf(buf, "%u", m_port);
   msg.append("Host: ").append(m_server).append(":").append(buf).append("\r\n");
   msg.append("User-Agent: " REQUEST_USER_AGENT "\r\n");
@@ -134,23 +141,25 @@ void WSRequest::MakeMessagePOST(std::string& msg) const
     sprintf(buf, "%lu", (unsigned long)content_len);
     msg.append("Content-Type: ").append(MimeFromContentType(m_contentType));
     msg.append("; charset=" REQUEST_STD_CHARSET "\r\n");
-    msg.append("Content-Length: ").append(buf).append("\r\n\r\n");
-    msg.append(m_contentData);
+    msg.append("Content-Length: ").append(buf).append("\r\n");
   }
-  else
-    msg.append("\r\n");
+  for (std::map<std::string, std::string>::const_iterator it = m_headers.begin(); it != m_headers.end(); ++it)
+    msg.append(it->first).append(": ").append(it->second).append("\r\n");
+  msg.append("\r\n");
+  if (content_len)
+    msg.append(m_contentData);
 }
 
-void WSRequest::MakeMessageHEAD(std::string& msg) const
+void WSRequest::MakeMessageHEAD(std::string& msg, const char* method) const
 {
   char buf[32];
 
   msg.clear();
   msg.reserve(256);
-  msg.append("HEAD ").append(m_service_url);
+  msg.append(method).append(" ").append(m_service_url);
   if (!m_contentData.empty())
     msg.append("?").append(m_contentData);
-  msg.append(" HTTP/1.1\r\n");
+  msg.append(" " REQUEST_PROTOCOL "\r\n");
   sprintf(buf, "%u", m_port);
   msg.append("Host: ").append(m_server).append(":").append(buf).append("\r\n");
   msg.append("User-Agent: " REQUEST_USER_AGENT "\r\n");
@@ -158,5 +167,7 @@ void WSRequest::MakeMessageHEAD(std::string& msg) const
   if (m_accept != CT_NONE)
     msg.append("Accept: ").append(MimeFromContentType(m_accept)).append("\r\n");
   msg.append("Accept-Charset: ").append(m_charset).append("\r\n");
+  for (std::map<std::string, std::string>::const_iterator it = m_headers.begin(); it != m_headers.end(); ++it)
+    msg.append(it->first).append(": ").append(it->second).append("\r\n");
   msg.append("\r\n");
 }
diff --git a/lib/cppmyth/src/private/mythwsrequest.h b/lib/cppmyth/src/private/mythwsrequest.h
index a3bed93..d116bb0 100644
--- a/lib/cppmyth/src/private/mythwsrequest.h
+++ b/lib/cppmyth/src/private/mythwsrequest.h
@@ -26,10 +26,10 @@
 
 #include <cstddef>  // for size_t
 #include <string>
-#include <vector>
+#include <map>
 
 #define REQUEST_PROTOCOL      "HTTP/1.1"
-#define REQUEST_USER_AGENT    "libcppmyth/1.0"
+#define REQUEST_USER_AGENT    "libcppmyth/2.5"
 #define REQUEST_CONNECTION    "close" // "keep-alive"
 #define REQUEST_STD_CHARSET   "utf-8"
 
@@ -53,6 +53,7 @@ namespace Myth
     void RequestAccept(CT_t contentType);
     void SetContentParam(const std::string& param, const std::string& value);
     void SetContentCustom(CT_t contentType, const char *content);
+    void SetHeader(const std::string& field, const std::string& value);
     const std::string& GetContent() const { return m_contentData; }
     void ClearContent();
 
@@ -75,10 +76,11 @@ namespace Myth
     CT_t m_accept;
     CT_t m_contentType;
     std::string m_contentData;
+    std::map<std::string, std::string> m_headers;
 
-    void MakeMessageGET(std::string& msg) const;
-    void MakeMessagePOST(std::string& msg) const;
-    void MakeMessageHEAD(std::string& msg) const;
+    void MakeMessageGET(std::string& msg, const char* method = "GET") const;
+    void MakeMessagePOST(std::string& msg, const char* method = "POST") const;
+    void MakeMessageHEAD(std::string& msg, const char* method = "HEAD") const;
   };
 
 }
diff --git a/lib/cppmyth/src/private/mythwsresponse.cpp b/lib/cppmyth/src/private/mythwsresponse.cpp
index 1cbe977..556755c 100644
--- a/lib/cppmyth/src/private/mythwsresponse.cpp
+++ b/lib/cppmyth/src/private/mythwsresponse.cpp
@@ -34,7 +34,7 @@
 
 using namespace Myth;
 
-static bool __readHeaderLine(TcpSocket *socket, const char *eol, std::string& line, size_t *len)
+bool WSResponse::ReadHeaderLine(NetSocket *socket, const char *eol, std::string& line, size_t *len)
 {
   char buf[RESPONSE_BUFFER_SIZE];
   const char *s_eol;
@@ -50,7 +50,7 @@ static bool __readHeaderLine(TcpSocket *socket, const char *eol, std::string& li
   line.clear();
   do
   {
-    if (socket->ReadResponse(&buf[p], 1) > 0)
+    if (socket->ReceiveData(&buf[p], 1) > 0)
     {
       if (buf[p++] == s_eol[p_eol])
       {
@@ -95,8 +95,12 @@ WSResponse::WSResponse(const WSRequest &request)
 , m_etag()
 , m_location()
 , m_contentType(CT_NONE)
+, m_contentChunked(false)
 , m_contentLength(0)
 , m_consumed(0)
+, m_chunkBuffer(NULL)
+, m_chunkPtr(NULL)
+, m_chunkEnd(NULL)
 {
   if (m_socket->Connect(request.GetServer().c_str(), request.GetPort(), SOCKET_RCVBUF_MINSIZE))
   {
@@ -121,6 +125,7 @@ WSResponse::WSResponse(const WSRequest &request)
 
 WSResponse::~WSResponse()
 {
+  SAFE_DELETE_ARRAY(m_chunkBuffer);
   SAFE_DELETE(m_socket);
 }
 
@@ -147,7 +152,7 @@ bool WSResponse::GetResponse()
   bool ret = false;
 
   token[0] = 0;
-  while (__readHeaderLine(m_socket, "\r\n", strread, &len))
+  while (ReadHeaderLine(m_socket, "\r\n", strread, &len))
   {
     const char *line = strread.c_str(), *val = NULL;
     int value_len = 0;
@@ -203,6 +208,7 @@ bool WSResponse::GetResponse()
         token[p] = toupper(line[p]);
       token[token_len] = 0;
       while ((value_len = len - (val - line)) && *(++val) == ' ');
+      m_headers.push_front(std::make_pair(token, ""));
     }
     else
     {
@@ -213,28 +219,37 @@ bool WSResponse::GetResponse()
 
     if (token_len)
     {
+      m_headers.front().second.append(val);
       switch (token_len)
       {
         case 4:
-          if (val && memcmp(token, "ETAG", token_len) == 0)
+          if (memcmp(token, "ETAG", token_len) == 0)
             m_etag.append(val);
           break;
         case 6:
-          if (val && memcmp(token, "SERVER", token_len) == 0)
+          if (memcmp(token, "SERVER", token_len) == 0)
             m_serverInfo.append(val);
           break;
         case 8:
-          if (val && memcmp(token, "LOCATION", token_len) == 0)
+          if (memcmp(token, "LOCATION", token_len) == 0)
             m_location.append(val);
           break;
         case 12:
-          if (val && memcmp(token, "CONTENT-TYPE", token_len) == 0)
+          if (memcmp(token, "CONTENT-TYPE", token_len) == 0)
             m_contentType = ContentTypeFromMime(val);
           break;
         case 14:
-          if (val && memcmp(token, "CONTENT-LENGTH", token_len) == 0)
+          if (memcmp(token, "CONTENT-LENGTH", token_len) == 0)
             m_contentLength = atol(val);
           break;
+        case 17:
+          if (memcmp(token, "TRANSFER-ENCODING", token_len) == 0)
+          {
+            m_transferEncoding.append(val);
+            if (m_transferEncoding == "chunked")
+              m_contentChunked = true;
+          }
+          break;
         default:
           break;
       }
@@ -246,9 +261,59 @@ bool WSResponse::GetResponse()
 
 size_t WSResponse::ReadContent(char* buf, size_t buflen)
 {
-  if (!m_socket->IsConnected())
-    return 0;
-  size_t s = m_socket->ReadResponse(buf, buflen);
+  size_t s = 0;
+  if (!m_contentChunked)
+  {
+    // let read on unknown length
+    if (!m_contentLength)
+      s = m_socket->ReadResponse(buf, buflen);
+    else if (m_contentLength > m_consumed)
+    {
+      size_t len = m_contentLength - m_consumed;
+      s = m_socket->ReadResponse(buf, len > buflen ? buflen : len);
+    }
+  }
+  else
+  {
+    if (m_chunkPtr == NULL || m_chunkPtr >= m_chunkEnd)
+    {
+      SAFE_DELETE_ARRAY(m_chunkBuffer);
+      m_chunkBuffer = m_chunkPtr = m_chunkEnd = NULL;
+      std::string strread;
+      size_t len = 0;
+      while (ReadHeaderLine(m_socket, "\r\n", strread, &len) && len == 0);
+      DBG(MYTH_DBG_PROTO, "%s: chunked data (%s)\n", __FUNCTION__, strread.c_str());
+      std::string chunkStr("0x0");
+      uint32_t chunkSize = 0;
+      if (!strread.empty() && sscanf(chunkStr.append(strread).c_str(), "%x", &chunkSize) == 1 && chunkSize > 0)
+      {
+        if (!(m_chunkBuffer = new char[chunkSize]))
+          return 0;
+        m_chunkPtr = m_chunkBuffer;
+        m_chunkEnd = m_chunkBuffer + chunkSize;
+        if (m_socket->ReadResponse(m_chunkBuffer, chunkSize) != chunkSize)
+          return 0;
+      }
+      else
+        return 0;
+    }
+    if ((s = m_chunkEnd - m_chunkPtr) > buflen)
+      s = buflen;
+    memcpy(buf, m_chunkPtr, s);
+    m_chunkPtr += s;
+  }
   m_consumed += s;
   return s;
 }
+
+bool WSResponse::GetHeaderValue(const std::string& header, std::string& value)
+{
+  for (HeaderList::const_iterator it = m_headers.begin(); it != m_headers.end(); ++it)
+  {
+    if (it->first != header)
+      continue;
+    value.assign(it->second);
+    return true;
+  }
+  return false;
+}
diff --git a/lib/cppmyth/src/private/mythwsresponse.h b/lib/cppmyth/src/private/mythwsresponse.h
index 58dc779..027ac84 100644
--- a/lib/cppmyth/src/private/mythwsresponse.h
+++ b/lib/cppmyth/src/private/mythwsresponse.h
@@ -27,10 +27,12 @@
 
 #include <cstddef>  // for size_t
 #include <string>
+#include <list>
 
 namespace Myth
 {
 
+  class NetSocket;
   class TcpSocket;
 
   class WSResponse
@@ -40,12 +42,17 @@ namespace Myth
     ~WSResponse();
 
     bool IsSuccessful() const { return m_successful; }
+    bool IsChunkedTransfer() const { return m_contentChunked; }
     size_t GetContentLength() const { return m_contentLength; }
     size_t ReadContent(char *buf, size_t buflen);
     size_t GetConsumed() const { return m_consumed; }
     int GetStatusCode() const { return m_statusCode; }
     const std::string& Redirection() const { return m_location; }
 
+    bool GetHeaderValue(const std::string& header, std::string& value);
+
+    static bool ReadHeaderLine(NetSocket *socket, const char *eol, std::string& line, size_t *len);
+
   private:
     TcpSocket *m_socket;
     bool m_successful;
@@ -53,9 +60,17 @@ namespace Myth
     std::string m_serverInfo;
     std::string m_etag;
     std::string m_location;
+    std::string m_transferEncoding;
     CT_t m_contentType;
+    bool m_contentChunked;
     size_t m_contentLength;
     size_t m_consumed;
+    char* m_chunkBuffer;
+    char* m_chunkPtr;
+    char* m_chunkEnd;
+
+    typedef std::list<std::pair<std::string, std::string> > HeaderList;
+    HeaderList m_headers;
 
     // prevent copy
     WSResponse(const WSResponse&);
diff --git a/lib/cppmyth/src/private/os/windows/os-types.h b/lib/cppmyth/src/private/os/windows/os-types.h
index c5fe9f5..a0327e1 100644
--- a/lib/cppmyth/src/private/os/windows/os-types.h
+++ b/lib/cppmyth/src/private/os/windows/os-types.h
@@ -78,7 +78,10 @@ struct timezone
 #endif
 
 /* Prevent deprecation warnings */
+#if (_MSC_VER < 1900)
 #define snprintf _snprintf
+#endif
+
 #define strnicmp _strnicmp
 
 #else
diff --git a/lib/cppmyth/src/private/os/windows/winpthreads.h b/lib/cppmyth/src/private/os/windows/winpthreads.h
index dcad7ac..8427dfa 100644
--- a/lib/cppmyth/src/private/os/windows/winpthreads.h
+++ b/lib/cppmyth/src/private/os/windows/winpthreads.h
@@ -96,12 +96,16 @@ extern "C" {
 #define PTHREAD_BARRIER_SERIAL_THREAD 1
 
 /* Windows doesn't have this, so declare it ourselves. */
+#if (_MSC_VER < 1900)
 struct timespec
 {
   /* long long in windows is the same as long in unix for 64bit */
   long long tv_sec;
   long long tv_nsec;
 };
+#else
+#include <time.h>
+#endif
 
 struct _pthread_v;
 typedef struct _pthread_v *pthread_t;
diff --git a/lib/cppmyth/src/proto/mythprotobase.cpp b/lib/cppmyth/src/proto/mythprotobase.cpp
index 44f06d0..992d231 100644
--- a/lib/cppmyth/src/proto/mythprotobase.cpp
+++ b/lib/cppmyth/src/proto/mythprotobase.cpp
@@ -38,6 +38,9 @@ typedef struct
 } myth_protomap_t;
 
 static myth_protomap_t protomap[] = {
+  {91, "BuzzOff"},
+  {90, "BuzzCut"},
+  {89, "BuzzKill"},
   {88, "XmasGift"},
   {87, "(ノಠ益ಠ)ノ彡┻━┻_No_entiendo!)"},
   {86, "(ノಠ益ಠ)ノ彡┻━┻"},
diff --git a/lib/cppmyth/src/proto/mythprotomonitor.cpp b/lib/cppmyth/src/proto/mythprotomonitor.cpp
index 57bedf2..dfed04b 100644
--- a/lib/cppmyth/src/proto/mythprotomonitor.cpp
+++ b/lib/cppmyth/src/proto/mythprotomonitor.cpp
@@ -750,3 +750,148 @@ CardInputListPtr ProtoMonitor::GetFreeInputs87(int rnum)
   FlushMessage();
   return list;
 }
+
+CardInputListPtr ProtoMonitor::GetFreeInputs89(int rnum)
+{
+  CardInputListPtr list = CardInputListPtr(new CardInputList());
+  char buf[32];
+  std::string field;
+
+  OS::CLockGuard lock(*m_mutex);
+  if (!IsOpen())
+    return list;
+  std::string cmd("GET_FREE_INPUT_INFO ");
+  int32_to_string((int32_t)rnum, buf);
+  cmd.append(buf);
+
+  if (!SendCommand(cmd.c_str()))
+    return list;
+
+  while (m_msgConsumed < m_msgLength)
+  {
+    CardInputPtr input(new CardInput());
+    if (!ReadField(input->inputName))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId))) // obsolete: same as inputId
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
+      break;
+    if (!ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
+      break;
+    if (!ReadField(field)) // displayName
+      break;
+    if (!ReadField(field)) // recPriority
+      break;
+    if (!ReadField(field)) // schedOrder
+      break;
+    if (!ReadField(field)) // quickTune
+      break;
+    if (!ReadField(field)) // chanid
+      break;
+    if (!ReadField(field)) // reclimit
+      break;
+    list->push_back(input);
+  }
+  FlushMessage();
+  return list;
+}
+
+CardInputListPtr ProtoMonitor::GetFreeInputs90(int rnum)
+{
+  CardInputListPtr list = CardInputListPtr(new CardInputList());
+  char buf[32];
+  std::string field;
+
+  OS::CLockGuard lock(*m_mutex);
+  if (!IsOpen())
+    return list;
+  std::string cmd("GET_FREE_INPUT_INFO ");
+  int32_to_string((int32_t)rnum, buf);
+  cmd.append(buf);
+
+  if (!SendCommand(cmd.c_str()))
+    return list;
+
+  while (m_msgConsumed < m_msgLength)
+  {
+    CardInputPtr input(new CardInput());
+    if (!ReadField(input->inputName))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
+      break;
+    input->cardId = input->inputId; // @FIXME: since protocol 90
+    if (!ReadField(field)) // reccount
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
+      break;
+    if (!ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
+      break;
+    if (!ReadField(field)) // displayName
+      break;
+    if (!ReadField(field)) // recPriority
+      break;
+    if (!ReadField(field)) // schedOrder
+      break;
+    if (!ReadField(field)) // quickTune
+      break;
+    if (!ReadField(field)) // chanid
+      break;
+    if (!ReadField(field)) // reclimit
+      break;
+    list->push_back(input);
+  }
+  FlushMessage();
+  return list;
+}
+
+CardInputListPtr ProtoMonitor::GetFreeInputs91(int rnum)
+{
+  CardInputListPtr list = CardInputListPtr(new CardInputList());
+  char buf[32];
+  std::string field;
+
+  OS::CLockGuard lock(*m_mutex);
+  if (!IsOpen())
+    return list;
+  std::string cmd("GET_FREE_INPUT_INFO ");
+  int32_to_string((int32_t)rnum, buf);
+  cmd.append(buf);
+
+  if (!SendCommand(cmd.c_str()))
+    return list;
+
+  while (m_msgConsumed < m_msgLength)
+  {
+    CardInputPtr input(new CardInput());
+    if (!ReadField(input->inputName))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
+      break;
+    input->cardId = input->inputId; // @FIXME: since protocol 90
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
+      break;
+    if (!ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
+      break;
+    if (!ReadField(field)) // displayName
+      break;
+    if (!ReadField(field)) // recPriority
+      break;
+    if (!ReadField(field)) // schedOrder
+      break;
+    if (!ReadField(field)) // quickTune
+      break;
+    if (!ReadField(field)) // chanid
+      break;
+    list->push_back(input);
+  }
+  FlushMessage();
+  return list;
+}
diff --git a/lib/cppmyth/src/proto/mythprotomonitor.h b/lib/cppmyth/src/proto/mythprotomonitor.h
index 0f92377..5ffe8b3 100644
--- a/lib/cppmyth/src/proto/mythprotomonitor.h
+++ b/lib/cppmyth/src/proto/mythprotomonitor.h
@@ -107,6 +107,9 @@ namespace Myth
      */
     CardInputListPtr GetFreeInputs(int rnum = 0)
     {
+      if (m_protoVersion >= 91) return GetFreeInputs91(rnum);
+      if (m_protoVersion >= 90) return GetFreeInputs90(rnum);
+      if (m_protoVersion >= 89) return GetFreeInputs89(rnum);
       if (m_protoVersion >= 87) return GetFreeInputs87(rnum);
       if (m_protoVersion >= 81) return GetFreeInputs81();
       if (m_protoVersion >= 79) return GetFreeInputs79();
@@ -136,6 +139,9 @@ namespace Myth
     CardInputListPtr GetFreeInputs79();
     CardInputListPtr GetFreeInputs81();
     CardInputListPtr GetFreeInputs87(int rnum);
+    CardInputListPtr GetFreeInputs89(int rnum);
+    CardInputListPtr GetFreeInputs90(int rnum);
+    CardInputListPtr GetFreeInputs91(int rnum);
 
     // Not implemented
     //int64_t GetBookmark75(Program& program);
diff --git a/lib/cppmyth/src/proto/mythprotorecorder.cpp b/lib/cppmyth/src/proto/mythprotorecorder.cpp
index c4b88c4..21e3454 100644
--- a/lib/cppmyth/src/proto/mythprotorecorder.cpp
+++ b/lib/cppmyth/src/proto/mythprotorecorder.cpp
@@ -415,6 +415,145 @@ CardInputListPtr ProtoRecorder::GetFreeInputs87()
   return list;
 }
 
+CardInputListPtr ProtoRecorder::GetFreeInputs89()
+{
+  CardInputListPtr list = CardInputListPtr(new CardInputList());
+  std::string field;
+
+  OS::CLockGuard lock(*m_mutex);
+  if (!IsOpen())
+    return list;
+  std::string cmd("GET_FREE_INPUT_INFO 0");
+
+  if (!SendCommand(cmd.c_str()))
+    return list;
+
+  while (m_msgConsumed < m_msgLength)
+  {
+    CardInputPtr input(new CardInput());
+    if (!ReadField(input->inputName))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
+      break;
+    if (!ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
+      break;
+    if (!ReadField(field)) // displayName
+      break;
+    if (!ReadField(field)) // recPriority
+      break;
+    if (!ReadField(field)) // schedOrder
+      break;
+    if (!ReadField(field)) // quickTune
+      break;
+    if (!ReadField(field)) // chanid
+      break;
+    if (!ReadField(field)) // reclimit
+      break;
+    if (input->cardId == static_cast<unsigned>(m_num))
+      list->push_back(input);
+  }
+  FlushMessage();
+  return list;
+}
+
+CardInputListPtr ProtoRecorder::GetFreeInputs90()
+{
+  CardInputListPtr list = CardInputListPtr(new CardInputList());
+  std::string field;
+
+  OS::CLockGuard lock(*m_mutex);
+  if (!IsOpen())
+    return list;
+  std::string cmd("GET_FREE_INPUT_INFO 0");
+
+  if (!SendCommand(cmd.c_str()))
+    return list;
+
+  while (m_msgConsumed < m_msgLength)
+  {
+    CardInputPtr input(new CardInput());
+    if (!ReadField(input->inputName))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
+      break;
+    input->cardId = input->inputId; // @FIXME: since protocol 90
+    if (!ReadField(field)) // reccount
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
+      break;
+    if (!ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
+      break;
+    if (!ReadField(field)) // displayName
+      break;
+    if (!ReadField(field)) // recPriority
+      break;
+    if (!ReadField(field)) // schedOrder
+      break;
+    if (!ReadField(field)) // quickTune
+      break;
+    if (!ReadField(field)) // chanid
+      break;
+    if (!ReadField(field)) // reclimit
+      break;
+    if (input->cardId == static_cast<unsigned>(m_num))
+      list->push_back(input);
+  }
+  FlushMessage();
+  return list;
+}
+
+CardInputListPtr ProtoRecorder::GetFreeInputs91()
+{
+  CardInputListPtr list = CardInputListPtr(new CardInputList());
+  std::string field;
+
+  OS::CLockGuard lock(*m_mutex);
+  if (!IsOpen())
+    return list;
+  std::string cmd("GET_FREE_INPUT_INFO 0");
+
+  if (!SendCommand(cmd.c_str()))
+    return list;
+
+  while (m_msgConsumed < m_msgLength)
+  {
+    CardInputPtr input(new CardInput());
+    if (!ReadField(input->inputName))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
+      break;
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
+      break;
+    input->cardId = input->inputId; // @FIXME: since protocol 90
+    if (!ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
+      break;
+    if (!ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
+      break;
+    if (!ReadField(field)) // displayName
+      break;
+    if (!ReadField(field)) // recPriority
+      break;
+    if (!ReadField(field)) // schedOrder
+      break;
+    if (!ReadField(field)) // quickTune
+      break;
+    if (!ReadField(field)) // chanid
+      break;
+    if (input->cardId == static_cast<unsigned>(m_num))
+      list->push_back(input);
+  }
+  FlushMessage();
+  return list;
+}
+
 bool ProtoRecorder::IsLiveRecording()
 {
   OS::CLockGuard lock(*m_mutex);
diff --git a/lib/cppmyth/src/proto/mythprotorecorder.h b/lib/cppmyth/src/proto/mythprotorecorder.h
index 8d0a712..13b1a78 100644
--- a/lib/cppmyth/src/proto/mythprotorecorder.h
+++ b/lib/cppmyth/src/proto/mythprotorecorder.h
@@ -63,6 +63,9 @@ namespace Myth
     }
     CardInputListPtr GetFreeInputs()
     {
+      if (m_protoVersion >= 91) return GetFreeInputs91();
+      if (m_protoVersion >= 90) return GetFreeInputs90();
+      if (m_protoVersion >= 89) return GetFreeInputs89();
       if (m_protoVersion >= 87) return GetFreeInputs87();
       if (m_protoVersion >= 81) return GetFreeInputs81();
       if (m_protoVersion >= 79) return GetFreeInputs79();
@@ -95,6 +98,9 @@ namespace Myth
     CardInputListPtr GetFreeInputs79();
     CardInputListPtr GetFreeInputs81();
     CardInputListPtr GetFreeInputs87();
+    CardInputListPtr GetFreeInputs89();
+    CardInputListPtr GetFreeInputs90();
+    CardInputListPtr GetFreeInputs91();
     bool SetLiveRecording75(bool keep);
     bool FinishRecording75();
   };
diff --git a/pvr.mythtv/addon.xml.in b/pvr.mythtv/addon.xml.in
index c23cad6..2f55d5b 100644
--- a/pvr.mythtv/addon.xml.in
+++ b/pvr.mythtv/addon.xml.in
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <addon
   id="pvr.mythtv"
-  version="3.4.8"
+  version="4.7.2"
   name="MythTV PVR Client"
   provider-name="Christian Fetzer, Jean-Luc Barrière">
   <requires>
     <c-pluff version="0.1"/>
-    <import addon="xbmc.pvr" version="4.1.0"/>
+    <import addon="xbmc.pvr" version="5.2.0"/>
     <import addon="xbmc.codec" version="1.0.1"/>
-    <import addon="kodi.guilib" version="5.10.0"/>
+    <import addon="kodi.guilib" version="5.11.0"/>
   </requires>
   <extension
     point="xbmc.pvrclient"
@@ -63,7 +63,7 @@
     <description lang="af_ZA">MythTV voorprogram (tot MythTV 0.28). Ondersteun stroom van Lewendige TV & Opnames, luister na Radio kanale, EPG en Tydhouers.</description>
     <description lang="be_BY">MythTV frontend (up to MythTV 0.28). Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers.</description>
     <description lang="bg_BG">MythTV клиент (обновен до MythTV 0.28). Поддържа поточна телевизия и записване, слушане на радио канали, електронен програмен справочник и броячи.</description>
-    <description lang="ca_ES">Front-end de MythTV (fins a MythTV 0.28). Suport de transmissions de TV en Viu i Enregistraments, escoltar canals de Radi, Guia Electrònica de Programes (EPG) i Temporitzadors.</description>
+    <description lang="ca_ES">Front-end de MythTV (fins a MythTV 0.28). Suport de transmissions de TV en directe i enregistraments, escoltar canals de radi, guia electrònica de programes (EPG) i temporitzadors.</description>
     <description lang="cs_CZ">Rozhraní MythTV (do verze MythTV 0.28). Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia a EPG, a časovače.</description>
     <description lang="cy_GB">Blaen MythTV (hyd at MythTV 0.28). Cynnal ffrydio Teledu Byw a Recordiadau, gwrando ar sianeli radio, amserlenni rhaglenni electronig ac amseryddion.</description>
     <description lang="da_DK">MythTV frontend (op til MythTV 0.28) Understøtter streaming af Live TV & Optagelser, Radiokanaler, EPG samt tidsplaner.</description>
@@ -95,7 +95,7 @@
     <description lang="nl_NL">MythTV frontend (tot MythTV 0.28). Ondersteunt streaming van Live TV & opnames, luisteren naar radiokanalen, EPG en Timers.</description>
     <description lang="pl_PL">Klient telewizyjny dla MythTV (wersja 0.28 i wcześniejsze) obsługuje strumieniowanie kanałów radiowych i telewizyjnych, nagrywanie i harmonogram nagrań oraz funkcje przewodnika telewizyjnego.</description>
     <description lang="pt_BR">MythTV frontend (up para MythTV 0.28). Suporta streaming de TV ao Vivo & Gravações, Escutar canais de rádios, EPG e Agendamentos.</description>
-    <description lang="pt_PT">Interface MythTV (até MythTV 0.28). Permite transmissão ao vivo de Live Tv e gravações, ouvir estações de rádio, EPG e temporizadores.</description>
+    <description lang="pt_PT">Interface MythTV (até MythTV 0.28). Permite televisão em direto, gravações, estações de rádio, EPG e temporizadores.</description>
     <description lang="ro_RO">Frontend MythTV (până la MythTV 0.28). Suportă difuzare în flux a televiziunii în direct și a înregistrăriilor, ascultarea posturilor de radio, EPG și Cronometre.</description>
     <description lang="ru_RU">Фронтэнд MythTV (вплоть до MythTV 0.28). Поддерживает поточное ТВ и записи, прослушивание радио-каналов, ЕПГ и таймеры.</description>
     <description lang="sk_SK">MythTV rozhranie (až do verzie MythTV 0.28). Podporuje streamovanie živého TV vysielania a nahrávok, počúvanie rozhlasových kanálov, EPG a časovače.</description>
@@ -141,7 +141,7 @@
     <disclaimer lang="nl_NL">Dit is onstabiele software! De auteurs zijn op geen enkele wijze verantwoordelijk voor mislukte opnames, timers, verspilde tijd of enig ander ongewild bijeffect.</disclaimer>
     <disclaimer lang="pl_PL">To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, błędy w harmonogramie nagrań, stracone godziny czy też jakiekolwiek inne niepożądane efekty.</disclaimer>
     <disclaimer lang="pt_BR">Este é um software instável! Os autores não são responsáveis por falhas nas gravações, agendamentos incorretos, horas dispendidas, ou quaisquer outro efeito indesejado.</disclaimer>
-    <disclaimer lang="pt_PT">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..</disclaimer>
+    <disclaimer lang="pt_PT">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...</disclaimer>
     <disclaimer lang="ro_RO">Acest software nu este stabil! Autorii nu sunt responsabili în niciun caz pentru înregistrările eșuate, cronometre incorecte, ore pierdute sau orice alt efect nedorit.</disclaimer>
     <disclaimer lang="ru_RU">Это тестовая программа! Авторы не несут никакой ответственности за испорченные записи, неверные таймеры, потраченное время и за прочие нежелательные эффекты.</disclaimer>
     <disclaimer lang="sk_SK">Toto nie je stabilný software! Autori nie sú zodpovední za zlýhané nahrávky, nesprávne časovače, premrhané hodiny a iné nežiadúce efekty.</disclaimer>
diff --git a/pvr.mythtv/changelog.txt b/pvr.mythtv/changelog.txt
index 525c92d..076980e 100644
--- a/pvr.mythtv/changelog.txt
+++ b/pvr.mythtv/changelog.txt
@@ -1,9 +1,62 @@
-v3.4.8
+v4.7.2
 - Updated language files from Transifex
 
-v3.4.7
+v4.7.0
+- Sync cppmyth upstream (2.7.0)
+- Support protocol 29-pre:91
+
+v4.6.1
+- Updated language files from Transifex
+
+v4.6.0
+- Sync cppmyth upstream (2.6.0)
+- Support protocol 29-pre:90
+- Support protocol 29-pre:89
+- Allow to keep live show from EPG screen
+
+v4.5.3
+- Updated language files from Transifex
+
+v4.5.2
+- Updated language files from Transifex
+
+v4.5.1
+- Keep original air date of recording on update event from protocol
+- Sync cppmyth upstream (2.5.2)
+
+v4.5.0
+- Cmake: rename find_package kodi to Kodi
+
+v4.4.1
+- Fix includes
+
+v4.4.0
+- Updated to PVR addon API v5.2.0
+
+v4.3.1
+- Sync cppmyth upstream (2.5.1)
+
+v4.3.0
+- Updated to PVR addon API v5.1.0
+
+v4.2.1
+- Fill PVR channel UID of recordings
+- Allowing to disable auto-expire for any recording
+- Minor improvements
+
+v4.2.0
+- Updated to PVR addon API v5.0.0
+
+v4.1.0
+- Updated to PVR API v4.2.0
+- Updated to GUI API v5.11.0
+
+v4.0.1
 - Updated language files from Transifex
 
+v4.0.0
+- Initial Kodi Krypton version.
+
 v3.4.6
 - fix timer update caused by invalid epg ID
 
diff --git a/pvr.mythtv/resources/language/resource.language.af_za/strings.po b/pvr.mythtv/resources/language/resource.language.af_za/strings.po
index c07c4d5..07cef9c 100644
--- a/pvr.mythtv/resources/language/resource.language.af_za/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.af_za/strings.po
@@ -272,10 +272,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Wis uit en neem weer op"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Hou LiveTV opname"
-
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
 msgstr "Wys / versteek onaktiewe opkomendes"
diff --git a/pvr.mythtv/resources/language/resource.language.mn_mn/strings.po b/pvr.mythtv/resources/language/resource.language.az_az/strings.po
similarity index 64%
copy from pvr.mythtv/resources/language/resource.language.mn_mn/strings.po
copy to pvr.mythtv/resources/language/resource.language.az_az/strings.po
index 6bddc68..402a479 100644
--- a/pvr.mythtv/resources/language/resource.language.mn_mn/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.az_az/strings.po
@@ -9,17 +9,21 @@ msgstr ""
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Kodi Translation Team\n"
-"Language-Team: Mongolian (Mongolia) (http://www.transifex.com/projects/p/kodi-main/language/mn_MN/)\n"
+"Language-Team: Azerbaijani (Azerbaijan) (http://www.transifex.com/projects/p/kodi-main/language/az_AZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: mn_MN\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: az_AZ\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
 
 msgctxt "#30019"
 msgid "General"
-msgstr "Ерөнхий"
+msgstr "Ümumi"
 
-msgctxt "#30310"
-msgid "Enabled"
-msgstr "Идэвхижүүлэх"
+msgctxt "#30055"
+msgid "Always"
+msgstr "Həmişə"
+
+msgctxt "#30059"
+msgid "Always"
+msgstr "Həmişə"
diff --git a/pvr.mythtv/resources/language/resource.language.bg_bg/strings.po b/pvr.mythtv/resources/language/resource.language.bg_bg/strings.po
index 86941a6..eac73dc 100644
--- a/pvr.mythtv/resources/language/resource.language.bg_bg/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.bg_bg/strings.po
@@ -256,10 +256,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Изтрий и повторно запиши"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Съхранявай LiveTV записите"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Опресни кеша за иконки на каналите"
diff --git a/pvr.mythtv/resources/language/resource.language.ca_es/strings.po b/pvr.mythtv/resources/language/resource.language.ca_es/strings.po
index d54aab7..20816de 100644
--- a/pvr.mythtv/resources/language/resource.language.ca_es/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.ca_es/strings.po
@@ -46,7 +46,7 @@ msgstr "Habilita la televisió en directe"
 
 msgctxt "#30007"
 msgid "Allow Live TV to move scheduled shows"
-msgstr "Permetre a la TV en Viu canviar els esdeveniments programats"
+msgstr "Permetre a la TV en directe canviar els esdeveniments programats"
 
 msgctxt "#30008"
 msgid "Conflict handling"
@@ -54,15 +54,15 @@ msgstr "Tractament de conflictes"
 
 msgctxt "#30009"
 msgid "Prefer Live TV when recording has later slot"
-msgstr "Preferir TV en viu i deixar l'enregistrament per mes tarda"
+msgstr "Preferir la TV en directe i deixar l'enregistrament per més tard"
 
 msgctxt "#30010"
 msgid "Prefer recording and stop Live TV"
-msgstr "Preferència per gravar i parar la TV  en directe"
+msgstr "Preferència per gravar i parar la TV en directe"
 
 msgctxt "#30011"
 msgid "Prefer Live TV and cancel conflicting recording"
-msgstr "Preferir la TV en directe i cancelar el conflicte en la gravació "
+msgstr "Preferir la TV en directe i cancel·lar el conflicte en la gravació "
 
 msgctxt "#30012"
 msgid "MythTV Backend Ethernet address (WOL)"
@@ -230,11 +230,11 @@ msgstr "Gravadora no disponible"
 
 msgctxt "#30307"
 msgid "Canceling conflicting recording: %s"
-msgstr "Cancelant el conflicte en la gravació: %s"
+msgstr "Cancel·lació de la gravació en conflicte: %s"
 
 msgctxt "#30308"
 msgid "Stopping Live TV due to conflicting recording: %s"
-msgstr "Parant la TV en directe durant el conflicte en la gravació: %s"
+msgstr "Parant la TV en directe a causa del conflicte en la gravació: %s"
 
 msgctxt "#30309"
 msgid "Not recording"
@@ -256,10 +256,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Esborrar i tornar a gravar"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Mantenir l'enregistrament LiveTV"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Refrescar memòria cau de les icones per als canals"
diff --git a/pvr.mythtv/resources/language/resource.language.cs_cz/strings.po b/pvr.mythtv/resources/language/resource.language.cs_cz/strings.po
index c09c4f7..fcba68f 100644
--- a/pvr.mythtv/resources/language/resource.language.cs_cz/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.cs_cz/strings.po
@@ -216,6 +216,14 @@ msgctxt "#30113"
 msgid "Do you want to retry ?"
 msgstr "Chcete to zkusit znovu?"
 
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "Nepodařilo se spojit s MythTV backendem pomocí známé verze protokolu. Zkontrolujte prosím kompatibilitu doplňku a aktualizujte váš backend na podporovanou verzi."
+
+msgctxt "#30301"
+msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
+msgstr "Nepodařilo se spojit se službou API MythTV backendu. Zkontrolujte prosím váš PIN kód nebo nastavení backendu. Ve vašem backendu musí být nadefinován PIN kód, jinak se nespojíte."
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
 msgstr "Spojení s podpůrnou vrstvou MythTV ztraceno"
@@ -265,13 +273,29 @@ msgid "Delete and re-record"
 msgstr "Smaž a znovu nahrej"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Pokračuj v nahrávání"
+msgid "Keep recording"
+msgstr "Ponechat nahrávku"
+
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "Ukázat/Schovat neaktivní naplánované položky"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Obnov cache pro ikonky kanálů"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "Spustit aktualizaci kanálů"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "Ukázat status plánování"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "Neošetřené"
+
 msgctxt "#30452"
 msgid "Upcoming"
 msgstr "Nadcházející"
@@ -328,6 +352,26 @@ msgctxt "#30468"
 msgid "Search people"
 msgstr "Vyhledat osobnosti"
 
+msgctxt "#30501"
+msgid "Don't match duplicates"
+msgstr "Nepáruj duplicitní položky"
+
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "Spáruj duplicity podle podtitulu"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "Spáruj duplicity podle popisu"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "Spáruj duplicity podle podtitulu & popisu"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "Spáruj duplicity primárně podle podtitulu a sekundárně dle popisu"
+
 msgctxt "#30506"
 msgid "Recordings never expire"
 msgstr "Nahrávky nikdy nevyprší"
diff --git a/pvr.mythtv/resources/language/resource.language.cy_gb/strings.po b/pvr.mythtv/resources/language/resource.language.cy_gb/strings.po
index c4e142d..2295b7a 100644
--- a/pvr.mythtv/resources/language/resource.language.cy_gb/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.cy_gb/strings.po
@@ -252,10 +252,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Dileu ac ail recordio"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Cadw recordiad LiveTV"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Ail-lwytho'r gelc ar gyfer eiconau sianeli"
diff --git a/pvr.mythtv/resources/language/resource.language.da_dk/strings.po b/pvr.mythtv/resources/language/resource.language.da_dk/strings.po
index c86f03e..2e872ee 100644
--- a/pvr.mythtv/resources/language/resource.language.da_dk/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.da_dk/strings.po
@@ -256,10 +256,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Slet og optag på ny"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Gem LiveTV optagelse"
-
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
 msgstr "Vis/Skjul inaktive programmering"
diff --git a/pvr.mythtv/resources/language/resource.language.de_de/strings.po b/pvr.mythtv/resources/language/resource.language.de_de/strings.po
index 45afb02..52623b3 100644
--- a/pvr.mythtv/resources/language/resource.language.de_de/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.de_de/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Löschen und neu aufnehmen"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "LiveTV-Aufnahme beibehalten"
+msgid "Keep recording"
+msgstr "Aufnahme fortsetzen"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.el_gr/strings.po b/pvr.mythtv/resources/language/resource.language.el_gr/strings.po
index 0c8df35..c484041 100644
--- a/pvr.mythtv/resources/language/resource.language.el_gr/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.el_gr/strings.po
@@ -208,6 +208,14 @@ msgctxt "#30111"
 msgid "A cut list or commercial skips have been found.\nDo you want to activate EDL functionality for this show ?"
 msgstr "Βρέθηκαν διαφημίσεις ή κάποια λίστα αποφυγής.\nΝα ενεργοποιηθεί η λειτουργία EDL για αυτήν τη σειρά ;"
 
+msgctxt "#30112"
+msgid "Connection failed"
+msgstr "Σύνδεση απέτυχε"
+
+msgctxt "#30113"
+msgid "Do you want to retry ?"
+msgstr "Θέλετε να ξαναδοκιμάσετε ?"
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
 msgstr "Απώλεια σύνδεσης με το backend του MythTV"
@@ -256,18 +264,26 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Διαγραφή και επανεγγραφή"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Να συνεχίζεται η εγγραφή LiveTV"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Ανανεώστε τη μνήμη cache για εικ. καναλιών"
 
+msgctxt "#30452"
+msgid "Upcoming"
+msgstr "Επερχόμενο"
+
 msgctxt "#30460"
 msgid "Manual"
 msgstr "Χειροκίνητα"
 
+msgctxt "#30467"
+msgid "Search keyword"
+msgstr "Αναζήτηση λέξης-κλειδί"
+
+msgctxt "#30468"
+msgid "Search people"
+msgstr "Αναζήτηση ανθρώπων"
+
 msgctxt "#30507"
 msgid "Allow recordings to expire"
 msgstr "Να επιτρέπεται η χρονική λήξη των εγγραφών;"
diff --git a/pvr.mythtv/resources/language/resource.language.en_au/strings.po b/pvr.mythtv/resources/language/resource.language.en_au/strings.po
index 9c7d716..91c1769 100644
--- a/pvr.mythtv/resources/language/resource.language.en_au/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.en_au/strings.po
@@ -253,8 +253,8 @@ msgid "Delete and re-record"
 msgstr "Delete and re-record"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Keep LiveTV recording"
+msgid "Keep recording"
+msgstr "Keep recording"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.en_gb/strings.po b/pvr.mythtv/resources/language/resource.language.en_gb/strings.po
index a277b6d..dbf55fd 100644
--- a/pvr.mythtv/resources/language/resource.language.en_gb/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.en_gb/strings.po
@@ -294,7 +294,7 @@ msgid "Delete and re-record"
 msgstr ""
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
+msgid "Keep recording"
 msgstr ""
 
 #empty strings from id 30413 to 30420
diff --git a/pvr.mythtv/resources/language/resource.language.en_nz/strings.po b/pvr.mythtv/resources/language/resource.language.en_nz/strings.po
index 53f37e4..4f85d08 100644
--- a/pvr.mythtv/resources/language/resource.language.en_nz/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.en_nz/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Delete and re-record"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Keep LiveTV recording"
+msgid "Keep recording"
+msgstr "Keep recording"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.en_us/strings.po b/pvr.mythtv/resources/language/resource.language.en_us/strings.po
index fb770f4..4a95c03 100644
--- a/pvr.mythtv/resources/language/resource.language.en_us/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.en_us/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Delete and re-record"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Keep LiveTV recording"
+msgid "Keep recording"
+msgstr "Keep recording"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.es_ar/strings.po b/pvr.mythtv/resources/language/resource.language.es_ar/strings.po
index 92b3490..de80d49 100644
--- a/pvr.mythtv/resources/language/resource.language.es_ar/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.es_ar/strings.po
@@ -252,10 +252,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Eliminar y volver a grabar"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Seguir grabando LiveTV"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Refrescar cache de ícones de canales"
diff --git a/pvr.mythtv/resources/language/resource.language.es_es/strings.po b/pvr.mythtv/resources/language/resource.language.es_es/strings.po
index e96da1c..a7c77bc 100644
--- a/pvr.mythtv/resources/language/resource.language.es_es/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.es_es/strings.po
@@ -216,6 +216,10 @@ msgctxt "#30113"
 msgid "Do you want to retry ?"
 msgstr "¿Volver a intentar?"
 
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "Ha fallado la conexión al backend MythTV con las versionesde protocolos conocidas. Por favor, compruebe la tabla de compatibilidades del addon y actualice su backend a una versión soportada."
+
 msgctxt "#30301"
 msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
 msgstr "Fallo en la conexión del API del backend de MythTV. Por favor revisa tu código PIN o configuración del backend. El código PIN debe ser configurado en el backend para permitir la conexión"
@@ -269,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Borrar y volver a grabar"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Mantener la grabación LiveTV"
+msgid "Keep recording"
+msgstr "Mantener grabación"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
@@ -280,18 +284,34 @@ msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Refrescar cache de los iconos para los canales"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "Provocar la actualización de los canales"
+
 msgctxt "#30424"
 msgid "Show status of scheduling"
 msgstr "Muestra el estado de la programación"
 
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "No soportado"
+
 msgctxt "#30452"
 msgid "Upcoming"
 msgstr "Por venir"
 
+msgctxt "#30453"
+msgid "Overriden"
+msgstr "Anulado"
+
 msgctxt "#30454"
 msgid "Don't record"
 msgstr "No grabar"
 
+msgctxt "#30455"
+msgid "Upcoming manual"
+msgstr "Siguiente programa manual"
+
 msgctxt "#30456"
 msgid "Zombie"
 msgstr "Zombi"
@@ -332,6 +352,26 @@ msgctxt "#30468"
 msgid "Search people"
 msgstr "Buscar gente"
 
+msgctxt "#30501"
+msgid "Don't match duplicates"
+msgstr "No detectar duplicados"
+
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "Detectar duplicados usando subtítulos"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "Detectar duplicados usando la descripción"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "Detectar duplicados usando subtítulos y las descripciones"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "Detectar duplicados usando subtítulos y, después, las descripciones"
+
 msgctxt "#30506"
 msgid "Recordings never expire"
 msgstr "LAs grabaciones nunca caducan"
diff --git a/pvr.mythtv/resources/language/resource.language.et_ee/strings.po b/pvr.mythtv/resources/language/resource.language.et_ee/strings.po
index a3f6b09..ba76e6d 100644
--- a/pvr.mythtv/resources/language/resource.language.et_ee/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.et_ee/strings.po
@@ -192,10 +192,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Kustuta ja salvesta uuesti"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Jätka OtseTV salvestamist"
-
 msgctxt "#30460"
 msgid "Manual"
 msgstr "Käsitsi"
diff --git a/pvr.mythtv/resources/language/resource.language.eu_es/strings.po b/pvr.mythtv/resources/language/resource.language.eu_es/strings.po
index 209291b..9c12c79 100644
--- a/pvr.mythtv/resources/language/resource.language.eu_es/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.eu_es/strings.po
@@ -20,6 +20,10 @@ msgctxt "#30019"
 msgid "General"
 msgstr "Orokorra"
 
+msgctxt "#30050"
+msgid "Advanced"
+msgstr "Aurreratua"
+
 msgctxt "#30055"
 msgid "Always"
 msgstr "Beti"
diff --git a/pvr.mythtv/resources/language/resource.language.fi_fi/strings.po b/pvr.mythtv/resources/language/resource.language.fi_fi/strings.po
index 6f022c1..e5309a7 100644
--- a/pvr.mythtv/resources/language/resource.language.fi_fi/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.fi_fi/strings.po
@@ -42,11 +42,27 @@ msgstr "Sisällytä enemmän debug tietoa lokitiedostoon"
 
 msgctxt "#30006"
 msgid "Enable Live TV"
-msgstr "Live TV käytössä"
+msgstr "Ota tv-lähetys käyttöön"
+
+msgctxt "#30007"
+msgid "Allow Live TV to move scheduled shows"
+msgstr "Salli suorien lähetysten siirtää ajastuksia"
+
+msgctxt "#30008"
+msgid "Conflict handling"
+msgstr "Ristiriitojen käsittely"
+
+msgctxt "#30009"
+msgid "Prefer Live TV when recording has later slot"
+msgstr "Suosi suoraa lähetystä, kun tallennuksella on myöhäisempi ajankohta"
 
 msgctxt "#30010"
 msgid "Prefer recording and stop Live TV"
-msgstr "Suosi tallennuksia ja pysäytä Live TV"
+msgstr "Suosi tallennuksia ja pysäytä tv-lähetys"
+
+msgctxt "#30011"
+msgid "Prefer Live TV and cancel conflicting recording"
+msgstr "Suosi tv-lähetystä ja peru päällekkäiset tallennukset"
 
 msgctxt "#30012"
 msgid "MythTV Backend Ethernet address (WOL)"
@@ -58,7 +74,7 @@ msgstr "MythTV:n taustaosan portti API palveluille"
 
 msgctxt "#30014"
 msgid "MythTV Security Pin for API services"
-msgstr "MythTV Turva PIN API palveluille"
+msgstr "MythTV:n API-palveluiden Pin-koodi "
 
 msgctxt "#30019"
 msgid "General"
@@ -84,14 +100,38 @@ msgctxt "#30026"
 msgid "Automatically Look Up Metadata"
 msgstr "Etsi automaattisesti metatietoja"
 
+msgctxt "#30027"
+msgid "Commercial Flag new recordings"
+msgstr "Tunnista mainokset uusissa tallennuksissa"
+
 msgctxt "#30028"
 msgid "Transcode new recordings"
 msgstr "Transkoodaa uudet tallennukset"
 
+msgctxt "#30029"
+msgid "Run User Job #1"
+msgstr "Aja käyttäjän tehtävä #1"
+
+msgctxt "#30030"
+msgid "Run User Job #2"
+msgstr "Aja käyttäjän tehtävä #2"
+
+msgctxt "#30031"
+msgid "Run User Job #3"
+msgstr "Aja käyttäjän tehtävä #3"
+
+msgctxt "#30032"
+msgid "Run User Job #4"
+msgstr "Aja käyttäjän tehtävä #4"
+
 msgctxt "#30033"
 msgid "Transcoder"
 msgstr "Transkooderi"
 
+msgctxt "#30034"
+msgid "Allow recordings to expire"
+msgstr "Salli tallennusten vanheta"
+
 msgctxt "#30049"
 msgid "Recording template"
 msgstr "Tallennusmalli"
@@ -100,6 +140,10 @@ msgctxt "#30050"
 msgid "Advanced"
 msgstr "Lisäasetukset"
 
+msgctxt "#30052"
+msgid "Enable demuxing MPEG-TS"
+msgstr "Demuxaa MPEG-TS"
+
 msgctxt "#30053"
 msgid "Tuning delay (sec)"
 msgstr "Viritysviive (sek)"
@@ -120,6 +164,10 @@ msgctxt "#30057"
 msgid "Never"
 msgstr "Ei koskaan"
 
+msgctxt "#30058"
+msgid "Enable commercial skips (EDL)"
+msgstr "Mainosten ohitus päälle (EDL)"
+
 msgctxt "#30059"
 msgid "Always"
 msgstr "Aina"
@@ -140,14 +188,26 @@ msgctxt "#30063"
 msgid "Enable channel icons"
 msgstr "Käytä kanavakuvakkeita"
 
+msgctxt "#30064"
+msgid "Enable recording fanart/thumbnails"
+msgstr "Näytä tallennusten fanitaide/kuvakkeet"
+
 msgctxt "#30065"
 msgid "Limit channel tuning attempts"
 msgstr "Rajoita kanavanhaku yritykset"
 
+msgctxt "#30100"
+msgid "Protocol version: %i - Database version: %i"
+msgstr "Protokollan versio: %i - Tietokannan versio: %i"
+
 msgctxt "#30110"
 msgid "Enabling EDL"
 msgstr "Ota EDL käyttöön"
 
+msgctxt "#30111"
+msgid "A cut list or commercial skips have been found.\nDo you want to activate EDL functionality for this show ?"
+msgstr "Mainoskatkojen leikkauslista löytyi.\nHaluatko ottaa EDL-toiminnon käyttöön tälle ohjelmalle?"
+
 msgctxt "#30112"
 msgid "Connection failed"
 msgstr "Yhteys epäonnistui"
@@ -156,6 +216,14 @@ msgctxt "#30113"
 msgid "Do you want to retry ?"
 msgstr "Haluatko yrittää uudelleen?"
 
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "Yhdistäminen MythTV:n taustaosaan epäonnistui. Tarkista PVR-lisäosan vaatima minimiversio ja päivitä taustaosa uudempaan versioon."
+
+msgctxt "#30301"
+msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
+msgstr "Yhdistäminen MythTV:n taustaosan API-palveluun epäonnistui. Tarkista PIN-koodisi ja taustaosan asetukset. Taustaosassa pitää olla määriteltynä PIN-koodi, jotta yhteys voidaan muodostaa."
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
 msgstr "Yhteys MythTv:hen katkennut"
@@ -176,6 +244,14 @@ msgctxt "#30306"
 msgid "Recorder unavailable"
 msgstr "Tallennin ei saatavilla"
 
+msgctxt "#30307"
+msgid "Canceling conflicting recording: %s"
+msgstr "Perutaan päällekkäinen tallennus: %s"
+
+msgctxt "#30308"
+msgid "Stopping Live TV due to conflicting recording: %s"
+msgstr "Pysäytetään tv-lähetys päällekkäisen tallennuksen vuoksi: %s"
+
 msgctxt "#30309"
 msgid "Not recording"
 msgstr "Ei tallenna"
@@ -197,17 +273,113 @@ msgid "Delete and re-record"
 msgstr "Poista ja uudelleentallenna"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Pidä LiveTV tallennus"
+msgid "Keep recording"
+msgstr "Jatka tallentamista"
+
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "Näytä/piilota käytöstä poistetut"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Päivitä kanavalogojen välimuisti"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "Käynnistä kanavatietojen päivitys"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "Näytä ajastusten tila"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "Käsittelemätön"
+
+msgctxt "#30452"
+msgid "Upcoming"
+msgstr "Tuleva"
+
+msgctxt "#30453"
+msgid "Overriden"
+msgstr "Ohitettu"
+
+msgctxt "#30454"
+msgid "Don't record"
+msgstr "Älä tallenna"
+
+msgctxt "#30455"
+msgid "Upcoming manual"
+msgstr "Tuleva manuaalinen"
+
+msgctxt "#30456"
+msgid "Zombie"
+msgstr "Zombi"
+
 msgctxt "#30460"
 msgid "Manual"
 msgstr "Manuaalisesti"
 
+msgctxt "#30461"
+msgid "Record one"
+msgstr "Tallenna yksi"
+
+msgctxt "#30462"
+msgid "Record weekly"
+msgstr "Tallenna viikoittain"
+
+msgctxt "#30463"
+msgid "Record daily"
+msgstr "Tallenna päivittäin"
+
+msgctxt "#30464"
+msgid "Record all"
+msgstr "Tallenna kaikki"
+
+msgctxt "#30465"
+msgid "Record this"
+msgstr "Tallenna tämä"
+
+msgctxt "#30466"
+msgid "Record series"
+msgstr "Tallenna sarjoja"
+
+msgctxt "#30467"
+msgid "Search keyword"
+msgstr "Etsi avainsanalla"
+
+msgctxt "#30468"
+msgid "Search people"
+msgstr "Etsi ihmisiä"
+
+msgctxt "#30501"
+msgid "Don't match duplicates"
+msgstr "Älä etsi kaksoiskappaleita"
+
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "Selvitä kaksoiskappaleet tekstityksen avulla"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "Selvitä kaksoiskappaleet selostuksen avulla"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "Selvitä kaksoiskappaleet tekstityksen ja selostuksen avulla"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "Selvitä kaksoiskappaleet ensijaisesti tekstityksen, sitten vasta selostuksen perusteella"
+
+msgctxt "#30506"
+msgid "Recordings never expire"
+msgstr "Tallennukset eivät koskaan vanhene"
+
+msgctxt "#30507"
+msgid "Allow recordings to expire"
+msgstr "Salli tallennusten vanheta"
+
 msgctxt "#30508"
 msgid "Keep up to %d recordings"
 msgstr "Pidä enintään %d tallennusta"
diff --git a/pvr.mythtv/resources/language/resource.language.fr_ca/strings.po b/pvr.mythtv/resources/language/resource.language.fr_ca/strings.po
index 84891b9..e5a991b 100644
--- a/pvr.mythtv/resources/language/resource.language.fr_ca/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.fr_ca/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Supprimer et ré-enregistrer"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Garder l'enregistrement de la télé en direct"
+msgid "Keep recording"
+msgstr "Garder l'enregistrement"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
@@ -290,7 +290,7 @@ msgstr "Déclencher la mise à jour des chaînes"
 
 msgctxt "#30424"
 msgid "Show status of scheduling"
-msgstr "Montrer l'état de la programmation"
+msgstr "Afficher l'état de la programmation"
 
 msgctxt "#30451"
 msgid "Unhandled"
diff --git a/pvr.mythtv/resources/language/resource.language.fr_fr/strings.po b/pvr.mythtv/resources/language/resource.language.fr_fr/strings.po
index d6b908f..a3d649e 100644
--- a/pvr.mythtv/resources/language/resource.language.fr_fr/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.fr_fr/strings.po
@@ -42,11 +42,11 @@ msgstr "Inclure plus d'informations de débogage dans le fichier de journal"
 
 msgctxt "#30006"
 msgid "Enable Live TV"
-msgstr "Activer la télévision en direct"
+msgstr "Activer la TV en direct"
 
 msgctxt "#30007"
 msgid "Allow Live TV to move scheduled shows"
-msgstr "Autoriser la TV à modifier la planification des programmes"
+msgstr "Autoriser la TV en direct à modifier la planification des programmes"
 
 msgctxt "#30008"
 msgid "Conflict handling"
@@ -174,7 +174,7 @@ msgstr "Toujours"
 
 msgctxt "#30060"
 msgid "Dialog"
-msgstr "Boîte de dialogue"
+msgstr "Fenêtre de dialogue"
 
 msgctxt "#30061"
 msgid "Never"
@@ -190,7 +190,7 @@ msgstr "Afficher l'icône des chaînes"
 
 msgctxt "#30064"
 msgid "Enable recording fanart/thumbnails"
-msgstr "Activer l'enregistrement des fanarts/miniatures"
+msgstr "Activer l'enregistrement des FanArts/miniatures"
 
 msgctxt "#30065"
 msgid "Limit channel tuning attempts"
@@ -198,7 +198,7 @@ msgstr "Limiter les tentatives de syntonisation"
 
 msgctxt "#30100"
 msgid "Protocol version: %i - Database version: %i"
-msgstr "Version du protocole : %i - Version de la base de données: %i"
+msgstr "Version du protocole : %i - Version de la base de données : %i"
 
 msgctxt "#30110"
 msgid "Enabling EDL"
@@ -250,7 +250,7 @@ msgstr "Annuler l'enregistrement en conflit : %s"
 
 msgctxt "#30308"
 msgid "Stopping Live TV due to conflicting recording: %s"
-msgstr "TV en direct stoppée pour l'enregistrement en conflit : %s"
+msgstr "TV en direct stoppée à cause d'enregistrement en conflit : %s"
 
 msgctxt "#30309"
 msgid "Not recording"
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Supprimer et réenregistrer"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Conserver l'enregistrement de la TV en direct"
+msgid "Keep recording"
+msgstr "Conserver l'enregistrement"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.gl_es/strings.po b/pvr.mythtv/resources/language/resource.language.gl_es/strings.po
index 4803e94..f4a0c5e 100644
--- a/pvr.mythtv/resources/language/resource.language.gl_es/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.gl_es/strings.po
@@ -268,10 +268,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Eliminar e volver gravar"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Manter a gravación do LiveTV"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Actualizar a caché de iconas das canles"
diff --git a/pvr.mythtv/resources/language/resource.language.he_il/strings.po b/pvr.mythtv/resources/language/resource.language.he_il/strings.po
index 11840e2..508ed4b 100644
--- a/pvr.mythtv/resources/language/resource.language.he_il/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.he_il/strings.po
@@ -208,6 +208,22 @@ msgctxt "#30111"
 msgid "A cut list or commercial skips have been found.\nDo you want to activate EDL functionality for this show ?"
 msgstr "רשימת נק' חיתוך הקלטה או דילוגי פרסומות נמצאו.\nהאם לאפשר את תכונת EDL עבור תכנית זו?"
 
+msgctxt "#30112"
+msgid "Connection failed"
+msgstr "החיבור נכשל"
+
+msgctxt "#30113"
+msgid "Do you want to retry ?"
+msgstr "האם ברצונך לנסות שנית?"
+
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "נכשל בהתחברות אל MythTV backend עם גרסת פרוטוקול לא ידוע. בדוק בבקשה את מפת התאימות של התוסף ועדכן את הbackend שלך כדי לתמוך בגרסה זו."
+
+msgctxt "#30301"
+msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
+msgstr "נכשל בחיבור לשירות API של MythTV backend. בדוק בבקשה את הקוד PIN או את התקנת backend שלך. הקוד PIN צריך להיות מוגדר בbackend על מנת שיוכל להתחבר."
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
 msgstr "נותק משרת MythTV"
@@ -256,18 +272,74 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "מחיקה והקלטה מחדש"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "השאר הקלטת שידור חי"
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "הצג/הסתר בקרוב לא פעיל"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "רענן מטמון סמלי ערוץ"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "גורם מפעיל עדכון ערוצים"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "הצג סטטוס של תזמון"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "לא מטופל"
+
+msgctxt "#30452"
+msgid "Upcoming"
+msgstr "בקרוב"
+
+msgctxt "#30454"
+msgid "Don't record"
+msgstr "לא להקליט"
+
+msgctxt "#30456"
+msgid "Zombie"
+msgstr "זומבי"
+
 msgctxt "#30460"
 msgid "Manual"
 msgstr "ידני"
 
+msgctxt "#30461"
+msgid "Record one"
+msgstr "הקלטה חד פעמית"
+
+msgctxt "#30462"
+msgid "Record weekly"
+msgstr "הקלטה שבועית"
+
+msgctxt "#30463"
+msgid "Record daily"
+msgstr "הקלטה יומית"
+
+msgctxt "#30464"
+msgid "Record all"
+msgstr "הקלט הכל"
+
+msgctxt "#30465"
+msgid "Record this"
+msgstr "הקלט זה"
+
+msgctxt "#30466"
+msgid "Record series"
+msgstr "הקלטת סדרה"
+
+msgctxt "#30467"
+msgid "Search keyword"
+msgstr "חיפוש מילת מפתח"
+
+msgctxt "#30468"
+msgid "Search people"
+msgstr "חיפוש אנשים"
+
 msgctxt "#30507"
 msgid "Allow recordings to expire"
 msgstr "אפשר פקיעת תוקף הקלטות"
diff --git a/pvr.mythtv/resources/language/resource.language.hr_hr/strings.po b/pvr.mythtv/resources/language/resource.language.hr_hr/strings.po
index 6d40f4e..b01cf30 100644
--- a/pvr.mythtv/resources/language/resource.language.hr_hr/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.hr_hr/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Obriši i ponovno snimi"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Nastavi snimanje TV programa"
+msgid "Keep recording"
+msgstr "Nastavi snimanje"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.hu_hu/strings.po b/pvr.mythtv/resources/language/resource.language.hu_hu/strings.po
index 2883001..fdb53e7 100644
--- a/pvr.mythtv/resources/language/resource.language.hu_hu/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.hu_hu/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Törlés és újra-felvétel"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "LiveTV felvétel folyamatosan"
+msgid "Keep recording"
+msgstr "Felvétel megtartása"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.id_id/strings.po b/pvr.mythtv/resources/language/resource.language.id_id/strings.po
index 644b54f..9d25b4d 100644
--- a/pvr.mythtv/resources/language/resource.language.id_id/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.id_id/strings.po
@@ -264,10 +264,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Hapus dan rekam ulang"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Pertahankan perekaman Siaran Langsung TV"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Perbarui cache untuk ikon kanal"
diff --git a/pvr.mythtv/resources/language/resource.language.is_is/strings.po b/pvr.mythtv/resources/language/resource.language.is_is/strings.po
index d6bfa55..847530d 100644
--- a/pvr.mythtv/resources/language/resource.language.is_is/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.is_is/strings.po
@@ -256,10 +256,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Eyða og taka upp aftur"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Halda Live TV í upptöku"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Uppfæra flýtiminni fyrir táknmyndir rása"
diff --git a/pvr.mythtv/resources/language/resource.language.it_it/strings.po b/pvr.mythtv/resources/language/resource.language.it_it/strings.po
index 5163ef3..1627180 100644
--- a/pvr.mythtv/resources/language/resource.language.it_it/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.it_it/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Elimina e registra di nuovo"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Mantieni le registrazioni della LiveTV"
+msgid "Keep recording"
+msgstr "Mantieni registrazione"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.ja_jp/strings.po b/pvr.mythtv/resources/language/resource.language.ja_jp/strings.po
index d4a20f9..8c0abd1 100644
--- a/pvr.mythtv/resources/language/resource.language.ja_jp/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.ja_jp/strings.po
@@ -238,7 +238,7 @@ msgstr "録画しない"
 
 msgctxt "#30310"
 msgid "Enabled"
-msgstr "LCD有効"
+msgstr "有効"
 
 msgctxt "#30311"
 msgid "Disabled"
@@ -252,10 +252,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "削除して再録画"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "テレビ放送の録画をつづける"
-
 msgctxt "#30460"
 msgid "Manual"
 msgstr "マニュアル"
diff --git a/pvr.mythtv/resources/language/resource.language.ko_kr/strings.po b/pvr.mythtv/resources/language/resource.language.ko_kr/strings.po
index 739eedb..40eb4c3 100644
--- a/pvr.mythtv/resources/language/resource.language.ko_kr/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.ko_kr/strings.po
@@ -192,6 +192,10 @@ msgctxt "#30064"
 msgid "Enable recording fanart/thumbnails"
 msgstr "녹화 팬아트/썸네일 사용"
 
+msgctxt "#30065"
+msgid "Limit channel tuning attempts"
+msgstr "채널 튜닝 시도수 제한"
+
 msgctxt "#30100"
 msgid "Protocol version: %i - Database version: %i"
 msgstr "프로토콜 버전: %i - 데이터베이스 버전: %i"
@@ -204,6 +208,22 @@ msgctxt "#30111"
 msgid "A cut list or commercial skips have been found.\nDo you want to activate EDL functionality for this show ?"
 msgstr "컷 목록 또는 광고 건너뛰기가 발견됐습니다.\n이 쇼에 대해 EDL 기능을 사용하겠습니까?"
 
+msgctxt "#30112"
+msgid "Connection failed"
+msgstr "연결 실패"
+
+msgctxt "#30113"
+msgid "Do you want to retry ?"
+msgstr "다시 시도하시겠습니까?"
+
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "알려진 프로토콜 버젼과 MythTV 백엔드 연결 실패. 애드온의 호환성 맵을 확인하시고 지원되는 버전으로 백엔드를 업그레이드하세요."
+
+msgctxt "#30301"
+msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
+msgstr "MythTV 백엔드 API 서비스 연결 실패. PIN 코드나 백엔드 셋업을 확인하세요. 연결하려면 백엔드에서 PIN 코드가 설정되어야 합니다."
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
 msgstr "MythTV 백엔드 연결 끊김 "
@@ -253,17 +273,117 @@ msgid "Delete and re-record"
 msgstr "지우고 다시 녹화"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "라이브 TV 녹화 유지"
+msgid "Keep recording"
+msgstr "계속 녹화"
+
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "비활성된 방송 예정 보이기/숨기기"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "채널 아이콘 캐시 새로 고침"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "채널 업데이트 트리거"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "예약 상태 표시"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "처리하지 않음"
+
+msgctxt "#30452"
+msgid "Upcoming"
+msgstr "예정됨"
+
+msgctxt "#30453"
+msgid "Overriden"
+msgstr "무시함"
+
+msgctxt "#30454"
+msgid "Don't record"
+msgstr "녹화하지 않음"
+
+msgctxt "#30455"
+msgid "Upcoming manual"
+msgstr "예정된 매뉴얼"
+
+msgctxt "#30456"
+msgid "Zombie"
+msgstr "좀비"
+
 msgctxt "#30460"
 msgid "Manual"
 msgstr "수동"
 
+msgctxt "#30461"
+msgid "Record one"
+msgstr "한 번 녹화"
+
+msgctxt "#30462"
+msgid "Record weekly"
+msgstr "매주 녹화"
+
+msgctxt "#30463"
+msgid "Record daily"
+msgstr "매일 녹화"
+
+msgctxt "#30464"
+msgid "Record all"
+msgstr "모두 녹화"
+
+msgctxt "#30465"
+msgid "Record this"
+msgstr "이것 녹화"
+
+msgctxt "#30466"
+msgid "Record series"
+msgstr "시리즈 녹화"
+
+msgctxt "#30467"
+msgid "Search keyword"
+msgstr "키워드 검색"
+
+msgctxt "#30468"
+msgid "Search people"
+msgstr "인물 검색"
+
+msgctxt "#30501"
+msgid "Don't match duplicates"
+msgstr "중복 제외"
+
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "자막 기준 중복 맞춤"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "설명 기준 중복 맞춤"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "자막과 설명 기준 중복 맞춤"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "자막 후 설명 기준 중복 맞춤"
+
+msgctxt "#30506"
+msgid "Recordings never expire"
+msgstr "녹화를 만료하지 않음"
+
 msgctxt "#30507"
 msgid "Allow recordings to expire"
 msgstr "녹화 만료 허용"
+
+msgctxt "#30508"
+msgid "Keep up to %d recordings"
+msgstr "녹화 %d편만 보존"
+
+msgctxt "#30509"
+msgid "Keep %d newest and expire old"
+msgstr "최신 %d편만 보존하고 나머지는 만료"
diff --git a/pvr.mythtv/resources/language/resource.language.lt_lt/strings.po b/pvr.mythtv/resources/language/resource.language.lt_lt/strings.po
index 2471aab..8c2ad36 100644
--- a/pvr.mythtv/resources/language/resource.language.lt_lt/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.lt_lt/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Ištrinti ir įrašyti iš naujo"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Išlaikyti televizijos įrašą"
+msgid "Keep recording"
+msgstr "Įrašinėti toliau"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.lv_lv/strings.po b/pvr.mythtv/resources/language/resource.language.lv_lv/strings.po
index 621bb6b..99a9659 100644
--- a/pvr.mythtv/resources/language/resource.language.lv_lv/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.lv_lv/strings.po
@@ -252,10 +252,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Dzēst un ierakstīt no jauna"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Paturēt tiešraides TV ierakstu"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Atsvaidzināt kešatmiņu kanālu ikonām"
diff --git a/pvr.mythtv/resources/language/resource.language.mk_mk/strings.po b/pvr.mythtv/resources/language/resource.language.mk_mk/strings.po
index ee810ce..d6c16ed 100644
--- a/pvr.mythtv/resources/language/resource.language.mk_mk/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.mk_mk/strings.po
@@ -252,10 +252,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Избриши и сними од почеток"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Продолжи да снимаш од LiveTV"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Освежи го кешот за иконите на каналот"
diff --git a/pvr.mythtv/resources/language/resource.language.ms_my/strings.po b/pvr.mythtv/resources/language/resource.language.ms_my/strings.po
index e14575f..5113805 100644
--- a/pvr.mythtv/resources/language/resource.language.ms_my/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.ms_my/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Padam dan rakam-semula"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Kekalkan rakaman TV Langsung"
+msgid "Keep recording"
+msgstr "Kekal merakam"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.nb_no/strings.po b/pvr.mythtv/resources/language/resource.language.nb_no/strings.po
index 425721d..e392ed1 100644
--- a/pvr.mythtv/resources/language/resource.language.nb_no/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.nb_no/strings.po
@@ -208,6 +208,22 @@ msgctxt "#30111"
 msgid "A cut list or commercial skips have been found.\nDo you want to activate EDL functionality for this show ?"
 msgstr "En kutt-liste eller reklame-hopper er funnet.\nVil du aktivere EDL-funksjonalitet for dette programmet?"
 
+msgctxt "#30112"
+msgid "Connection failed"
+msgstr "Tilkobling feilet"
+
+msgctxt "#30113"
+msgid "Do you want to retry ?"
+msgstr "Ønsker du å prøve på nytt ?"
+
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "Tilkoblingen feilet til MythTV tjenesten med kjent protokoll versjon. Vennligst sjekk kompatibiliteten for tillegget og oppgrader din tjeneste til en støttet versjon."
+
+msgctxt "#30301"
+msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
+msgstr "Tilkobling feilet til API tjensten til MythTV tjenste. Vennligst sjekk din PIN kode eller tjeneste oppsett. PIN koden må konfigureres på din tjeneste for å tillate tilkobling."
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
 msgstr "Tilkoblingen til MythTV tapt"
@@ -257,17 +273,117 @@ msgid "Delete and re-record"
 msgstr "Slett og ta opp på nytt"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Fortsett LiveTV opptak"
+msgid "Keep recording"
+msgstr "Behold opptak"
+
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "Vis/skjul inaktive kommende"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Oppdater minne for kanal ikoner"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "Sjekk kanal oppdateringer"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "Vis status for planlegning"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "Uhåndtert"
+
+msgctxt "#30452"
+msgid "Upcoming"
+msgstr "Kommende"
+
+msgctxt "#30453"
+msgid "Overriden"
+msgstr "Overskredet"
+
+msgctxt "#30454"
+msgid "Don't record"
+msgstr "Ikke ta opp"
+
+msgctxt "#30455"
+msgid "Upcoming manual"
+msgstr "Kommende manuell"
+
+msgctxt "#30456"
+msgid "Zombie"
+msgstr "Zombie"
+
 msgctxt "#30460"
 msgid "Manual"
 msgstr "Manuelt"
 
+msgctxt "#30461"
+msgid "Record one"
+msgstr "Ta opp 1"
+
+msgctxt "#30462"
+msgid "Record weekly"
+msgstr "Ta opp ukentlig"
+
+msgctxt "#30463"
+msgid "Record daily"
+msgstr "Ta opp daglig"
+
+msgctxt "#30464"
+msgid "Record all"
+msgstr "Ta opp alle"
+
+msgctxt "#30465"
+msgid "Record this"
+msgstr "Ta opp denne"
+
+msgctxt "#30466"
+msgid "Record series"
+msgstr "Ta opp serier"
+
+msgctxt "#30467"
+msgid "Search keyword"
+msgstr "Søk nøkkelord"
+
+msgctxt "#30468"
+msgid "Search people"
+msgstr "Søk personer"
+
+msgctxt "#30501"
+msgid "Don't match duplicates"
+msgstr "Ikke gjenkjenn duplikater"
+
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "Gjenkjen duplikater ved hjelp av undetekster"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "Gjenkjen duplikater ved hjelp av beskrivelse"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "Gjenkjen duplikater ved hjelp av undertekster og beskrivelse"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "Gjenkjen duplikater ved hjelp av undertekster så beskrivelse"
+
+msgctxt "#30506"
+msgid "Recordings never expire"
+msgstr "Opptak utløper avldri"
+
 msgctxt "#30507"
 msgid "Allow recordings to expire"
 msgstr "Tillat opptak å utløpe"
+
+msgctxt "#30508"
+msgid "Keep up to %d recordings"
+msgstr "Behold opptil %d opptak"
+
+msgctxt "#30509"
+msgid "Keep %d newest and expire old"
+msgstr "Behold %d nyeste og utløp eldre"
diff --git a/pvr.mythtv/resources/language/resource.language.nl_nl/strings.po b/pvr.mythtv/resources/language/resource.language.nl_nl/strings.po
index 2274cab..cb37d96 100644
--- a/pvr.mythtv/resources/language/resource.language.nl_nl/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.nl_nl/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Verwijder en her-opnemen"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Behoud LiveTV opname"
+msgid "Keep recording"
+msgstr "Behoud opname"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.pl_pl/strings.po b/pvr.mythtv/resources/language/resource.language.pl_pl/strings.po
index d19c860..0f54bcd 100644
--- a/pvr.mythtv/resources/language/resource.language.pl_pl/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.pl_pl/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Skasuj i nagraj ponownie "
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Zachowaj nagranie telewizyjne"
+msgid "Keep recording"
+msgstr "Zachowuj nagranie"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.pt_br/strings.po b/pvr.mythtv/resources/language/resource.language.pt_br/strings.po
index 354fc5b..f914548 100644
--- a/pvr.mythtv/resources/language/resource.language.pt_br/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.pt_br/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Deletar e regravar"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Manter gravação de TV ao Vivo"
+msgid "Keep recording"
+msgstr "Manter gravação"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.pt_pt/strings.po b/pvr.mythtv/resources/language/resource.language.pt_pt/strings.po
index 41c13c0..3f44be7 100644
--- a/pvr.mythtv/resources/language/resource.language.pt_pt/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.pt_pt/strings.po
@@ -22,11 +22,11 @@ msgstr "Nome ou IP do servidor MythTV"
 
 msgctxt "#30001"
 msgid "MythTV Backend Port"
-msgstr "Porta da estrutura MythTV"
+msgstr "Porto da estrutura MythTV"
 
 msgctxt "#30002"
 msgid "MythTV Database Username"
-msgstr "Nome de utilizador da base de dados MythTV "
+msgstr "Nome de utilizador da base de dados MythTV"
 
 msgctxt "#30003"
 msgid "MythTV Database Password"
@@ -54,7 +54,7 @@ msgstr "Gestão de conflitos"
 
 msgctxt "#30009"
 msgid "Prefer Live TV when recording has later slot"
-msgstr "Preferir Tv em direto se existir horário para gravar mais tarde"
+msgstr "Preferir TV em direto se existir horário para gravar mais tarde"
 
 msgctxt "#30010"
 msgid "Prefer recording and stop Live TV"
@@ -70,11 +70,11 @@ msgstr "Endereço ethernet da estrutura MythTV (WOL)"
 
 msgctxt "#30013"
 msgid "MythTV Backend Port for API services"
-msgstr "Porta da estrutura MythTV para os serviços API"
+msgstr "Porto da estrutura MythTV para os serviços API"
 
 msgctxt "#30014"
 msgid "MythTV Security Pin for API services"
-msgstr "Pin de segurança MythTV para serviços da API"
+msgstr "PIN de segurança MythTV para serviços da API"
 
 msgctxt "#30019"
 msgid "General"
@@ -82,7 +82,7 @@ msgstr "Geral"
 
 msgctxt "#30020"
 msgid "Template provider"
-msgstr "Forncedeor de modelos"
+msgstr "Fornecedor de modelos"
 
 msgctxt "#30021"
 msgid "Internal"
@@ -134,7 +134,7 @@ msgstr "Permitir que as gravações expirem"
 
 msgctxt "#30049"
 msgid "Recording template"
-msgstr "Gravar modelo"
+msgstr "Modelo da gravação"
 
 msgctxt "#30050"
 msgid "Advanced"
@@ -142,7 +142,7 @@ msgstr "Avançado"
 
 msgctxt "#30052"
 msgid "Enable demuxing MPEG-TS"
-msgstr "Ativar demux MPEG-TS"
+msgstr "Ativar 'demuxing' MPEG-TS"
 
 msgctxt "#30053"
 msgid "Tuning delay (sec)"
@@ -166,7 +166,7 @@ msgstr "Nunca"
 
 msgctxt "#30058"
 msgid "Enable commercial skips (EDL)"
-msgstr "Ativar saltos comerciais (EDL)"
+msgstr "Permitir ignorar anúncios (EDL)"
 
 msgctxt "#30059"
 msgid "Always"
@@ -174,7 +174,7 @@ msgstr "Sempre"
 
 msgctxt "#30060"
 msgid "Dialog"
-msgstr "Diálogo"
+msgstr "Janela"
 
 msgctxt "#30061"
 msgid "Never"
@@ -194,7 +194,7 @@ msgstr "Ativar gravação de fanart/miniaturas"
 
 msgctxt "#30065"
 msgid "Limit channel tuning attempts"
-msgstr "Limitar tentativas de sintonia"
+msgstr "Limitar tentativas de sintonização"
 
 msgctxt "#30100"
 msgid "Protocol version: %i - Database version: %i"
@@ -202,31 +202,39 @@ msgstr "Versão do protocolo: %i - Versão da base de dados: %i"
 
 msgctxt "#30110"
 msgid "Enabling EDL"
-msgstr "Ativando EDL"
+msgstr "A ativar EDL"
 
 msgctxt "#30111"
 msgid "A cut list or commercial skips have been found.\nDo you want to activate EDL functionality for this show ?"
-msgstr "Uma da lista de cortes ou omissões comerciais foram encontrados.\nQuer ativar a funcionalidade EDL para este programa?"
+msgstr "Foi encontrada uma lista de cortes ou omissões comerciais.\nDeseja ativar a funcionalidade EDL para este programa?"
 
 msgctxt "#30112"
 msgid "Connection failed"
-msgstr "A ligação falhou"
+msgstr "Falha de ligação"
 
 msgctxt "#30113"
 msgid "Do you want to retry ?"
 msgstr "Deseja tentar novamente?"
 
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "Não foi possível ligar-se à infraestrutura do MythTV com as versões conhecidas do protocolo. Verifique por favor o mapa de compatibilidades do add-on e atualize a sua infraestrutura para uma versão suportada."
+
+msgctxt "#30301"
+msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
+msgstr "Não foi possível ligar-se aos serviços da API da infraestrutura do MythTV. Verifique por favor o seu código PIN ou configuração da infraestrutura. O código PIN tem de ser configurado na sua infraestrutura para permitir a ligação."
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
-msgstr "A ligação À estrutura MythTV foi perdida"
+msgstr "A ligação ao MythTV foi perdida"
 
 msgctxt "#30303"
 msgid "Connection to MythTV restored"
-msgstr "Ligação à MythTV restabelecida"
+msgstr "A ligação ao MythTV foi restabelecida"
 
 msgctxt "#30304"
 msgid "No response from MythTV backend"
-msgstr "Nenhuma resposta da estrutura MythTV"
+msgstr "Nenhuma resposta da infraestrutura do MythTV"
 
 msgctxt "#30305"
 msgid "Channel unavailable"
@@ -234,7 +242,7 @@ msgstr "Canal não disponível"
 
 msgctxt "#30306"
 msgid "Recorder unavailable"
-msgstr "Gravador indisponível"
+msgstr "Gravador não disponível"
 
 msgctxt "#30307"
 msgid "Canceling conflicting recording: %s"
@@ -242,7 +250,7 @@ msgstr "Cancelar gravação em conflito: %s"
 
 msgctxt "#30308"
 msgid "Stopping Live TV due to conflicting recording: %s"
-msgstr "Parando TV em direto devido a conflito com gravação: %s"
+msgstr "A parar a TV em direto devido a conflito com gravação: %s"
 
 msgctxt "#30309"
 msgid "Not recording"
@@ -265,21 +273,117 @@ msgid "Delete and re-record"
 msgstr "Apagar e regravar"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Manter gravação LiveTV"
+msgid "Keep recording"
+msgstr "Manter a gravação"
+
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "Mostrar/ocultar receções inativas"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Recarregar cache dos ícones de canal"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "Ativar atualização de canais"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "Mostrar estado do agendamento"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "Não geridos"
+
+msgctxt "#30452"
+msgid "Upcoming"
+msgstr "Brevemente"
+
+msgctxt "#30453"
+msgid "Overriden"
+msgstr "Substituídos"
+
 msgctxt "#30454"
 msgid "Don't record"
 msgstr "Não gravar"
 
+msgctxt "#30455"
+msgid "Upcoming manual"
+msgstr "Seguinte manual"
+
+msgctxt "#30456"
+msgid "Zombie"
+msgstr "Zombie"
+
 msgctxt "#30460"
 msgid "Manual"
 msgstr "Manual"
 
+msgctxt "#30461"
+msgid "Record one"
+msgstr "Gravar uma"
+
+msgctxt "#30462"
+msgid "Record weekly"
+msgstr "Gravar semanalmente"
+
+msgctxt "#30463"
+msgid "Record daily"
+msgstr "Gravar diariamente"
+
+msgctxt "#30464"
+msgid "Record all"
+msgstr "Gravar tudo"
+
+msgctxt "#30465"
+msgid "Record this"
+msgstr "Gravar esta"
+
+msgctxt "#30466"
+msgid "Record series"
+msgstr "Gravar série"
+
+msgctxt "#30467"
+msgid "Search keyword"
+msgstr "Pesquisa por palavra-chave"
+
+msgctxt "#30468"
+msgid "Search people"
+msgstr "Procurar pessoas"
+
+msgctxt "#30501"
+msgid "Don't match duplicates"
+msgstr "Não corresponder os duplicados"
+
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "Corresponder os duplicados pela legenda"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "Corresponder os duplicados pela descrição"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "Corresponder os duplicados pela legenda & descrição"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "Corresponder os duplicados pela legenda e depois descrição"
+
+msgctxt "#30506"
+msgid "Recordings never expire"
+msgstr "As gravações nunca expiram"
+
 msgctxt "#30507"
 msgid "Allow recordings to expire"
 msgstr "Permitir que as gravações expirem"
+
+msgctxt "#30508"
+msgid "Keep up to %d recordings"
+msgstr "Manter até %d gravações"
+
+msgctxt "#30509"
+msgid "Keep %d newest and expire old"
+msgstr "Manter as %d mais recentes e expirar antigas"
diff --git a/pvr.mythtv/resources/language/resource.language.ro_ro/strings.po b/pvr.mythtv/resources/language/resource.language.ro_ro/strings.po
index 6b09bad..7285865 100644
--- a/pvr.mythtv/resources/language/resource.language.ro_ro/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.ro_ro/strings.po
@@ -272,10 +272,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Sterge si reinregistraza"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Păstreaza înregistrarea televiziunii în direct"
-
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
 msgstr "Arată/ascunde viitoare inactive"
diff --git a/pvr.mythtv/resources/language/resource.language.ru_ru/strings.po b/pvr.mythtv/resources/language/resource.language.ru_ru/strings.po
index 4ecca49..6bc60ba 100644
--- a/pvr.mythtv/resources/language/resource.language.ru_ru/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.ru_ru/strings.po
@@ -273,8 +273,8 @@ msgid "Delete and re-record"
 msgstr "Удалить и перезаписать"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Сохранять запись ТВ"
+msgid "Keep recording"
+msgstr "Сохранять запись"
 
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
diff --git a/pvr.mythtv/resources/language/resource.language.sk_sk/strings.po b/pvr.mythtv/resources/language/resource.language.sk_sk/strings.po
index d02cb5f..de106fc 100644
--- a/pvr.mythtv/resources/language/resource.language.sk_sk/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.sk_sk/strings.po
@@ -273,17 +273,117 @@ msgid "Delete and re-record"
 msgstr "Vymazať a znova nahrať"
 
 msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Ponechať nahrávky LiveTV"
+msgid "Keep recording"
+msgstr "Ponechať nahrávku"
+
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "Zobraziť/skryť neaktívne nadchádzajúce udalosti"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Obnoviť dočasné úložisko pre ikony kanálov"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "Spustiť aktualizáciu kanálov"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "Zobraziť stav plánovania"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "Neošetrené"
+
+msgctxt "#30452"
+msgid "Upcoming"
+msgstr "Nadchádzajúce"
+
+msgctxt "#30453"
+msgid "Overriden"
+msgstr "Nahradené"
+
+msgctxt "#30454"
+msgid "Don't record"
+msgstr "Nenahrávať"
+
+msgctxt "#30455"
+msgid "Upcoming manual"
+msgstr "Nadchádzajúce ručné"
+
+msgctxt "#30456"
+msgid "Zombie"
+msgstr "Zombia"
+
 msgctxt "#30460"
 msgid "Manual"
 msgstr "Manuálne"
 
+msgctxt "#30461"
+msgid "Record one"
+msgstr "Nahrávať raz"
+
+msgctxt "#30462"
+msgid "Record weekly"
+msgstr "Nahrávať týždenne"
+
+msgctxt "#30463"
+msgid "Record daily"
+msgstr "Nahrávať denne"
+
+msgctxt "#30464"
+msgid "Record all"
+msgstr "Nahrávať všetko"
+
+msgctxt "#30465"
+msgid "Record this"
+msgstr "Nahrať toto"
+
+msgctxt "#30466"
+msgid "Record series"
+msgstr "Nahrávať seriál"
+
+msgctxt "#30467"
+msgid "Search keyword"
+msgstr "Hľadať kľúčové slovo"
+
+msgctxt "#30468"
+msgid "Search people"
+msgstr "Hľadať ľudí"
+
+msgctxt "#30501"
+msgid "Don't match duplicates"
+msgstr "Nepárovať duplikáty"
+
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "Párovať duplikáty na základe titulkov"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "Párovať duplikáty na základe popisu"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "Párovať duplikáty na základe titulkov a popisu"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "Párovať duplikáty na základe titulkov, potom popisu"
+
+msgctxt "#30506"
+msgid "Recordings never expire"
+msgstr "Nahrávky nikdy neexpirujú"
+
 msgctxt "#30507"
 msgid "Allow recordings to expire"
 msgstr "Povoliť expiráciu nahrávok"
+
+msgctxt "#30508"
+msgid "Keep up to %d recordings"
+msgstr "Ponechať až do %d nahrávok"
+
+msgctxt "#30509"
+msgid "Keep %d newest and expire old"
+msgstr "Ponechať %d najnovších a expirovať staré"
diff --git a/pvr.mythtv/resources/language/resource.language.sl_si/strings.po b/pvr.mythtv/resources/language/resource.language.sl_si/strings.po
index a384a68..08b5382 100644
--- a/pvr.mythtv/resources/language/resource.language.sl_si/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.sl_si/strings.po
@@ -264,10 +264,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Izbriši in ponovno snemaj"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Obdrži posnetke"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Osveži predpomnilnik za ikone programa"
diff --git a/pvr.mythtv/resources/language/resource.language.sr_rs/strings.po b/pvr.mythtv/resources/language/resource.language.sr_rs/strings.po
index f657f45..4a8d764 100644
--- a/pvr.mythtv/resources/language/resource.language.sr_rs/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.sr_rs/strings.po
@@ -272,10 +272,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Избриши и поново сними"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Задржи снимак ТВ Уживо"
-
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
 msgstr "Прикажи/сакриј неактивне предстојеће"
diff --git a/pvr.mythtv/resources/language/resource.language.sr_rs at latin/strings.po b/pvr.mythtv/resources/language/resource.language.sr_rs at latin/strings.po
index c1abb75..3771df0 100644
--- a/pvr.mythtv/resources/language/resource.language.sr_rs at latin/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.sr_rs at latin/strings.po
@@ -272,10 +272,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Izbriši i ponovo snimi"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Zadrži snimak TV Uživo"
-
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
 msgstr "Prikaži/sakrij neaktivne predstojeće"
diff --git a/pvr.mythtv/resources/language/resource.language.sv_se/strings.po b/pvr.mythtv/resources/language/resource.language.sv_se/strings.po
index ab95b15..d8a34eb 100644
--- a/pvr.mythtv/resources/language/resource.language.sv_se/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.sv_se/strings.po
@@ -216,6 +216,14 @@ msgctxt "#30113"
 msgid "Do you want to retry ?"
 msgstr "Vill du försöka igen?"
 
+msgctxt "#30300"
+msgid "Failed to connect the MythTV backend with the known protocol versions. Please check the compatibility map of the addon and upgrade your backend to a supported version."
+msgstr "Det gick inte att ansluta MythTV backend med de kända protokollversionerna. Kontrollera kompatibilitet med tillägg och uppgradera din backend till en version som stöds."
+
+msgctxt "#30301"
+msgid "Failed to connect the API services of MythTV backend. Please check your PIN code or backend setup. The PIN code has to be configured in your backend to allow connection."
+msgstr "Det gick inte att ansluta API tjänster MythTV backend. Kontrollera din PIN-kod eller backend inställningar. PIN-koden måste vara konfigurerade i backend för att möjliggöra anslutning."
+
 msgctxt "#30302"
 msgid "Connection to MythTV backend lost"
 msgstr "Anslutning till MythTV backend förlorad"
@@ -264,22 +272,42 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Ta bort och spela in på nytt"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Fortsätt spela in direktsänd TV"
+msgctxt "#30421"
+msgid "Show/hide inactive upcomings"
+msgstr "Visa/dölj inaktiva uppkommande"
 
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Förnya cache för kanalikoner"
 
+msgctxt "#30423"
+msgid "Trigger channels update"
+msgstr "Trigger kanaler uppdatering"
+
+msgctxt "#30424"
+msgid "Show status of scheduling"
+msgstr "Visa schemaläggningens status"
+
+msgctxt "#30451"
+msgid "Unhandled"
+msgstr "O-hanterad"
+
 msgctxt "#30452"
 msgid "Upcoming"
 msgstr "Kommande"
 
+msgctxt "#30453"
+msgid "Overriden"
+msgstr "Åsidosatt"
+
 msgctxt "#30454"
 msgid "Don't record"
 msgstr "Spela inte in"
 
+msgctxt "#30455"
+msgid "Upcoming manual"
+msgstr "Kommande manual"
+
 msgctxt "#30456"
 msgid "Zombie"
 msgstr "Zombie"
@@ -324,6 +352,22 @@ msgctxt "#30501"
 msgid "Don't match duplicates"
 msgstr "Matcha inte dubbletter"
 
+msgctxt "#30502"
+msgid "Match duplicates using subtitle"
+msgstr "Matcha dubbletter med hjälp av undertext"
+
+msgctxt "#30503"
+msgid "Match duplicates using description"
+msgstr "Matcha dubbletter med hjälp av beskrivning"
+
+msgctxt "#30504"
+msgid "Match duplicates using subtitle & description"
+msgstr "Matcha dubbletter med hjälp av undertext & beskrivning"
+
+msgctxt "#30505"
+msgid "Match duplicates using subtitle then description"
+msgstr "Matcha dubbletter med hjälp av undertext sedan beskrivning"
+
 msgctxt "#30506"
 msgid "Recordings never expire"
 msgstr "Inspelningen upphör aldrig"
diff --git a/pvr.mythtv/resources/language/resource.language.tr_tr/strings.po b/pvr.mythtv/resources/language/resource.language.tr_tr/strings.po
index ba07bdc..f3d03e2 100644
--- a/pvr.mythtv/resources/language/resource.language.tr_tr/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.tr_tr/strings.po
@@ -252,10 +252,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Sil ve yeniden kaydet"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "LiveTV kaydını devam ettir"
-
 msgctxt "#30422"
 msgid "Refresh cache for channel icons"
 msgstr "Kanal logoları için önbelleği tazele"
diff --git a/pvr.mythtv/resources/language/resource.language.uk_ua/strings.po b/pvr.mythtv/resources/language/resource.language.uk_ua/strings.po
index 2ba34f6..095e6f4 100644
--- a/pvr.mythtv/resources/language/resource.language.uk_ua/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.uk_ua/strings.po
@@ -220,10 +220,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "Видалити і перезаписати"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "Залишати запис Live TV"
-
 msgctxt "#30460"
 msgid "Manual"
 msgstr "Уручну"
diff --git a/pvr.mythtv/resources/language/resource.language.zh_cn/strings.po b/pvr.mythtv/resources/language/resource.language.zh_cn/strings.po
index 9b82efb..b43e141 100644
--- a/pvr.mythtv/resources/language/resource.language.zh_cn/strings.po
+++ b/pvr.mythtv/resources/language/resource.language.zh_cn/strings.po
@@ -272,10 +272,6 @@ msgctxt "#30411"
 msgid "Delete and re-record"
 msgstr "删除重新录像"
 
-msgctxt "#30412"
-msgid "Keep LiveTV recording"
-msgstr "保留直播电视录像"
-
 msgctxt "#30421"
 msgid "Show/hide inactive upcomings"
 msgstr "显示/隐藏非活动的即将播出"
diff --git a/src/avinfo.cpp b/src/avinfo.cpp
index 2e30e7c..9bc8cf6 100644
--- a/src/avinfo.cpp
+++ b/src/avinfo.cpp
@@ -20,7 +20,7 @@
  *
  */
 
-#include <kodi/xbmc_codec_types.h>
+#include <xbmc_codec_types.h>
 
 #include "avinfo.h"
 #include "demuxer/debug.h"
diff --git a/src/categories.cpp b/src/categories.cpp
index 1a10f9c..03d1867 100644
--- a/src/categories.cpp
+++ b/src/categories.cpp
@@ -22,7 +22,7 @@
 
 #include "categories.h"
 #include "client.h"
-#include <platform/os.h>
+#include <p8-platform/os.h>
 
 #define CATEGORIES_FILENAME       "eit_categories.txt"
 #define CATEGORIES_MAXLINESIZE    255
diff --git a/src/client.cpp b/src/client.cpp
index 0448c22..4dd5762 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -24,7 +24,7 @@
 #include "pvrclient-mythtv.h"
 #include "guidialogyesno.h"
 
-#include <kodi/xbmc_pvr_dll.h>
+#include <xbmc_pvr_dll.h>
 
 using namespace ADDON;
 
@@ -389,7 +389,7 @@ ADDON_STATUS ADDON_Create(void *hdl, void *props)
 
   memset(&menuHook, 0, sizeof(PVR_MENUHOOK));
   menuHook.category = PVR_MENUHOOK_RECORDING;
-  menuHook.iHookId = MENUHOOK_KEEP_LIVETV_RECORDING;
+  menuHook.iHookId = MENUHOOK_KEEP_RECORDING;
   menuHook.iLocalizedStringId = 30412;
   PVR->AddMenuHook(&menuHook);
 
@@ -441,29 +441,6 @@ void ADDON_Destroy()
 
 void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data)
 {
-  (void)data;
-  XBMC->Log(LOG_INFO, "Received announcement: %s, %s, %s", flag, sender, message);
-
-  if (g_client == NULL)
-    return;
-
-  if (strcmp("xbmc", sender) == 0)
-  {
-    if (strcmp("System", flag) == 0)
-    {
-      if (strcmp("OnSleep", message) == 0)
-        g_client->OnSleep();
-      else if (strcmp("OnWake", message) == 0)
-        g_client->OnWake();
-    }
-    else if (strcmp("GUI", flag) == 0)
-    {
-      if (strcmp("OnScreensaverDeactivated", message) == 0)
-        g_client->OnActivatedGUI();
-      else if (strcmp("OnScreensaverActivated", message) == 0)
-        g_client->OnDeactivatedGUI();
-    }
-  }
 }
 
 ADDON_STATUS ADDON_GetStatus()
@@ -787,6 +764,34 @@ PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &it
   return g_client->CallMenuHook(menuhook, item);
 }
 
+void OnSystemSleep()
+{
+  XBMC->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
+  if (g_client)
+    g_client->OnSleep();
+}
+
+void OnSystemWake()
+{
+  XBMC->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
+  if (g_client)
+    g_client->OnWake();
+}
+
+void OnPowerSavingActivated()
+{
+  XBMC->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
+  if (g_client)
+    g_client->OnDeactivatedGUI();
+}
+
+void OnPowerSavingDeactivated()
+{
+  XBMC->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
+  if (g_client)
+    g_client->OnActivatedGUI();
+}
+
 /*
  * PVR EPG Functions
  */
@@ -1046,14 +1051,6 @@ int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize)
   return dataread;
 }
 
-int GetCurrentClientChannel()
-{
-  if (g_client == NULL)
-    return -1;
-
-  return g_client->GetCurrentClientChannel();
-}
-
 bool SwitchChannel(const PVR_CHANNEL &channel)
 {
   if (g_client == NULL)
@@ -1109,6 +1106,13 @@ long long LengthLiveStream(void)
   return g_client->LengthLiveStream();
 }
 
+bool IsRealTimeStream(void)
+{
+  if (g_client == NULL)
+    return false;
+
+  return g_client->IsRealTimeStream();
+}
 
 /*
  * PVR Recording Stream Functions
@@ -1228,6 +1232,8 @@ time_t GetBufferTimeEnd()
   return 0;
 }
 
+bool IsTimeshifting(void) { return true; }
+
 /*
  * Unused API Functions
  */
@@ -1235,6 +1241,6 @@ time_t GetBufferTimeEnd()
 void DemuxReset() {}
 const char * GetLiveStreamURL(const PVR_CHANNEL &) { return ""; }
 void SetSpeed(int) {};
-bool IsTimeshifting(void) { return true; }
+PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; }
 
 } //end extern "C"
diff --git a/src/client.h b/src/client.h
index b5ba40a..247f019 100644
--- a/src/client.h
+++ b/src/client.h
@@ -25,10 +25,10 @@
 #define CLIENT_H
 
 #include <string>
-#include <kodi/libXBMC_addon.h>
-#include <kodi/libXBMC_pvr.h>
-#include <kodi/libKODI_guilib.h>
-#include <kodi/libXBMC_codec.h>
+#include <libXBMC_addon.h>
+#include <libXBMC_pvr.h>
+#include <libKODI_guilib.h>
+#include <libXBMC_codec.h>
 
 #define LIVETV_CONFLICT_STRATEGY_HASLATER   0
 #define LIVETV_CONFLICT_STRATEGY_STOPTV     1
@@ -47,7 +47,7 @@
 #define DEFAULT_RECORD_TEMPLATE             1
 
 #define MENUHOOK_REC_DELETE_AND_RERECORD    1
-#define MENUHOOK_KEEP_LIVETV_RECORDING      2
+#define MENUHOOK_KEEP_RECORDING             2
 #define MENUHOOK_TIMER_BACKEND_INFO         3
 #define MENUHOOK_SHOW_HIDE_NOT_RECORDING    4
 #define MENUHOOK_REFRESH_CHANNEL_ICONS      5
diff --git a/src/cppmyth/MythScheduleHelper75.cpp b/src/cppmyth/MythScheduleHelper75.cpp
index 58f0a87..f77ce41 100644
--- a/src/cppmyth/MythScheduleHelper75.cpp
+++ b/src/cppmyth/MythScheduleHelper75.cpp
@@ -34,7 +34,7 @@ using namespace ADDON;
 
 MythTimerTypeList MythScheduleHelper75::GetTimerTypes() const
 {
-  PLATFORM::CLockObject lock(m_lock);
+  P8PLATFORM::CLockObject lock(m_lock);
   if (!m_timerTypeListInit)
   {
     m_timerTypeListInit = true;
@@ -402,7 +402,8 @@ bool MythScheduleHelper75::FillTimerEntryWithRule(MythTimerEntry& entry, const M
   // that which is applied in function 'NewFromTimer'
 
   MythRecordingRule rule = node.GetRule();
-  XBMC->Log(LOG_DEBUG, "75::%s: Rule %u", __FUNCTION__, rule.RecordID());
+  if (g_bExtraDebug)
+    XBMC->Log(LOG_DEBUG, "75::%s: Rule %u", __FUNCTION__, rule.RecordID());
 
   switch (rule.Type())
   {
@@ -587,7 +588,8 @@ bool MythScheduleHelper75::FillTimerEntryWithUpcoming(MythTimerEntry& entry, con
     case Myth::RS_PREVIOUS_RECORDING: //Previoulsy recorded but no longer in the library
       if (!m_manager->ShowNotRecording())
       {
-        XBMC->Log(LOG_DEBUG, "75::%s: Skipping %s:%s on %s because status %d", __FUNCTION__,
+        if (g_bExtraDebug)
+          XBMC->Log(LOG_DEBUG, "75::%s: Skipping %s:%s on %s because status %d", __FUNCTION__,
                   recording.Title().c_str(), recording.Subtitle().c_str(), recording.ChannelName().c_str(),
                   recording.Status());
         return false;
diff --git a/src/cppmyth/MythScheduleHelper76.cpp b/src/cppmyth/MythScheduleHelper76.cpp
index 9e28038..87e1f42 100644
--- a/src/cppmyth/MythScheduleHelper76.cpp
+++ b/src/cppmyth/MythScheduleHelper76.cpp
@@ -55,7 +55,8 @@ bool MythScheduleHelper76::FillTimerEntryWithRule(MythTimerEntry& entry, const M
   // that which is applied in function 'NewFromTimer'
 
   MythRecordingRule rule = node.GetRule();
-  XBMC->Log(LOG_DEBUG, "76::%s: RecordID %u", __FUNCTION__, rule.RecordID());
+  if (g_bExtraDebug)
+    XBMC->Log(LOG_DEBUG, "76::%s: RecordID %u", __FUNCTION__, rule.RecordID());
 
   switch (rule.Type())
   {
diff --git a/src/cppmyth/MythScheduleHelper85.cpp b/src/cppmyth/MythScheduleHelper85.cpp
index fe47e06..9b5774a 100644
--- a/src/cppmyth/MythScheduleHelper85.cpp
+++ b/src/cppmyth/MythScheduleHelper85.cpp
@@ -44,7 +44,8 @@ bool MythScheduleHelper85::FillTimerEntryWithUpcoming(MythTimerEntry& entry, con
     case Myth::RS_PREVIOUS_RECORDING: //Previoulsy recorded but no longer in the library
       if (!m_manager->ShowNotRecording())
       {
-        XBMC->Log(LOG_DEBUG, "85::%s: Skipping %s:%s on %s because status %d", __FUNCTION__,
+        if (g_bExtraDebug)
+          XBMC->Log(LOG_DEBUG, "85::%s: Skipping %s:%s on %s because status %d", __FUNCTION__,
                   recording.Title().c_str(), recording.Subtitle().c_str(), recording.ChannelName().c_str(),
                   recording.Status());
         return false;
diff --git a/src/cppmyth/MythScheduleHelperNoHelper.cpp b/src/cppmyth/MythScheduleHelperNoHelper.cpp
index 26358fc..751b895 100644
--- a/src/cppmyth/MythScheduleHelperNoHelper.cpp
+++ b/src/cppmyth/MythScheduleHelperNoHelper.cpp
@@ -40,7 +40,7 @@ MythScheduleHelperNoHelper::MythScheduleHelperNoHelper()
 
 MythTimerTypeList MythScheduleHelperNoHelper::GetTimerTypes() const
 {
-  PLATFORM::CLockObject lock(m_lock);
+  P8PLATFORM::CLockObject lock(m_lock);
   return m_timerTypeList;
 }
 
@@ -103,7 +103,7 @@ static inline uint32_t expiration_key(const MythScheduleHelperNoHelper::RuleExpi
 
 int MythScheduleHelperNoHelper::GetRuleExpirationId(const RuleExpiration& expiration) const
 {
-  PLATFORM::CLockObject lock(m_lock);
+  P8PLATFORM::CLockObject lock(m_lock);
   if (!m_expirationByKeyInit)
   {
     m_expirationByKeyInit = true;
@@ -119,7 +119,7 @@ int MythScheduleHelperNoHelper::GetRuleExpirationId(const RuleExpiration& expira
 
 MythScheduleHelperNoHelper::RuleExpiration MythScheduleHelperNoHelper::GetRuleExpiration(int id) const
 {
-  PLATFORM::CLockObject lock(m_lock);
+  P8PLATFORM::CLockObject lock(m_lock);
   static RuleExpiration _empty(false, 0, false);
   RuleExpirationMap::const_iterator it = GetRuleExpirationMap().find(id);
   if (it != m_expirationMap.end())
@@ -129,7 +129,7 @@ MythScheduleHelperNoHelper::RuleExpiration MythScheduleHelperNoHelper::GetRuleEx
 
 int MythScheduleHelperNoHelper::GetRuleRecordingGroupId(const std::string& name) const
 {
-  PLATFORM::CLockObject lock(m_lock);
+  P8PLATFORM::CLockObject lock(m_lock);
   if (!m_recGroupByNameInit)
   {
     m_recGroupByNameInit = true;
@@ -145,7 +145,7 @@ int MythScheduleHelperNoHelper::GetRuleRecordingGroupId(const std::string& name)
 
 std::string MythScheduleHelperNoHelper::GetRuleRecordingGroupName(int id) const
 {
-  PLATFORM::CLockObject lock(m_lock);
+  P8PLATFORM::CLockObject lock(m_lock);
   static std::string _empty = "";
   if (!m_recGroupByIdInit)
   {
diff --git a/src/cppmyth/MythScheduleHelperNoHelper.h b/src/cppmyth/MythScheduleHelperNoHelper.h
index 686c770..e3ec012 100644
--- a/src/cppmyth/MythScheduleHelperNoHelper.h
+++ b/src/cppmyth/MythScheduleHelperNoHelper.h
@@ -73,7 +73,7 @@ protected:
   virtual const MythTimerType::AttributeList& GetRuleExpirationNameList() const;
   virtual const MythTimerType::AttributeList& GetRuleRecordingGroupList() const;
 
-  mutable PLATFORM::CMutex m_lock;
+  mutable P8PLATFORM::CMutex m_lock;
 
   mutable bool                            m_timerTypeListInit;
   mutable MythTimerTypeList               m_timerTypeList;
diff --git a/src/cppmyth/MythScheduleManager.cpp b/src/cppmyth/MythScheduleManager.cpp
index 3381496..7466ac6 100644
--- a/src/cppmyth/MythScheduleManager.cpp
+++ b/src/cppmyth/MythScheduleManager.cpp
@@ -32,7 +32,7 @@
 #include <math.h>
 
 using namespace ADDON;
-using namespace PLATFORM;
+using namespace P8PLATFORM;
 
 enum
 {
diff --git a/src/cppmyth/MythScheduleManager.h b/src/cppmyth/MythScheduleManager.h
index 00b0b6b..ff69f13 100644
--- a/src/cppmyth/MythScheduleManager.h
+++ b/src/cppmyth/MythScheduleManager.h
@@ -25,8 +25,8 @@
 #include "MythEPGInfo.h"
 #include "MythChannel.h"
 
-#include <kodi/xbmc_pvr_types.h>
-#include <platform/threads/mutex.h>
+#include <xbmc_pvr_types.h>
+#include <p8-platform/threads/mutex.h>
 
 #include <vector>
 #include <list>
@@ -209,7 +209,7 @@ public:
   static uint32_t MakeIndex(const MythRecordingRule& rule);
 
 private:
-  mutable PLATFORM::CMutex m_lock;
+  mutable P8PLATFORM::CMutex m_lock;
   Myth::Control *m_control;
 
   int m_protoVersion;
diff --git a/src/demux.cpp b/src/demux.cpp
index 452f786..3cb44a1 100644
--- a/src/demux.cpp
+++ b/src/demux.cpp
@@ -1,6 +1,6 @@
 /*
- *      Copyright (C) 2005-2013 Team XBMC
- *      http://www.xbmc.org
+ *      Copyright (C) 2013-2016 Team Kodi
+ *      http://www.kodi.tv
  *
  *  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
@@ -20,9 +20,9 @@
  *
  */
 
-#include <platform/os.h>
-#include <kodi/libXBMC_pvr.h>
-#include <kodi/xbmc_codec_types.h>
+#include <p8-platform/os.h>
+#include <libXBMC_pvr.h>
+#include <xbmc_codec_types.h>
 
 #include "demux.h"
 #include "demuxer/debug.h"
@@ -34,7 +34,7 @@
 #define READAV_TIMEOUT          10000                     // 10 secs
 
 using namespace ADDON;
-using namespace PLATFORM;
+using namespace P8PLATFORM;
 
 void DemuxLog(int level, char *msg)
 {
@@ -82,6 +82,7 @@ Demux::Demux(Myth::Stream *file)
   , m_endTime(0)
   , m_isChangePlaced(false)
 {
+  memset(&m_streams, 0, sizeof(PVR_STREAM_PROPERTIES));
   m_av_buf = (unsigned char*)malloc(sizeof(*m_av_buf) * (m_av_buf_size + 1));
   if (m_av_buf)
   {
@@ -245,7 +246,11 @@ bool Demux::GetStreamProperties(PVR_STREAM_PROPERTIES* props)
 
   CLockObject lock(m_mutex);
   m_isChangePlaced = false;
-  return m_streams.GetProperties(props);
+  for (unsigned i = 0; i < m_streams.iStreamCount; i++)
+    memcpy(&props->stream[i], &m_streams.stream[i], sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM));
+
+  props->iStreamCount = m_streams.iStreamCount;
+  return true;
 }
 
 void Demux::Flush(void)
@@ -260,6 +265,7 @@ void Demux::Abort()
 {
   StopThread(0);
   Flush();
+  m_streams.iStreamCount = 0;
 }
 
 DemuxPacket* Demux::Read()
@@ -413,14 +419,16 @@ void Demux::populate_pvr_streams()
 
   uint16_t mainPid = 0xffff;
   int mainType = XBMC_CODEC_TYPE_UNKNOWN;
-  std::vector<XbmcPvrStream> new_streams;
   const std::vector<TSDemux::ElementaryStream*> es_streams = m_AVContext->GetStreams();
+  int count = 0;
   for (std::vector<TSDemux::ElementaryStream*>::const_iterator it = es_streams.begin(); it != es_streams.end(); it++)
   {
     const char* codec_name = (*it)->GetStreamCodecName();
     xbmc_codec_t codec = CODEC->GetCodecByName(codec_name);
     if (codec.codec_type != XBMC_CODEC_TYPE_UNKNOWN)
     {
+      memset(&m_streams.stream[count], 0, sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM));
+
       // Find the main stream:
       // The best candidate would be the first video. Else the first audio
       switch (mainType)
@@ -435,25 +443,23 @@ void Demux::populate_pvr_streams()
         mainType = codec.codec_type;
       }
 
-      XbmcPvrStream new_stream;
-      m_streams.GetStreamData((*it)->pid, &new_stream);
-
-      new_stream.iCodecId       = codec.codec_id;
-      new_stream.iCodecType     = codec.codec_type;
-      recode_language((*it)->stream_info.language, new_stream.strLanguage);
-      new_stream.iIdentifier    = stream_identifier((*it)->stream_info.composition_id, (*it)->stream_info.ancillary_id);
-      new_stream.iFPSScale      = (*it)->stream_info.fps_scale;
-      new_stream.iFPSRate       = (*it)->stream_info.fps_rate;
-      new_stream.iHeight        = (*it)->stream_info.height;
-      new_stream.iWidth         = (*it)->stream_info.width;
-      new_stream.fAspect        = (*it)->stream_info.aspect;
-      new_stream.iChannels      = (*it)->stream_info.channels;
-      new_stream.iSampleRate    = (*it)->stream_info.sample_rate;
-      new_stream.iBlockAlign    = (*it)->stream_info.block_align;
-      new_stream.iBitRate       = (*it)->stream_info.bit_rate;
-      new_stream.iBitsPerSample = (*it)->stream_info.bits_per_sample;
-
-      new_streams.push_back(new_stream);
+      m_streams.stream[count].iPID           = (*it)->pid;
+      m_streams.stream[count].iCodecId       = codec.codec_id;
+      m_streams.stream[count].iCodecType     = codec.codec_type;
+      recode_language((*it)->stream_info.language, m_streams.stream[count].strLanguage);
+      m_streams.stream[count].iSubtitleInfo  = stream_identifier((*it)->stream_info.composition_id, (*it)->stream_info.ancillary_id);
+      m_streams.stream[count].iFPSScale      = (*it)->stream_info.fps_scale;
+      m_streams.stream[count].iFPSRate       = (*it)->stream_info.fps_rate;
+      m_streams.stream[count].iHeight        = (*it)->stream_info.height;
+      m_streams.stream[count].iWidth         = (*it)->stream_info.width;
+      m_streams.stream[count].fAspect        = (*it)->stream_info.aspect;
+      m_streams.stream[count].iChannels      = (*it)->stream_info.channels;
+      m_streams.stream[count].iSampleRate    = (*it)->stream_info.sample_rate;
+      m_streams.stream[count].iBlockAlign    = (*it)->stream_info.block_align;
+      m_streams.stream[count].iBitRate       = (*it)->stream_info.bit_rate;
+      m_streams.stream[count].iBitsPerSample = (*it)->stream_info.bits_per_sample;
+
+      count++;
       m_AVContext->StartStreaming((*it)->pid);
 
       // Add stream to no setup set
@@ -464,7 +470,7 @@ void Demux::populate_pvr_streams()
         XBMC->Log(LOG_DEBUG, LOGTAG "%s: register PES %.4x %s", __FUNCTION__, (*it)->pid, codec_name);
     }
   }
-  m_streams.UpdateStreams(new_streams);
+  m_streams.iStreamCount = count;
   // Renew main stream
   m_mainStreamPID = mainPid;
 }
@@ -482,36 +488,39 @@ bool Demux::update_pvr_stream(uint16_t pid)
 
   CLockObject Lock(m_mutex);
 
-  XbmcPvrStream* stream = m_streams.GetStreamById(es->pid);
-  if (stream)
+  // find stream index for pid
+  for (unsigned i = 0; i < m_streams.iStreamCount; i++)
   {
-    stream->iCodecId       = codec.codec_id;
-    stream->iCodecType     = codec.codec_type;
-    recode_language(es->stream_info.language, stream->strLanguage);
-    stream->iIdentifier    = stream_identifier(es->stream_info.composition_id, es->stream_info.ancillary_id);
-    stream->iFPSScale      = es->stream_info.fps_scale;
-    stream->iFPSRate       = es->stream_info.fps_rate;
-    stream->iHeight        = es->stream_info.height;
-    stream->iWidth         = es->stream_info.width;
-    stream->fAspect        = es->stream_info.aspect;
-    stream->iChannels      = es->stream_info.channels;
-    stream->iSampleRate    = es->stream_info.sample_rate;
-    stream->iBlockAlign    = es->stream_info.block_align;
-    stream->iBitRate       = es->stream_info.bit_rate;
-    stream->iBitsPerSample = es->stream_info.bits_per_sample;
-
-    if (es->has_stream_info)
+    if (m_streams.stream[i].iPID == es->pid)
     {
-      // Now stream is setup. Remove it from no setup set
-      std::set<uint16_t>::iterator it = m_nosetup.find(es->pid);
-      if (it != m_nosetup.end())
+      m_streams.stream[i].iCodecId       = codec.codec_id;
+      m_streams.stream[i].iCodecType     = codec.codec_type;
+      recode_language(es->stream_info.language, m_streams.stream[i].strLanguage);
+      m_streams.stream[i].iSubtitleInfo  = stream_identifier(es->stream_info.composition_id, es->stream_info.ancillary_id);
+      m_streams.stream[i].iFPSScale      = es->stream_info.fps_scale;
+      m_streams.stream[i].iFPSRate       = es->stream_info.fps_rate;
+      m_streams.stream[i].iHeight        = es->stream_info.height;
+      m_streams.stream[i].iWidth         = es->stream_info.width;
+      m_streams.stream[i].fAspect        = es->stream_info.aspect;
+      m_streams.stream[i].iChannels      = es->stream_info.channels;
+      m_streams.stream[i].iSampleRate    = es->stream_info.sample_rate;
+      m_streams.stream[i].iBlockAlign    = es->stream_info.block_align;
+      m_streams.stream[i].iBitRate       = es->stream_info.bit_rate;
+      m_streams.stream[i].iBitsPerSample = es->stream_info.bits_per_sample;
+
+      if (es->has_stream_info)
       {
-        m_nosetup.erase(it);
-        if (m_nosetup.empty())
-          XBMC->Log(LOG_DEBUG, LOGTAG "%s: setup is completed", __FUNCTION__);
+        // Now stream is setup. Remove it from no setup set
+        std::set<uint16_t>::iterator it = m_nosetup.find(es->pid);
+        if (it != m_nosetup.end())
+        {
+          m_nosetup.erase(it);
+          if (m_nosetup.empty())
+            XBMC->Log(LOG_DEBUG, LOGTAG "%s: setup is completed", __FUNCTION__);
+        }
       }
+      return true;
     }
-    return true;
   }
   return false;
 }
@@ -547,6 +556,7 @@ DemuxPacket* Demux::stream_pvr_data(TSDemux::STREAM_PKT* pkt)
     if (pkt->size > 0 && pkt->data)
       memcpy(dxp->pData, pkt->data, pkt->size);
 
+    dxp->iStreamId = (int)(pkt->pid);
     dxp->iSize = pkt->size;
     dxp->duration = (double)pkt->duration * DVD_TIME_BASE / PTS_TIME_BASE;
     if (pkt->dts != PTS_UNSET)
@@ -557,8 +567,6 @@ DemuxPacket* Demux::stream_pvr_data(TSDemux::STREAM_PKT* pkt)
       dxp->pts = (double)pkt->pts * DVD_TIME_BASE / PTS_TIME_BASE;
     else
       dxp->pts = DVD_NOPTS_VALUE;
-
-    dxp->iStreamId = m_streams.GetStreamId((unsigned int)pkt->pid);
   }
   return dxp;
 }
diff --git a/src/demux.h b/src/demux.h
index f86e27a..6bea8aa 100644
--- a/src/demux.h
+++ b/src/demux.h
@@ -1,7 +1,7 @@
 #pragma once
 /*
- *      Copyright (C) 2005-2013 Team XBMC
- *      http://www.xbmc.org
+ *      Copyright (C) 2013-2016 Team Kodi
+ *      http://www.kodi.tv
  *
  *  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
@@ -25,17 +25,16 @@
 #include "client.h"
 
 #include <mythstream.h>
-#include <platform/threads/threads.h>
-#include <platform/threads/mutex.h>
-#include <platform/util/buffer.h>
-#include <kodi/xbmc_stream_utils.hpp>
+#include <p8-platform/threads/threads.h>
+#include <p8-platform/threads/mutex.h>
+#include <p8-platform/util/buffer.h>
 
 #include <map>
 #include <set>
 
 #define AV_BUFFER_SIZE          131072
 
-class Demux : public TSDemux::TSDemuxer, PLATFORM::CThread
+class Demux : public TSDemux::TSDemuxer, P8PLATFORM::CThread
 {
 public:
   Demux(Myth::Stream *file);
@@ -56,9 +55,9 @@ public:
 private:
   Myth::Stream *m_file;
   uint16_t m_channel;
-  PLATFORM::SyncedBuffer<DemuxPacket*> m_demuxPacketBuffer;
-  PLATFORM::CMutex m_mutex;
-  ADDON::XbmcStreamProperties m_streams;
+  P8PLATFORM::SyncedBuffer<DemuxPacket*> m_demuxPacketBuffer;
+  P8PLATFORM::CMutex m_mutex;
+  PVR_STREAM_PROPERTIES m_streams;
 
   bool get_stream_data(TSDemux::STREAM_PKT* pkt);
   void reset_posmap();
diff --git a/src/demuxer/tsDemuxer.cpp b/src/demuxer/tsDemuxer.cpp
index 00e40c1..fc283a8 100644
--- a/src/demuxer/tsDemuxer.cpp
+++ b/src/demuxer/tsDemuxer.cpp
@@ -56,7 +56,7 @@ AVContext::AVContext(TSDemuxer* const demux, uint64_t pos, uint16_t channel)
 
 void AVContext::Reset(void)
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   pid = 0xffff;
   transport_error = false;
@@ -75,7 +75,7 @@ uint16_t AVContext::GetPID() const
 
 PACKET_TYPE AVContext::GetPIDType() const
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   if (packet)
     return packet->packet_type;
@@ -84,7 +84,7 @@ PACKET_TYPE AVContext::GetPIDType() const
 
 uint16_t AVContext::GetPIDChannel() const
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   if (packet)
     return packet->channel;
@@ -93,7 +93,7 @@ uint16_t AVContext::GetPIDChannel() const
 
 bool AVContext::HasPIDStreamData() const
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   // PES packets append frame buffer of elementary stream until next start of unit
   // On new unit start, flag is held
@@ -109,7 +109,7 @@ bool AVContext::HasPIDPayload() const
 
 ElementaryStream* AVContext::GetPIDStream()
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   if (packet && packet->packet_type == PACKET_TYPE_PES)
     return packet->stream;
@@ -118,7 +118,7 @@ ElementaryStream* AVContext::GetPIDStream()
 
 std::vector<ElementaryStream*> AVContext::GetStreams()
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   std::vector<ElementaryStream*> v;
   for (std::map<uint16_t, Packet>::iterator it = packets.begin(); it != packets.end(); ++it)
@@ -129,7 +129,7 @@ std::vector<ElementaryStream*> AVContext::GetStreams()
 
 void AVContext::StartStreaming(uint16_t pid)
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   std::map<uint16_t, Packet>::iterator it = packets.find(pid);
   if (it != packets.end())
@@ -138,7 +138,7 @@ void AVContext::StartStreaming(uint16_t pid)
 
 void AVContext::StopStreaming(uint16_t pid)
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   std::map<uint16_t, Packet>::iterator it = packets.find(pid);
   if (it != packets.end())
@@ -147,7 +147,7 @@ void AVContext::StopStreaming(uint16_t pid)
 
 ElementaryStream* AVContext::GetStream(uint16_t pid) const
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   std::map<uint16_t, Packet>::const_iterator it = packets.find(pid);
   if (it != packets.end())
@@ -157,7 +157,7 @@ ElementaryStream* AVContext::GetStream(uint16_t pid) const
 
 uint16_t AVContext::GetChannel(uint16_t pid) const
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   std::map<uint16_t, Packet>::const_iterator it = packets.find(pid);
   if (it != packets.end())
@@ -167,7 +167,7 @@ uint16_t AVContext::GetChannel(uint16_t pid) const
 
 void AVContext::ResetPackets()
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   for (std::map<uint16_t, Packet>::iterator it = packets.begin(); it != packets.end(); ++it)
   {
@@ -391,7 +391,7 @@ uint64_t AVContext::GetPosition() const
  */
 int AVContext::ProcessTSPacket()
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   int ret = AVCONTEXT_CONTINUE;
   std::map<uint16_t, Packet>::iterator it;
@@ -516,7 +516,7 @@ int AVContext::ProcessTSPacket()
  */
 int AVContext::ProcessTSPayload()
 {
-  PLATFORM::CLockObject lock(mutex);
+  P8PLATFORM::CLockObject lock(mutex);
 
   if (!this->packet)
     return AVCONTEXT_CONTINUE;
diff --git a/src/demuxer/tsDemuxer.h b/src/demuxer/tsDemuxer.h
index 2efbb58..ebb779e 100644
--- a/src/demuxer/tsDemuxer.h
+++ b/src/demuxer/tsDemuxer.h
@@ -24,7 +24,7 @@
 
 #include "tsPacket.h"
 #include "elementaryStream.h"
-#include <platform/threads/mutex.h>
+#include <p8-platform/threads/mutex.h>
 
 #include <map>
 #include <vector>
@@ -102,7 +102,7 @@ namespace TSDemux
     int parse_ts_pes();
 
     // Critical section
-    mutable PLATFORM::CMutex mutex;
+    mutable P8PLATFORM::CMutex mutex;
 
     // AV stream owner
     TSDemuxer* m_demux;
diff --git a/src/fileOps.cpp b/src/fileOps.cpp
index 80d6462..71a71f9 100644
--- a/src/fileOps.cpp
+++ b/src/fileOps.cpp
@@ -34,7 +34,7 @@
 #define FILEOPS_RECORDING_DUMMY_ICON  "recording.png"
 
 using namespace ADDON;
-using namespace PLATFORM;
+using namespace P8PLATFORM;
 
 FileOps::FileOps(FileConsumer *consumer, const std::string& server, unsigned wsapiport, const std::string& wsapiSecurityPin)
 : CThread()
diff --git a/src/fileOps.h b/src/fileOps.h
index 58081f4..90c023b 100644
--- a/src/fileOps.h
+++ b/src/fileOps.h
@@ -25,7 +25,7 @@
 #include "cppmyth/MythProgramInfo.h"
 
 #include <mythwsapi.h>
-#include <platform/threads/threads.h>
+#include <p8-platform/threads/threads.h>
 
 #include <string>
 #include <vector>
@@ -39,7 +39,7 @@ public:
   virtual void HandleCleanedCache() = 0;
 };
 
-class FileOps : public PLATFORM::CThread
+class FileOps : public P8PLATFORM::CThread
 {
 public:
   enum FileType
@@ -152,7 +152,7 @@ protected:
     int             m_errorCount;
   };
 
-  PLATFORM::CMutex m_lock;
-  PLATFORM::CEvent m_queueContent;
+  P8PLATFORM::CMutex m_lock;
+  P8PLATFORM::CEvent m_queueContent;
   std::list<FileOps::JobItem> m_jobQueue;
 };
diff --git a/src/filestreaming.cpp b/src/filestreaming.cpp
index d25680e..eeaa672 100644
--- a/src/filestreaming.cpp
+++ b/src/filestreaming.cpp
@@ -22,7 +22,7 @@
 
 #include "filestreaming.h"
 #include "client.h"
-#include <platform/os.h>
+#include <p8-platform/os.h>
 
 #define MAX_READ_SIZE  131072
 
diff --git a/src/pvrclient-mythtv.cpp b/src/pvrclient-mythtv.cpp
index 5901d55..b98f6d7 100644
--- a/src/pvrclient-mythtv.cpp
+++ b/src/pvrclient-mythtv.cpp
@@ -31,7 +31,7 @@
 #include <cassert>
 
 using namespace ADDON;
-using namespace PLATFORM;
+using namespace P8PLATFORM;
 
 PVRClientMythTV::PVRClientMythTV()
 : m_connectionError(CONN_ERROR_NO_ERROR)
@@ -438,6 +438,8 @@ void PVRClientMythTV::HandleRecordingListChange(const Myth::EventMessage& msg)
       prog.ResetProps();
       // Keep props
       prog.CopyProps(it->second);
+      // Keep original air date
+      prog.GetPtr()->airdate = it->second.Airdate();
       // Update recording
       it->second = prog;
       ++m_recordingChangePinCount;
@@ -758,7 +760,8 @@ int PVRClientMythTV::FillChannelsAndChannelGroups()
       mapuid_t::iterator itm = channelIdentifiers.find(channelIdentifier);
       if (itm != channelIdentifiers.end())
       {
-        XBMC->Log(LOG_DEBUG, "%s: skipping channel: %d", __FUNCTION__, chanid);
+        if (g_bExtraDebug)
+          XBMC->Log(LOG_DEBUG, "%s: skipping channel: %d", __FUNCTION__, chanid);
         // Link channel to PVR item
         m_PVRChannelUidById.insert(std::make_pair(chanid, itm->second.iUniqueId));
         // Add found PVR item to the grouping set
@@ -797,7 +800,7 @@ int PVRClientMythTV::FindPVRChannelUid(uint32_t channelId) const
   PVRChannelMap::const_iterator it = m_PVRChannelUidById.find(channelId);
   if (it != m_PVRChannelUidById.end())
     return it->second;
-  return -1; // PVR dummy channel UID
+  return PVR_CHANNEL_INVALID_UID;
 }
 
 int PVRClientMythTV::GetRecordingsAmount()
@@ -828,9 +831,6 @@ PVR_ERROR PVRClientMythTV::GetRecordings(ADDON_HANDLE handle)
 
   CLockObject lock(m_recordingsLock);
 
-  // Load recordings list
-  if (m_recordings.empty())
-    FillRecordings();
   // Setup series
   if (g_iGroupRecordings == GROUP_RECORDINGS_ONLY_FOR_SERIES)
   {
@@ -887,6 +887,10 @@ PVR_ERROR PVRClientMythTV::GetRecordings(ADDON_HANDLE handle)
       }
       PVR_STRCPY(tag.strPlot, it->second.Description().c_str());
       PVR_STRCPY(tag.strChannelName, it->second.ChannelName().c_str());
+      tag.iChannelUid = FindPVRChannelUid(it->second.ChannelID());
+
+      /* TODO: PVR API 5.1.0: Implement this */
+      tag.channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN;
 
       int genre = m_categories.Category(it->second.Category());
       tag.iGenreSubType = genre&0x0F;
@@ -969,9 +973,6 @@ PVR_ERROR PVRClientMythTV::GetDeletedRecordings(ADDON_HANDLE handle)
 
   CLockObject lock(m_recordingsLock);
 
-  // Load recordings list
-  if (m_recordings.empty())
-    FillRecordings();
   // Transfer to PVR
   for (ProgramInfoMap::iterator it = m_recordings.begin(); it != m_recordings.end(); ++it)
   {
@@ -1039,6 +1040,12 @@ PVR_ERROR PVRClientMythTV::GetDeletedRecordings(ADDON_HANDLE handle)
       PVR_STRCPY(tag.strPlotOutline, "");
       PVR_STRCPY(tag.strStreamURL, "");
 
+      /* TODO: PVR API 5.0.0: Implement this */
+      tag.iChannelUid = PVR_CHANNEL_INVALID_UID;
+
+      /* TODO: PVR API 5.1.0: Implement this */
+      tag.channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN;
+
       PVR->TransferRecordingEntry(handle, &tag);
     }
   }
@@ -1660,12 +1667,14 @@ PVR_ERROR PVRClientMythTV::AddTimer(const PVR_TIMER &timer)
   XBMC->Log(LOG_DEBUG, "%s: title: %s, start: %ld, end: %ld, chanID: %u", __FUNCTION__, timer.strTitle, timer.startTime, timer.endTime, timer.iClientChannelUid);
   CLockObject lock(m_lock);
   // Check if our timer is a quick recording of live tv
-  // Assumptions: Timer start time = 0, and our live recorder is locked on the same channel.
+  // Assumptions: Our live recorder is locked on the same channel and the recording starts
+  // at the same time as or before (includes 0) the currently in progress program
   // If true then keep recording, setup recorder and let the backend handle the rule.
-  if (timer.startTime == 0 && m_liveStream && m_liveStream->IsPlaying())
+  if (m_liveStream && m_liveStream->IsPlaying())
   {
     Myth::ProgramPtr program = m_liveStream->GetPlayedProgram();
-    if (timer.iClientChannelUid == FindPVRChannelUid(program->channel.chanId))
+    if (timer.iClientChannelUid == FindPVRChannelUid(program->channel.chanId) &&
+        timer.startTime <= program->startTime)
     {
       XBMC->Log(LOG_DEBUG, "%s: Timer is a quick recording. Toggling Record on", __FUNCTION__);
       if (m_liveStream->IsLiveRecording())
@@ -2061,21 +2070,6 @@ int PVRClientMythTV::ReadLiveStream(unsigned char *pBuffer, unsigned int iBuffer
   return -1;
 }
 
-int PVRClientMythTV::GetCurrentClientChannel()
-{
-  if (g_bExtraDebug)
-    XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__);
-
-  // Begin critical section
-  CLockObject lock(m_lock);
-  // Have live stream
-  if (!m_liveStream)
-    return -1;
-
-  Myth::ProgramPtr program = m_liveStream->GetPlayedProgram();
-  return (int)program->channel.chanId;
-}
-
 bool PVRClientMythTV::SwitchChannel(const PVR_CHANNEL &channel)
 {
   if (g_bExtraDebug)
@@ -2168,9 +2162,6 @@ PVR_ERROR PVRClientMythTV::SignalStatus(PVR_SIGNAL_STATUS &signalStatus)
       PVR_STRCPY(signalStatus.strAdapterStatus, "Locked");
     else
       PVR_STRCPY(signalStatus.strAdapterStatus, "No lock");
-    signalStatus.dAudioBitrate = 0;
-    signalStatus.dDolbyBitrate = 0;
-    signalStatus.dVideoBitrate = 0;
     signalStatus.iSignal = signal->signal;
     signalStatus.iBER = signal->ber;
     signalStatus.iSNR = signal->snr;
@@ -2423,7 +2414,7 @@ PVR_ERROR PVRClientMythTV::CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_
     return DeleteAndForgetRecording(item.data.recording);
   }
 
-  if (menuhook.iHookId == MENUHOOK_KEEP_LIVETV_RECORDING && item.cat == PVR_MENUHOOK_RECORDING)
+  if (menuhook.iHookId == MENUHOOK_KEEP_RECORDING && item.cat == PVR_MENUHOOK_RECORDING)
   {
     CLockObject lock(m_recordingsLock);
     ProgramInfoMap::iterator it = m_recordings.find(item.data.recording.strRecordingId);
@@ -2433,9 +2424,6 @@ PVR_ERROR PVRClientMythTV::CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_
       return PVR_ERROR_INVALID_PARAMETERS;
     }
 
-    if (!it->second.IsLiveTV())
-      return PVR_ERROR_NO_ERROR;
-
     // If recording is current live show then keep it and set live recorder
     if (IsMyLiveRecording(it->second))
     {
@@ -2444,7 +2432,7 @@ PVR_ERROR PVRClientMythTV::CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_
         return PVR_ERROR_NO_ERROR;
       return PVR_ERROR_FAILED;
     }
-    // Else keep old live recording
+    // Else keep recording
     else
     {
       if (m_control->UndeleteRecording(*(it->second.GetPtr())))
diff --git a/src/pvrclient-mythtv.h b/src/pvrclient-mythtv.h
index e9efc64..401b5ac 100644
--- a/src/pvrclient-mythtv.h
+++ b/src/pvrclient-mythtv.h
@@ -27,8 +27,8 @@
 #include "demux.h"
 #include "filestreaming.h"
 
-#include <kodi/xbmc_pvr_types.h>
-#include <platform/threads/mutex.h>
+#include <xbmc_pvr_types.h>
+#include <p8-platform/threads/mutex.h>
 #include <mythsharedptr.h>
 #include <mythcontrol.h>
 #include <mytheventhandler.h>
@@ -117,11 +117,11 @@ public:
   bool OpenLiveStream(const PVR_CHANNEL &channel);
   void CloseLiveStream();
   int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize);
-  int GetCurrentClientChannel();
   bool SwitchChannel(const PVR_CHANNEL &channel);
   long long SeekLiveStream(long long iPosition, int iWhence);
   long long LengthLiveStream();
   PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus);
+  bool IsRealTimeStream() const { return m_liveStream ? true : false; }
 
   PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties);
   void DemuxAbort(void);
@@ -162,7 +162,7 @@ private:
   // Backend
   FileOps *m_fileOps;
   MythScheduleManager *m_scheduleManager;
-  PLATFORM::CMutex m_lock;
+  P8PLATFORM::CMutex m_lock;
 
   // Categories
   Categories m_categories;
@@ -182,7 +182,7 @@ private:
   PVRChannelGroupMap m_PVRChannelGroups;
   typedef std::map<unsigned int, unsigned int> PVRChannelMap;
   PVRChannelMap m_PVRChannelUidById;
-  mutable PLATFORM::CMutex m_channelsLock;
+  mutable P8PLATFORM::CMutex m_channelsLock;
   int FillChannelsAndChannelGroups();
   MythChannel FindChannel(uint32_t channelId) const;
   int FindPVRChannelUid(uint32_t channelId) const;
@@ -192,7 +192,7 @@ private:
 
   // Recordings
   ProgramInfoMap m_recordings;
-  mutable PLATFORM::CMutex m_recordingsLock;
+  mutable P8PLATFORM::CMutex m_recordingsLock;
   unsigned m_recordingChangePinCount;
   bool m_recordingsAmountChange;
   int m_recordingsAmount;
diff --git a/src/tools.h b/src/tools.h
index 45666bf..7ad3af9 100644
--- a/src/tools.h
+++ b/src/tools.h
@@ -21,7 +21,7 @@
  *
  */
 
-#include <platform/os.h>
+#include <p8-platform/os.h>
 #include <math.h>
 
 #ifdef __WINDOWS__

-- 
kodi-pvr-mythtv packaging



More information about the pkg-multimedia-commits mailing list