Paste

URL To paste - | raw - Tue Oct 19 2021 22:12:22 GMT+0000 (Coordinated Universal Time)
diff --git a/inputstream.ffmpegdirect/addon.xml.in b/inputstream.ffmpegdirect/addon.xml.in
index 074e413..52015e6 100644
--- a/inputstream.ffmpegdirect/addon.xml.in
+++ b/inputstream.ffmpegdirect/addon.xml.in
@@ -10,7 +10,7 @@
     name="ffmpegdirect"
     extension=""
     tags="true"
-    listitemprops="program_number|stream_mode|open_mode|manifest_type|default_url|is_realtime_stream|playback_as_live|programme_start_time|programme_end_time|catchup_url_format_string|catchup_url_near_live_format_string|catchup_buffer_start_time|catchup_buffer_end_time|catchup_buffer_offset|catchup_terminates|catchup_granularity|timezone_shift|default_programme_duration|programme_catchup_id"
+    listitemprops="program_number|stream_mode|open_mode|manifest_type|default_url|is_realtime_stream|playback_as_live|programme_start_time|programme_end_time|catchup_url_format_string|catchup_url_near_live_format_string|catchup_buffer_start_time|catchup_buffer_end_time|catchup_buffer_offset|catchup_terminates|catchup_granularity|timezone_shift|default_programme_duration|programme_catchup_id|crypto_key|crypto_iv"
     library_@PLATFORM@="@LIBRARY_FILENAME@" />
   <extension point="xbmc.service" library="resources/lib/runner.py"/>
   <extension point="xbmc.addon.metadata">
diff --git a/src/StreamManager.cpp b/src/StreamManager.cpp
index 59f58f5..7467969 100644
--- a/src/StreamManager.cpp
+++ b/src/StreamManager.cpp
@@ -154,6 +154,14 @@ bool InputStreamFFmpegDirect::Open(const kodi::addon::InputstreamProperty& props
     {
       m_properties.m_programmeCatchupId = prop.second;
     }
+    else if (CRYPTO_KEY == prop.first)
+    {
+      m_properties.m_cryptoKey = prop.second;
+    }
+    else if (CRYPTO_IV == prop.first)
+    {
+      m_properties.m_cryptoIv = prop.second;
+    }
   }
 
   m_streamUrl = props.GetURL();
diff --git a/src/StreamManager.h b/src/StreamManager.h
index a067f09..ff1e285 100644
--- a/src/StreamManager.h
+++ b/src/StreamManager.h
@@ -35,6 +35,8 @@ static const std::string CATCHUP_GRANULARITY = "inputstream.ffmpegdirect.catchup
 static const std::string TIMEZONE_SHIFT = "inputstream.ffmpegdirect.timezone_shift";
 static const std::string DEFAULT_PROGRAMME_DURATION = "inputstream.ffmpegdirect.default_programme_duration";
 static const std::string PROGRAMME_CATCHUP_ID = "inputstream.ffmpegdirect.programme_catchup_id";
+static const std::string CRYPTO_KEY = "inputstream.ffmpegdirect.crypto_key";
+static const std::string CRYPTO_IV = "inputstream.ffmpegdirect.crypto_iv";
 
 class ATTRIBUTE_HIDDEN InputStreamFFmpegDirect
   : public kodi::addon::CInstanceInputStream, ffmpegdirect::IManageDemuxPacket
