From 4a41cf4b74d02f8c6b253ef97cf7932b74addb6d Mon Sep 17 00:00:00 2001 From: knackebrot Date: Sun, 14 Mar 2021 19:24:59 +0100 Subject: [PATCH] Update for Jellyfin 10.7 --- .editorconfig | 199 ++++++++ .gitignore | 2 + MediaBrowser.Plugins.VuPlus.sln | 11 +- .../Configuration/PluginConfiguration.cs | 13 +- .../Configuration/configPage.html | 114 ++--- .../Helpers/GeneralHelpers.cs | 8 +- MediaBrowser.Plugins.VuPlus/LiveTvService.cs | 457 ++++++++---------- .../MediaBrowser.Plugins.VuPlus.csproj | 21 +- MediaBrowser.Plugins.VuPlus/Plugin.cs | 24 +- .../RecordingsChannel.cs | 76 +-- build.yaml | 12 +- 11 files changed, 507 insertions(+), 430 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b87ad18 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,199 @@ +# With more recent updates Visual Studio 2017 supports EditorConfig files out of the box +# Visual Studio Code needs an extension: https://github.com/editorconfig/editorconfig-vscode +# For emacs, vim, np++ and other editors, see here: https://github.com/editorconfig +############################### +# Core EditorConfig Options # +############################### +root = true + +# All files +[*] +indent_style = space +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +end_of_line = lf +max_line_length = 9999 + +# YAML indentation +[*.{yml,yaml}] +indent_size = 2 + +# XML indentation +[*.{csproj,xml}] +indent_size = 2 + +############################### +# .NET Coding Conventions # +############################### + +[*.{cs,vb}] +# Organize usings +dotnet_sort_system_directives_first = true +# this. preferences +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_property = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_event = false:silent +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent +dotnet_style_readonly_field = true:suggestion +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent + +############################### +# Naming Conventions # +############################### + +# Style Definitions (From Roslyn) + +# Non-private static fields are PascalCase +dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields +dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style + +dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field +dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected +dotnet_naming_symbols.non_private_static_fields.required_modifiers = static + +dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case + +# Constants are PascalCase +dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants +dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style + +dotnet_naming_symbols.constants.applicable_kinds = field, local +dotnet_naming_symbols.constants.required_modifiers = const + +dotnet_naming_style.constant_style.capitalization = pascal_case + +# Static fields are camelCase and start with s_ +dotnet_naming_rule.static_fields_should_be_camel_case.severity = suggestion +dotnet_naming_rule.static_fields_should_be_camel_case.symbols = static_fields +dotnet_naming_rule.static_fields_should_be_camel_case.style = static_field_style + +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static + +dotnet_naming_style.static_field_style.capitalization = camel_case +dotnet_naming_style.static_field_style.required_prefix = _ + +# Instance fields are camelCase and start with _ +dotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion +dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields +dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style + +dotnet_naming_symbols.instance_fields.applicable_kinds = field + +dotnet_naming_style.instance_field_style.capitalization = camel_case +dotnet_naming_style.instance_field_style.required_prefix = _ + +# Locals and parameters are camelCase +dotnet_naming_rule.locals_should_be_camel_case.severity = suggestion +dotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters +dotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style + +dotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local + +dotnet_naming_style.camel_case_style.capitalization = camel_case + +# Local functions are PascalCase +dotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions +dotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style + +dotnet_naming_symbols.local_functions.applicable_kinds = local_function + +dotnet_naming_style.local_function_style.capitalization = pascal_case + +# By default, name items with PascalCase +dotnet_naming_rule.members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.members_should_be_pascal_case.symbols = all_members +dotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style + +dotnet_naming_symbols.all_members.applicable_kinds = * + +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +############################### +# C# Coding Conventions # +############################### + +[*.cs] +# var preferences +csharp_style_var_for_built_in_types = true:silent +csharp_style_var_when_type_is_apparent = true:silent +csharp_style_var_elsewhere = true:silent +# Expression-bodied members +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +# Pattern matching preferences +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +# Null-checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion +# Expression-level preferences +csharp_prefer_braces = true:silent +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +############################### +# C# Formatting Rules # +############################### + +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left +# Space preferences +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +# Wrapping preferences +csharp_preserve_single_line_statements = true +csharp_preserve_single_line_blocks = true diff --git a/.gitignore b/.gitignore index bdc3535..6bf8585 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,5 @@ Generated_Code #added for RIA/Silverlight projects _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML + +.vs \ No newline at end of file diff --git a/MediaBrowser.Plugins.VuPlus.sln b/MediaBrowser.Plugins.VuPlus.sln index fe0b192..52c2370 100644 --- a/MediaBrowser.Plugins.VuPlus.sln +++ b/MediaBrowser.Plugins.VuPlus.sln @@ -1,9 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26730.3 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31105.61 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Plugins.VuPlus", "MediaBrowser.Plugins.VuPlus\MediaBrowser.Plugins.VuPlus.csproj", "{52B1ABDF-09C1-450E-B808-BBA0A9C19848}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.Plugins.VuPlus", "MediaBrowser.Plugins.VuPlus\MediaBrowser.Plugins.VuPlus.csproj", "{52B1ABDF-09C1-450E-B808-BBA0A9C19848}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A968FB09-8732-407C-8748-6DB383EB5D91}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/MediaBrowser.Plugins.VuPlus/Configuration/PluginConfiguration.cs b/MediaBrowser.Plugins.VuPlus/Configuration/PluginConfiguration.cs index f7fe0cc..f83283a 100644 --- a/MediaBrowser.Plugins.VuPlus/Configuration/PluginConfiguration.cs +++ b/MediaBrowser.Plugins.VuPlus/Configuration/PluginConfiguration.cs @@ -1,4 +1,3 @@ -using System; using MediaBrowser.Model.Plugins; namespace MediaBrowser.Plugins.VuPlus.Configuration @@ -13,16 +12,16 @@ namespace MediaBrowser.Plugins.VuPlus.Configuration public string WebInterfacePort { get; set; } public string WebInterfaceUsername { get; set; } public string WebInterfacePassword { get; set; } - public Boolean UseSecureHTTPS { get; set; } - public Boolean OnlyOneBouquet { get; set; } + public bool UseSecureHTTPS { get; set; } + public bool OnlyOneBouquet { get; set; } public string TVBouquet { get; set; } - public Boolean ZapToChannel { get; set; } - public Boolean FetchPiconsFromWebInterface { get; set; } + public bool ZapToChannel { get; set; } + public bool FetchPiconsFromWebInterface { get; set; } public string PiconsPath { get; set; } public string RecordingPath { get; set; } - public Boolean EnableDebugLogging { get; set; } + public bool EnableDebugLogging { get; set; } public PluginConfiguration() @@ -30,7 +29,7 @@ namespace MediaBrowser.Plugins.VuPlus.Configuration HostName = "http://localhost"; StreamingPort = "8001"; WebInterfacePort = "8000"; - WebInterfaceUsername= ""; + WebInterfaceUsername = ""; WebInterfacePassword = ""; UseSecureHTTPS = false; OnlyOneBouquet = true; diff --git a/MediaBrowser.Plugins.VuPlus/Configuration/configPage.html b/MediaBrowser.Plugins.VuPlus/Configuration/configPage.html index 41e1a3a..106e093 100644 --- a/MediaBrowser.Plugins.VuPlus/Configuration/configPage.html +++ b/MediaBrowser.Plugins.VuPlus/Configuration/configPage.html @@ -4,14 +4,14 @@ Vu+ -
+

VuPlus

-
+
@@ -122,81 +122,61 @@
diff --git a/MediaBrowser.Plugins.VuPlus/Helpers/GeneralHelpers.cs b/MediaBrowser.Plugins.VuPlus/Helpers/GeneralHelpers.cs index 5e22cc9..518d5c8 100644 --- a/MediaBrowser.Plugins.VuPlus/Helpers/GeneralHelpers.cs +++ b/MediaBrowser.Plugins.VuPlus/Helpers/GeneralHelpers.cs @@ -1,5 +1,5 @@ -using MediaBrowser.Model.LiveTv; using System; +using MediaBrowser.Model.LiveTv; using Microsoft.Extensions.Logging; namespace MediaBrowser.Plugins.VuPlus.Helpers @@ -8,7 +8,7 @@ namespace MediaBrowser.Plugins.VuPlus.Helpers { public static ChannelType GetChannelType(string channelType) { - ChannelType type = new ChannelType(); + var type = new ChannelType(); if (channelType == "0x1") { @@ -28,14 +28,14 @@ namespace MediaBrowser.Plugins.VuPlus.Helpers public static void DebugInformation(ILogger logger, string message) { var config = Plugin.Instance.Configuration; - bool enableDebugLogging = config.EnableDebugLogging; + var enableDebugLogging = config.EnableDebugLogging; if (enableDebugLogging) { logger.LogDebug(message); } } - + } public static class RecordingHelper diff --git a/MediaBrowser.Plugins.VuPlus/LiveTvService.cs b/MediaBrowser.Plugins.VuPlus/LiveTvService.cs index 176a797..5fe13ca 100644 --- a/MediaBrowser.Plugins.VuPlus/LiveTvService.cs +++ b/MediaBrowser.Plugins.VuPlus/LiveTvService.cs @@ -1,31 +1,24 @@ -using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Channels; -using MediaBrowser.Controller.Drawing; -using MediaBrowser.Controller.LiveTv; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; -using Microsoft.Extensions.Logging; -using MediaBrowser.Model.MediaInfo; -using MediaBrowser.Model.Net; -using MediaBrowser.Model.Serialization; - -using MediaBrowser.Plugins.VuPlus.Helpers; using System; using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; using System.Text; using System.Threading; using System.Threading.Tasks; - using System.Xml; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.LiveTv; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.LiveTv; -using System.Net; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Common.Plugins; -using MediaBrowser.Model.ApiClient; +using MediaBrowser.Model.MediaInfo; +using MediaBrowser.Plugins.VuPlus.Helpers; +using Microsoft.Extensions.Logging; namespace MediaBrowser.Plugins.VuPlus { @@ -34,21 +27,22 @@ namespace MediaBrowser.Plugins.VuPlus /// public class LiveTvService : ILiveTvService { - private readonly IHttpClient _httpClient; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private readonly ILogger _logger; private int _liveStreams; private readonly Dictionary _heartBeat = new Dictionary(); - private String tvBouquetSRef; - List tvChannelInfos = new List(); + private string tvBouquetSRef; + private List tvChannelInfos = new List(); public DateTime LastRecordingChange = DateTime.MinValue; - public LiveTvService(IHttpClient httpClient, IJsonSerializer jsonSerializer, ILogger logger) + private readonly HttpClient _httpClient; + + public LiveTvService(ILogger logger, IHttpClientFactory httpClientFactory) { - _httpClient = httpClient; _logger = logger; + _httpClient = GetHttpClient(httpClientFactory); } @@ -68,13 +62,23 @@ namespace MediaBrowser.Plugins.VuPlus _logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync StreamingPort: {0}", config.StreamingPort)); _logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfacePort: {0}", config.WebInterfacePort)); if (string.IsNullOrEmpty(config.WebInterfaceUsername)) + { _logger.LogInformation("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: "); + } else + { _logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: {0}", "********")); + } + if (string.IsNullOrEmpty(config.WebInterfacePassword)) + { _logger.LogInformation("[VuPlus] EnsureConnectionAsync WebInterfacePassword: "); + } else + { _logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: {0}", "********")); + } + _logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync UseSecureHTTPS: {0}", config.UseSecureHTTPS)); _logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync OnlyOneBouquet: {0}", config.OnlyOneBouquet)); _logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync TVBouquet: {0}", config.TVBouquet)); @@ -131,11 +135,31 @@ namespace MediaBrowser.Plugins.VuPlus else { // connect to VuPlus box to test connectivity. - String resultNotRequired = await InitiateSession(cancellationToken, null).ConfigureAwait(false); + var resultNotRequired = await InitiateSession(cancellationToken, null).ConfigureAwait(false); tvBouquetSRef = null; } } + /// + /// Creates HttpClient for connection to Enigma2 + /// + /// + /// + private HttpClient GetHttpClient(IHttpClientFactory httpClientFactory) + { + var httpClient = httpClientFactory.CreateClient(NamedClient.Default); + httpClient.DefaultRequestHeaders.UserAgent.Add( + new ProductInfoHeaderValue(Name, Plugin.Instance.Version.ToString())); + + if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) + { + var authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; + authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authInfo); + } + + return httpClient; + } /// /// Checks connection to VuPlus and retrieves service reference for channel if only one bouquet. @@ -143,38 +167,27 @@ namespace MediaBrowser.Plugins.VuPlus /// The cancellation token. /// The TV Bouquet. /// Task{String>}. - public async Task InitiateSession(CancellationToken cancellationToken, String tvBouquet) + public async Task InitiateSession(CancellationToken cancellationToken, string tvBouquet) { _logger.LogInformation("[VuPlus] Start InitiateSession, validates connection and returns Bouquet reference if required"); //await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false); var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/getservices", baseUrl); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] InitiateSession url: {0}", url)); - var options = new HttpRequestOptions + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url, - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] InitiateSession response: {0}", xmlResponse)); try @@ -182,9 +195,9 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - String tvBouquetReference = null; + string tvBouquetReference = null; - XmlNodeList e2services = xml.GetElementsByTagName("e2service"); + var e2services = xml.GetElementsByTagName("e2service"); // If TV Bouquet passed find associated service reference if (!string.IsNullOrEmpty(tvBouquet)) @@ -246,7 +259,9 @@ namespace MediaBrowser.Plugins.VuPlus var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; @@ -264,28 +279,17 @@ namespace MediaBrowser.Plugins.VuPlus UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelsAsync url: {0}", url)); - var options = new HttpRequestOptions - { - CancellationToken = cancellationToken, - Url = url, - UserAgent = "vuplus-pvraddon-agent/1.0" - }; - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - baseUrlPicon = protocol + "://" + Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword + "@" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; } - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelsAsync response: {0}", xmlResponse)); try @@ -293,14 +297,14 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - List channelInfos = new List(); + var channelInfos = new List(); if (string.IsNullOrEmpty(tvBouquetSRef)) { // Load channels from all TV Bouquets _logger.LogInformation("[VuPlus] GetChannelsAsync for all TV Bouquets"); - XmlNodeList e2services = xml.GetElementsByTagName("e2service"); + var e2services = xml.GetElementsByTagName("e2service"); foreach (XmlNode xmlNode in e2services) { var channelInfo = new ChannelInfo(); @@ -320,7 +324,7 @@ namespace MediaBrowser.Plugins.VuPlus } // get all channels for TV Bouquet - List channelInfosForBouquet = await GetChannelsForTVBouquetAsync(cancellationToken, e2servicereference).ConfigureAwait(false); + var channelInfosForBouquet = await GetChannelsForTVBouquetAsync(cancellationToken, e2servicereference).ConfigureAwait(false); // store all channels for TV Bouquet channelInfos.AddRange(channelInfosForBouquet); @@ -331,9 +335,9 @@ namespace MediaBrowser.Plugins.VuPlus else { // Load channels for specified TV Bouquet only - int count = 1; + var count = 1; - XmlNodeList e2services = xml.GetElementsByTagName("e2service"); + var e2services = xml.GetElementsByTagName("e2service"); foreach (XmlNode xmlNode in e2services) { var channelInfo = new ChannelInfo(); @@ -358,9 +362,13 @@ namespace MediaBrowser.Plugins.VuPlus { //check for radio channel if (e2servicereference.ToUpper().Contains("RADIO")) + { channelInfo.ChannelType = ChannelType.Radio; + } else + { channelInfo.ChannelType = ChannelType.TV; + } channelInfo.HasImage = true; channelInfo.Id = e2servicereference; @@ -414,15 +422,18 @@ namespace MediaBrowser.Plugins.VuPlus /// Gets the channels async. /// /// The cancellation token. + /// Service reference /// Task{List}. - public async Task> GetChannelsForTVBouquetAsync(CancellationToken cancellationToken, String sRef) + public async Task> GetChannelsForTVBouquetAsync(CancellationToken cancellationToken, string sRef) { _logger.LogInformation("[VuPlus] Start GetChannelsForTVBouquetAsync, retrieve all channels for TV Bouquet " + sRef); await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false); var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; @@ -432,28 +443,16 @@ namespace MediaBrowser.Plugins.VuPlus UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelsForTVBouquetAsync url: {0}", url)); - var options = new HttpRequestOptions - { - CancellationToken = cancellationToken, - Url = url, - UserAgent = "vuplus-pvraddon-agent/1.0" - }; - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - baseUrlPicon = protocol + "://" + Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword + "@" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; - } - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelsForTVBouquetAsync response: {0}", xmlResponse)); try @@ -461,13 +460,13 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - List channelInfos = new List(); + var channelInfos = new List(); // Load channels for specified TV Bouquet only - int count = 1; + var count = 1; - XmlNodeList e2services = xml.GetElementsByTagName("e2service"); + var e2services = xml.GetElementsByTagName("e2service"); foreach (XmlNode xmlNode in e2services) { var channelInfo = new ChannelInfo(); @@ -492,9 +491,13 @@ namespace MediaBrowser.Plugins.VuPlus { //check for radio channel if (e2servicereference.Contains("radio")) + { channelInfo.ChannelType = ChannelType.Radio; + } else + { channelInfo.ChannelType = ChannelType.TV; + } channelInfo.HasImage = true; channelInfo.Id = e2servicereference; @@ -522,7 +525,7 @@ namespace MediaBrowser.Plugins.VuPlus channelInfo.Number = count.ToString(); channelInfos.Add(channelInfo); - count = count + 1; + count++; } else { @@ -559,31 +562,20 @@ namespace MediaBrowser.Plugins.VuPlus var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/movielist", baseUrl); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetRecordingsAsync url: {0}", url)); - var options = new HttpRequestOptions + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetRecordingsAsync response: {0}", xmlResponse)); try @@ -591,11 +583,11 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - List recordingInfos = new List(); + var recordingInfos = new List(); - int count = 1; + var count = 1; - XmlNodeList e2movie = xml.GetElementsByTagName("e2movie"); + var e2movie = xml.GetElementsByTagName("e2movie"); foreach (XmlNode xmlNode in e2movie) { @@ -646,14 +638,19 @@ namespace MediaBrowser.Plugins.VuPlus recordingInfo.ChannelId = null; //check for radio channel if (e2servicereference.ToUpper().Contains("RADIO")) + { recordingInfo.ChannelType = ChannelType.Radio; + } else + { recordingInfo.ChannelType = ChannelType.TV; + } + recordingInfo.HasImage = false; recordingInfo.ImagePath = null; recordingInfo.ImageUrl = null; - foreach (ChannelInfo channelInfo in tvChannelInfos) + foreach (var channelInfo in tvChannelInfos) { if (channelInfo.Name == e2servicename) { @@ -674,16 +671,16 @@ namespace MediaBrowser.Plugins.VuPlus recordingInfo.CommunityRating = 0; - long sdated = Int64.Parse(e2time); - DateTime sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated); + var sdated = long.Parse(e2time); + var sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated); recordingInfo.StartDate = sdate.ToUniversalTime(); //length in format mm:ss - string[] words = e2length.Split(':'); - long mins = Int64.Parse(words[0]); - long seconds = Int64.Parse(words[1]); - long edated = Int64.Parse(e2time) + (mins * 60) + (seconds); - DateTime edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated); + var words = e2length.Split(':'); + var mins = long.Parse(words[0]); + var seconds = long.Parse(words[1]); + var edated = long.Parse(e2time) + (mins * 60) + (seconds); + var edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated); recordingInfo.EndDate = edate.ToUniversalTime(); //recordingInfo.EpisodeTitle = e2title; @@ -691,8 +688,10 @@ namespace MediaBrowser.Plugins.VuPlus recordingInfo.Overview = e2description; - List genre = new List(); - genre.Add("Unknown"); + var genre = new List + { + "Unknown" + }; recordingInfo.Genres = genre; recordingInfo.Id = e2servicereference; @@ -742,31 +741,20 @@ namespace MediaBrowser.Plugins.VuPlus var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/moviedelete?sRef={1}", baseUrl, recordingId); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] DeleteRecordingAsync url: {0}", url)); - var options = new HttpRequestOptions + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] DeleteRecordingAsync response: {0}", xmlResponse)); try @@ -774,7 +762,7 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); + var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); foreach (XmlNode xmlNode in e2simplexmlresult) { var recordingInfo = new RecordingInfo(); @@ -825,7 +813,7 @@ namespace MediaBrowser.Plugins.VuPlus await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false); // extract sRef, id, begin and end from passed timerId - string[] words = timerId.Split('~'); + var words = timerId.Split('~'); var sRef = words[0]; var id = words[1]; var begin = words[2]; @@ -833,31 +821,20 @@ namespace MediaBrowser.Plugins.VuPlus var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/timerdelete?sRef={1}&begin={2}&end={3}", baseUrl, sRef, begin, end); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CancelTimerAsync url: {0}", url)); - var options = new HttpRequestOptions + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CancelTimerAsync response: {0}", xmlResponse)); try @@ -865,7 +842,7 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); + var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); foreach (XmlNode xmlNode in e2simplexmlresult) { var recordingInfo = new RecordingInfo(); @@ -916,12 +893,14 @@ namespace MediaBrowser.Plugins.VuPlus await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false); // extract eventid from info.ProgramId - string[] words = info.ProgramId.Split('~'); + var words = info.ProgramId.Split('~'); var eventid = words[1]; var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; @@ -934,24 +913,11 @@ namespace MediaBrowser.Plugins.VuPlus UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CreateTimerAsync url: {0}", url)); - var options = new HttpRequestOptions + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CancelTimerAsync response: {0}", xmlResponse)); try @@ -959,7 +925,7 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); + var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); foreach (XmlNode xmlNode in e2simplexmlresult) { var recordingInfo = new RecordingInfo(); @@ -1010,31 +976,20 @@ namespace MediaBrowser.Plugins.VuPlus var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/timerlist", baseUrl); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetTimersAsync url: {0}", url)); - var options = new HttpRequestOptions + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetTimersAsync response: {0}", xmlResponse)); try @@ -1042,11 +997,11 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - List timerInfos = new List(); + var timerInfos = new List(); - int count = 1; + var count = 1; - XmlNodeList e2timer = xml.GetElementsByTagName("e2timer"); + var e2timer = xml.GetElementsByTagName("e2timer"); foreach (XmlNode xmlNode in e2timer) { var timerInfo = new TimerInfo(); @@ -1097,8 +1052,8 @@ namespace MediaBrowser.Plugins.VuPlus timerInfo.ChannelId = e2servicereference; - long edated = Int64.Parse(e2timeend); - DateTime edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated); + var edated = long.Parse(e2timeend); + var edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated); timerInfo.EndDate = edate.ToUniversalTime(); timerInfo.Id = e2servicereference + "~" + e2eit + "~" + e2timebegin + "~" + e2timeend + "~" + count; @@ -1113,14 +1068,19 @@ namespace MediaBrowser.Plugins.VuPlus timerInfo.ProgramId = null; timerInfo.SeriesTimerId = null; - long sdated = Int64.Parse(e2timebegin); - DateTime sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated); + var sdated = long.Parse(e2timebegin); + var sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated); timerInfo.StartDate = sdate.ToUniversalTime(); if (e2state == "0") + { timerInfo.Status = RecordingStatus.New; + } + if (e2state == "2") + { timerInfo.Status = RecordingStatus.InProgress; + } timerInfos.Add(timerInfo); count = count + 1; @@ -1163,7 +1123,9 @@ namespace MediaBrowser.Plugins.VuPlus var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.StreamingPort; @@ -1174,7 +1136,7 @@ namespace MediaBrowser.Plugins.VuPlus } _liveStreams++; - string streamUrl = string.Format("{0}/{1}", baseUrl, channelOid); + var streamUrl = string.Format("{0}/{1}", baseUrl, channelOid); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelStream url: {0}", streamUrl)); return new MediaSourceInfo @@ -1212,38 +1174,27 @@ namespace MediaBrowser.Plugins.VuPlus /// The CancellationToken /// The channel id /// - public async Task ZapToChannel(CancellationToken cancellationToken, String channelOid) + public async Task ZapToChannel(CancellationToken cancellationToken, string channelOid) { _logger.LogInformation("[VuPlus] Start ZapToChannel"); await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false); var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/zap?sRef={1}", baseUrl, channelOid); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] ZapToChannel url: {0}", url)); - var options = new HttpRequestOptions() + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] ZapToChannel response: {0}", xmlResponse)); try @@ -1251,7 +1202,7 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); + var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult"); foreach (XmlNode xmlNode in e2simplexmlresult) { var recordingInfo = new RecordingInfo(); @@ -1302,7 +1253,7 @@ namespace MediaBrowser.Plugins.VuPlus { _logger.LogInformation("[VuPlus] Start GetNewTimerDefaultsAsync"); - SeriesTimerInfo seriesTimerInfo = new SeriesTimerInfo(); + var seriesTimerInfo = new SeriesTimerInfo(); return seriesTimerInfo; } @@ -1321,38 +1272,27 @@ namespace MediaBrowser.Plugins.VuPlus _logger.LogInformation("[VuPlus] Start GetProgramsAsync"); await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false); - Random rnd = new Random(); + var rnd = new Random(); var imagePath = ""; var imageUrl = ""; var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/epgservice?sRef={1}", baseUrl, channelId); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetProgramsAsync url: {0}", url)); - var options = new HttpRequestOptions() + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - CancellationToken = cancellationToken, - Url = url - }; - - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) - { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetProgramsAsync response: {0}", xmlResponse)); try @@ -1360,13 +1300,13 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - List programInfos = new List(); + var programInfos = new List(); - int count = 1; + var count = 1; - XmlNodeList e2event = xml.GetElementsByTagName("e2event"); + var e2event = xml.GetElementsByTagName("e2event"); foreach (XmlNode xmlNode in e2event) - { + { var programInfo = new ProgramInfo(); var e2eventid = "?"; @@ -1419,8 +1359,8 @@ namespace MediaBrowser.Plugins.VuPlus } } - long sdated = Int64.Parse(e2eventstart); - DateTime sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated); + var sdated = long.Parse(e2eventstart); + var sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated); // Check whether the current element is within the time range passed if (sdate > endDateUtc) @@ -1436,7 +1376,7 @@ namespace MediaBrowser.Plugins.VuPlus //programInfo.ImageUrl = null; if (count == 1) { - foreach (ChannelInfo channelInfo in tvChannelInfos) + foreach (var channelInfo in tvChannelInfos) { if (channelInfo.Name == e2eventservicename) { @@ -1462,14 +1402,16 @@ namespace MediaBrowser.Plugins.VuPlus programInfo.Overview = e2eventdescriptionextended; - long edated = Int64.Parse(e2eventstart) + Int64.Parse(e2eventduration); - DateTime edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated); + var edated = long.Parse(e2eventstart) + long.Parse(e2eventduration); + var edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated); programInfo.StartDate = sdate.ToUniversalTime(); programInfo.EndDate = edate.ToUniversalTime(); - List genre = new List(); - genre.Add("Unknown"); + var genre = new List + { + "Unknown" + }; programInfo.Genres = genre; //programInfo.OriginalAirDate = null; @@ -1515,38 +1457,27 @@ namespace MediaBrowser.Plugins.VuPlus //TODO: Version check - bool upgradeAvailable = false; - string serverVersion = "Unknown"; + var upgradeAvailable = false; + var serverVersion = "Unknown"; var protocol = "http"; if (Plugin.Instance.Configuration.UseSecureHTTPS) + { protocol = "https"; + } var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort; var url = string.Format("{0}/web/deviceinfo", baseUrl); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetStatusInfoAsync url: {0}", url)); - var options = new HttpRequestOptions() - { - CancellationToken = cancellationToken, - Url = url - }; + var liveTvTunerInfos = new List(); - if (!string.IsNullOrEmpty(Plugin.Instance.Configuration.WebInterfaceUsername)) + using (var stream = await _httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false)) { - string authInfo = Plugin.Instance.Configuration.WebInterfaceUsername + ":" + Plugin.Instance.Configuration.WebInterfacePassword; - authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); - options.RequestHeaders["Authorization"] = "Basic " + authInfo; - } - - List liveTvTunerInfos = new List(); - - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) - { - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { - string xmlResponse = reader.ReadToEnd(); + var xmlResponse = reader.ReadToEnd(); UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetStatusInfoAsync response: {0}", xmlResponse)); try @@ -1554,7 +1485,7 @@ namespace MediaBrowser.Plugins.VuPlus var xml = new XmlDocument(); xml.LoadXml(xmlResponse); - XmlNodeList e2frontend = xml.GetElementsByTagName("e2frontend"); + var e2frontend = xml.GetElementsByTagName("e2frontend"); foreach (XmlNode xmlNode in e2frontend) { var liveTvTunerInfo = new LiveTvTunerInfo(); @@ -1605,20 +1536,14 @@ namespace MediaBrowser.Plugins.VuPlus /// Gets the homepage url. /// /// The homepage url. - public string HomePageUrl - { - get { return "http://www.VuPlus.com/"; } - } + public string HomePageUrl => "http://www.VuPlus.com/"; /// /// Gets the name. /// /// The name. - public string Name - { - get { return "VuPlus"; } - } + public string Name => "VuPlus"; public async Task GetRecordingStream(string recordingId, string mediaSourceId, CancellationToken cancellationToken) @@ -1636,7 +1561,7 @@ namespace MediaBrowser.Plugins.VuPlus public async Task CopyFilesAsync(StreamReader source, StreamWriter destination) { _logger.LogInformation("[VuPlus] Start CopyFiles Async"); - char[] buffer = new char[0x1000]; + var buffer = new char[0x1000]; int numRead; while ((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) != 0) { @@ -1660,7 +1585,7 @@ namespace MediaBrowser.Plugins.VuPlus { _logger.LogInformation("[VuPlus] Start GetSeriesTimersAsync"); - List seriesTimerInfo = new List(); + var seriesTimerInfo = new List(); return seriesTimerInfo; } diff --git a/MediaBrowser.Plugins.VuPlus/MediaBrowser.Plugins.VuPlus.csproj b/MediaBrowser.Plugins.VuPlus/MediaBrowser.Plugins.VuPlus.csproj index c371b35..f3478b5 100644 --- a/MediaBrowser.Plugins.VuPlus/MediaBrowser.Plugins.VuPlus.csproj +++ b/MediaBrowser.Plugins.VuPlus/MediaBrowser.Plugins.VuPlus.csproj @@ -1,9 +1,14 @@ - netstandard2.1 - 3.1.8 - 3.1.8 + net5.0 + 4.0.0.0 + 4.0.0.0 + + + + none + false @@ -15,10 +20,12 @@ - - - - + + + + + + diff --git a/MediaBrowser.Plugins.VuPlus/Plugin.cs b/MediaBrowser.Plugins.VuPlus/Plugin.cs index 3c61780..95a4d8d 100644 --- a/MediaBrowser.Plugins.VuPlus/Plugin.cs +++ b/MediaBrowser.Plugins.VuPlus/Plugin.cs @@ -13,8 +13,10 @@ namespace MediaBrowser.Plugins.VuPlus /// public class Plugin : BasePlugin, IHasWebPages { - public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer) - : base(applicationPaths, xmlSerializer) + public Plugin( + IApplicationPaths applicationPaths, + IXmlSerializer xmlSerializer + ) : base(applicationPaths, xmlSerializer) { Instance = this; } @@ -23,28 +25,16 @@ namespace MediaBrowser.Plugins.VuPlus /// Gets the name of the plugin /// /// The name. - public override string Name - { - get { return "VuPlus"; } - } + public override string Name => "VuPlus"; /// /// Gets the description. /// /// The description. - public override string Description - { - get - { - return "Provides live tv using Vu+ / Enigma2 pvr as a back-end."; - } - } + public override string Description => "Provides live tv using Vu+ / Enigma2 pvr as a back-end."; private Guid _id = new Guid("9564ac10-af23-39bc-449f-624f23cfa48f"); - public override Guid Id - { - get { return _id; } - } + public override Guid Id => _id; /// /// Gets the instance. diff --git a/MediaBrowser.Plugins.VuPlus/RecordingsChannel.cs b/MediaBrowser.Plugins.VuPlus/RecordingsChannel.cs index be2b2f8..add2615 100644 --- a/MediaBrowser.Plugins.VuPlus/RecordingsChannel.cs +++ b/MediaBrowser.Plugins.VuPlus/RecordingsChannel.cs @@ -1,20 +1,19 @@ -using System; +using System; using System.Collections.Generic; -using System.Text; +using System.Globalization; +using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Channels; -using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Channels; -using MediaBrowser.Model.MediaInfo; -using MediaBrowser.Controller.LiveTv; -using System.Linq; using MediaBrowser.Common.Extensions; -using MediaBrowser.Model.Dto; -using System.Globalization; +using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.LiveTv; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Channels; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.LiveTv; +using MediaBrowser.Model.MediaInfo; namespace MediaBrowser.Plugins.VuPlus { @@ -27,56 +26,27 @@ namespace MediaBrowser.Plugins.VuPlus _liveTvManager = liveTvManager; } - public string Name - { - get - { - return "VuPlus Recordings"; - } - } + public string Name => "VuPlus Recordings"; - public string[] Attributes - { - get - { - return new[] { "Recordings" }; - } - } + public string[] Attributes => new[] { "Recordings" }; - public string Description - { - get - { - return "VuPlus Recordings"; - } - } + public string Description => "VuPlus Recordings"; - public string DataVersion - { - get - { - return "1"; - } - } + public string DataVersion => "1"; - public string HomePageUrl - { - get { return null; } - } + public string HomePageUrl => null; - public ChannelParentalRating ParentalRating - { - get { return ChannelParentalRating.GeneralAudience; } - } + public ChannelParentalRating ParentalRating => ChannelParentalRating.GeneralAudience; public string GetCacheKey(string userId) { var now = DateTime.UtcNow; - var values = new List(); - - values.Add(now.DayOfYear.ToString(CultureInfo.InvariantCulture)); - values.Add(now.Hour.ToString(CultureInfo.InvariantCulture)); + var values = new List + { + now.DayOfYear.ToString(CultureInfo.InvariantCulture), + now.Hour.ToString(CultureInfo.InvariantCulture) + }; double minute = now.Minute; minute /= 5; @@ -94,8 +64,8 @@ namespace MediaBrowser.Plugins.VuPlus { ContentTypes = new List { - ChannelMediaContentType.Movie, - ChannelMediaContentType.Episode, + ChannelMediaContentType.Movie, + ChannelMediaContentType.Episode, ChannelMediaContentType.Clip }, MediaTypes = new List diff --git a/build.yaml b/build.yaml index 807a9e4..6a02794 100644 --- a/build.yaml +++ b/build.yaml @@ -8,11 +8,13 @@ guid: "9564ac10-af23-39bc-449f-624f23cfa48f" # The version of the plugin, starting at 1. Note that the AssemblyVersion # and FileVersion flags in the `.csproj` file must have two additional # fiels, e.g. 1.0.0 to be built correctly. -version: "3.1.8" # Please increment with each pull request +version: "4.0.0.0" # Please increment with each pull request # The supported Jellyfin version, usually the earliest binary-compatible # version. Based on the Jellyfin components from NuGet. -targetAbi: "10.6.0" # The earliest binary-compatible version +targetAbi: "10.7.0.0" # The earliest binary-compatible version + +framework: "net5.0" # The owner name of the plugin, "jellyfin" for official plugins. Change # to your own name if you wish to remain a 3rd-party plugin. @@ -24,9 +26,7 @@ overview: "VU+" # A longer and more detailed description of the plugin; use multiple # lines as required for readability. description: > - Plugin for Jellyfin to allow it to view channels, browse epg, set and delete timers, play recordings etc. - - + Live TV plugin for watching Enigma 2 channels and recordings # The plugin category, in a general sense. These fields are dynamic. category: "Live TV" @@ -41,4 +41,4 @@ artifacts: # not need to be changed usually. build_type: "dotnet" dotnet_configuration: "Release" -dotnet_framework: "netstandard2.1" +dotnet_framework: "net5.0"