diff --git a/src/stream/FFmpegStream.cpp b/src/stream/FFmpegStream.cpp
index 8fd9c00..824f876 100644
--- a/src/stream/FFmpegStream.cpp
+++ b/src/stream/FFmpegStream.cpp
@@ -132,6 +132,8 @@ FFmpegStream::FFmpegStream(IManageDemuxPacket* demuxPacketManager, const Propert
     m_openMode(props.m_openMode),
     m_streamMode(props.m_streamMode),
     m_manifestType(props.m_manifestType),
+    m_cryptoKey(props.m_cryptoKey),
+    m_cryptoIv(props.m_cryptoIv),
     m_curlInput(curlInput),
     m_httpProxy(httpProxy),
     m_paused(false)
@@ -674,21 +676,21 @@ bool FFmpegStream::Open(bool fileinfo)
   //m_pInput = streamUrl;
   strFile = m_streamUrl;//m_pInput->GetFileName();
 
-  if (m_mimeType.length() > 0)
-  {
-    std::string content = m_mimeType;
-    StringUtils::ToLower(content);
-
-    /* check if we can get a hint from content */
-    if (content.compare("video/x-vobsub") == 0)
-      iformat = av_find_input_format("mpeg");
-    else if (content.compare("video/x-dvd-mpeg") == 0)
-      iformat = av_find_input_format("mpeg");
-    else if (content.compare("video/mp2t") == 0)
-      iformat = av_find_input_format("mpegts");
-    else if (content.compare("multipart/x-mixed-replace") == 0)
-      iformat = av_find_input_format("mjpeg");
-  }
+//   if (m_mimeType.length() > 0)
+//   {
+//     std::string content = m_mimeType;
+//     StringUtils::ToLower(content);
+// 
+//     /* check if we can get a hint from content */
+//     if (content.compare("video/x-vobsub") == 0)
+//       iformat = av_find_input_format("mpeg");
+//     else if (content.compare("video/x-dvd-mpeg") == 0)
+//       iformat = av_find_input_format("mpeg");
+//     else if (content.compare("video/mp2t") == 0)
+//       iformat = av_find_input_format("mpegts");
+//     else if (content.compare("multipart/x-mixed-replace") == 0)
+//       iformat = av_find_input_format("mjpeg");
+//   }
 
   // open the demuxer
   m_pFormatContext = avformat_alloc_context();
@@ -927,8 +929,12 @@ bool FFmpegStream::OpenWithFFmpeg(AVInputFormat* iformat, const AVIOInterruptCB&
     if (!kodi::GetSettingBoolean("useFastOpenForManifestStreams") || m_manifestType.empty())
     {
       m_pFormatContext->flags |= AVFMT_FLAG_PRIV_OPT;
-      if (avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, &options) < 0)
+      int err = avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, &options);
+      if (err < 0)
       {
+        char errbuf[128];
+        av_strerror(err, errbuf, 128);
+
         Log(LOGLEVEL_DEBUG, "Error, could not open file %s", CURL::GetRedacted(strFile).c_str());
         Dispose();
         av_dict_free(&options);
@@ -2084,7 +2090,7 @@ AVDictionary* FFmpegStream::GetFFMpegOptionsFromInput()
   AVDictionary* options = nullptr;
 
   // For a local file we need the following protocol whitelist
-  if (url.GetProtocol().empty() || url.IsProtocol("file"))
+//  if (url.GetProtocol().empty() || url.IsProtocol("file"))
     av_dict_set(&options, "protocol_whitelist", "file,http,https,tcp,tls,crypto", 0);
 
   if (url.IsProtocol("http") || url.IsProtocol("https"))
@@ -2210,6 +2216,12 @@ AVDictionary* FFmpegStream::GetFFMpegOptionsFromInput()
     av_dict_set(&options, "http_proxy", urlStream.str().c_str(), 0);
   }
 
+  if (!m_cryptoKey.empty() && !m_cryptoIv.empty())
+  {
+    av_dict_set(&options, "decryption_key", m_cryptoKey.c_str(), 0);
+    av_dict_set(&options, "decryption_iv", m_cryptoIv.c_str(), 0);
+  }
+
   return options;
 }
 
diff --git a/src/stream/FFmpegStream.h b/src/stream/FFmpegStream.h
index 851b260..237f860 100644
--- a/src/stream/FFmpegStream.h
+++ b/src/stream/FFmpegStream.h
@@ -190,6 +190,8 @@ private:
   std::string m_mimeType;
   std::string m_programProperty;
   std::string m_manifestType;
+  std::string m_cryptoKey;
+  std::string m_cryptoIv;
   bool m_opened;
 
   HttpProxy m_httpProxy;
diff --git a/src/utils/Properties.h b/src/utils/Properties.h
index e068052..fa0365e 100644
--- a/src/utils/Properties.h
+++ b/src/utils/Properties.h
@@ -49,5 +49,7 @@ namespace ffmpegdirect
     int m_timezoneShiftSecs = 0;
     int m_defaultProgrammeDurationSecs = 4 * 60 * 60; //Four hours
     std::string m_programmeCatchupId;      
+    std::string m_cryptoKey;
+    std::string m_cryptoIv;
   };
-} //namespace ffmpegdirect
\ No newline at end of file
+} //namespace ffmpegdirect