Update for Jellyfin 10.7
This commit is contained in:
+199
@@ -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
|
||||||
@@ -106,3 +106,5 @@ Generated_Code #added for RIA/Silverlight projects
|
|||||||
_UpgradeReport_Files/
|
_UpgradeReport_Files/
|
||||||
Backup*/
|
Backup*/
|
||||||
UpgradeLog*.XML
|
UpgradeLog*.XML
|
||||||
|
|
||||||
|
.vs
|
||||||
@@ -1,9 +1,14 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 15.0.26730.3
|
VisualStudioVersion = 16.0.31105.61
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
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
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using System;
|
|
||||||
using MediaBrowser.Model.Plugins;
|
using MediaBrowser.Model.Plugins;
|
||||||
|
|
||||||
namespace MediaBrowser.Plugins.VuPlus.Configuration
|
namespace MediaBrowser.Plugins.VuPlus.Configuration
|
||||||
@@ -13,16 +12,16 @@ namespace MediaBrowser.Plugins.VuPlus.Configuration
|
|||||||
public string WebInterfacePort { get; set; }
|
public string WebInterfacePort { get; set; }
|
||||||
public string WebInterfaceUsername { get; set; }
|
public string WebInterfaceUsername { get; set; }
|
||||||
public string WebInterfacePassword { get; set; }
|
public string WebInterfacePassword { get; set; }
|
||||||
public Boolean UseSecureHTTPS { get; set; }
|
public bool UseSecureHTTPS { get; set; }
|
||||||
public Boolean OnlyOneBouquet { get; set; }
|
public bool OnlyOneBouquet { get; set; }
|
||||||
public string TVBouquet { get; set; }
|
public string TVBouquet { get; set; }
|
||||||
public Boolean ZapToChannel { get; set; }
|
public bool ZapToChannel { get; set; }
|
||||||
public Boolean FetchPiconsFromWebInterface { get; set; }
|
public bool FetchPiconsFromWebInterface { get; set; }
|
||||||
public string PiconsPath { get; set; }
|
public string PiconsPath { get; set; }
|
||||||
|
|
||||||
public string RecordingPath { get; set; }
|
public string RecordingPath { get; set; }
|
||||||
|
|
||||||
public Boolean EnableDebugLogging { get; set; }
|
public bool EnableDebugLogging { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public PluginConfiguration()
|
public PluginConfiguration()
|
||||||
@@ -30,7 +29,7 @@ namespace MediaBrowser.Plugins.VuPlus.Configuration
|
|||||||
HostName = "http://localhost";
|
HostName = "http://localhost";
|
||||||
StreamingPort = "8001";
|
StreamingPort = "8001";
|
||||||
WebInterfacePort = "8000";
|
WebInterfacePort = "8000";
|
||||||
WebInterfaceUsername= "";
|
WebInterfaceUsername = "";
|
||||||
WebInterfacePassword = "";
|
WebInterfacePassword = "";
|
||||||
UseSecureHTTPS = false;
|
UseSecureHTTPS = false;
|
||||||
OnlyOneBouquet = true;
|
OnlyOneBouquet = true;
|
||||||
|
|||||||
@@ -4,14 +4,14 @@
|
|||||||
<title>Vu+</title>
|
<title>Vu+</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div data-role="page" class="page type-interior pluginConfigurationPage VuPlusConfigurationPage" data-require="emby-button,emby-checkbox,emby-input">
|
<div data-role="page" id="VuPlusConfigurationPage" class="page type-interior pluginConfigurationPage VuPlusConfigurationPage" data-require="emby-button,emby-checkbox,emby-input">
|
||||||
|
|
||||||
<div data-role="content">
|
<div data-role="content">
|
||||||
<div class="content-primary">
|
<div class="content-primary">
|
||||||
|
|
||||||
<h1>VuPlus</h1>
|
<h1>VuPlus</h1>
|
||||||
|
|
||||||
<form class="VuPlusConfigurationForm">
|
<form id="VuPlusConfigurationForm" class="VuPlusConfigurationForm">
|
||||||
|
|
||||||
<div class="inputContainer">
|
<div class="inputContainer">
|
||||||
<input is="emby-input" id="txtHostName" type="text" label="Vu+ hostname or ip address:" />
|
<input is="emby-input" id="txtHostName" type="text" label="Vu+ hostname or ip address:" />
|
||||||
@@ -122,81 +122,61 @@
|
|||||||
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
var VuPlusConfigurationPage = {
|
var VuPlusConfigurationPage = {
|
||||||
pluginUniqueId: "9564ac10-af23-39bc-449f-624f23cfa48f"
|
pluginUniqueId: "9564ac10-af23-39bc-449f-624f23cfa48f",
|
||||||
};
|
|
||||||
|
|
||||||
$('.VuPlusConfigurationPage').on('pageshow', function (event) {
|
loadConfiguration: function () {
|
||||||
|
Dashboard.showLoadingMsg();
|
||||||
|
|
||||||
Dashboard.showLoadingMsg();
|
ApiClient.getPluginConfiguration(VuPlusConfigurationPage.pluginUniqueId).then(function (config) {
|
||||||
|
document.getElementById('txtHostName').value = config.HostName || "";
|
||||||
|
document.getElementById('txtStreamingPort').value = config.StreamingPort || "";
|
||||||
|
document.getElementById('txtWebInterfacePort').value = config.WebInterfacePort || "";
|
||||||
|
document.getElementById('txtWebInterfaceUsername').value = config.WebInterfaceUsername || "";
|
||||||
|
document.getElementById('txtWebInterfacePassword').value = config.WebInterfacePassword || "";
|
||||||
|
document.getElementById('chkUseSecureHTTPS').checked = config.UseSecureHTTPS || false;
|
||||||
|
document.getElementById('chkOnlyOneBouquet').checked = config.OnlyOneBouquet || false;
|
||||||
|
document.getElementById('txtTVBouquet').value = config.TVBouquet || "";
|
||||||
|
document.getElementById('chkZapToChannel').checked = config.ZapToChannel || false;
|
||||||
|
document.getElementById('chkFetchPiconsFromWebInterface').checked = config.FetchPiconsFromWebInterface || false;
|
||||||
|
document.getElementById('txtPiconsPath').value = config.PiconsPath || "";
|
||||||
|
document.getElementById('txtRecordingPath').value = config.RecordingPath || "";
|
||||||
|
document.getElementById('chkDebugLogging').checked = config.EnableDebugLogging || false;
|
||||||
|
|
||||||
var page = this;
|
Dashboard.hideLoadingMsg();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
ApiClient.getPluginConfiguration(VuPlusConfigurationPage.pluginUniqueId).then(function (config) {
|
saveConfiguration: function () {
|
||||||
|
Dashboard.showLoadingMsg();
|
||||||
|
|
||||||
$('#txtHostName', page).val(config.HostName || "");
|
ApiClient.getPluginConfiguration(VuPlusConfigurationPage.pluginUniqueId).then(function (config) {
|
||||||
$('#txtStreamingPort', page).val(config.StreamingPort || "");
|
config.HostName = document.getElementById('txtHostName').value;
|
||||||
$('#txtWebInterfacePort', page).val(config.WebInterfacePort || "");
|
config.StreamingPort = document.getElementById('txtStreamingPort').value;
|
||||||
$('#txtWebInterfaceUsername', page).val(config.WebInterfaceUsername || "");
|
config.WebInterfacePort = document.getElementById('txtWebInterfacePort').value;
|
||||||
$('#txtWebInterfacePassword', page).val(config.WebInterfacePassword || "");
|
config.WebInterfaceUsername = document.getElementById('txtWebInterfaceUsername').value;
|
||||||
$('#chkUseSecureHTTPS', page).checked(config.UseSecureHTTPS || false).checkboxradio("refresh");
|
config.WebInterfacePassword = document.getElementById('txtWebInterfacePassword').value;
|
||||||
$('#chkOnlyOneBouquet', page).checked(config.OnlyOneBouquet || false).checkboxradio("refresh");
|
config.UseSecureHTTPS = document.getElementById('chkUseSecureHTTPS').checked;
|
||||||
$('#txtTVBouquet', page).val(config.TVBouquet || "");
|
config.OnlyOneBouquet = document.getElementById('chkOnlyOneBouquet').checked;
|
||||||
$('#chkZapToChannel', page).checked(config.ZapToChannel || false).checkboxradio("refresh");
|
config.TVBouquet = document.getElementById('txtTVBouquet').value;
|
||||||
$('#chkFetchPiconsFromWebInterface', page).checked(config.FetchPiconsFromWebInterface || false).checkboxradio("refresh");
|
config.ZapToChannel = document.getElementById('chkZapToChannel').checked;
|
||||||
$('#txtPiconsPath', page).val(config.PiconsPath || "");
|
config.FetchPiconsFromWebInterface = document.getElementById('chkFetchPiconsFromWebInterface').checked;
|
||||||
|
config.PiconsPath = document.getElementById('txtPiconsPath').value;
|
||||||
|
config.RecordingPath = document.getElementById('txtRecordingPath').value;
|
||||||
|
config.EnableDebugLogging = document.getElementById('chkDebugLogging').checked;
|
||||||
|
|
||||||
$('#txtRecordingPath', page).val(config.RecordingPath || "");
|
ApiClient.updatePluginConfiguration(VuPlusConfigurationPage.pluginUniqueId, config).then(Dashboard.processPluginConfigurationUpdateResult);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$('#chkDebugLogging', page).checked(config.EnableDebugLogging || false).checkboxradio("refresh");
|
document.getElementById('VuPlusConfigurationPage').addEventListener('pageshow', function () {
|
||||||
|
VuPlusConfigurationPage.loadConfiguration();
|
||||||
Dashboard.hideLoadingMsg();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.VuPlusConfigurationForm').on('submit', function (e) {
|
document.getElementById('VuPlusConfigurationForm').addEventListener('submit', function (e) {
|
||||||
|
e.preventDefault();
|
||||||
Dashboard.showLoadingMsg();
|
VuPlusConfigurationPage.saveConfiguration();
|
||||||
|
|
||||||
var form = this;
|
|
||||||
|
|
||||||
ApiClient.getPluginConfiguration(VuPlusConfigurationPage.pluginUniqueId).then(function (config) {
|
|
||||||
|
|
||||||
//reset TV bouquet reference if TV Bouquet changed
|
|
||||||
//if (config.TVBouquet != $('#txtTVBouquet', form).val()) {
|
|
||||||
// config.tvBouquetSRef = '';
|
|
||||||
//}
|
|
||||||
|
|
||||||
//reset TV bouquet reference if Only 1 Bouquet not set
|
|
||||||
//if ($('#chkOnlyOneBouquet', form).checked()) {
|
|
||||||
//}
|
|
||||||
//else
|
|
||||||
//{
|
|
||||||
// config.tvBouquetSRef = '';
|
|
||||||
//}
|
|
||||||
|
|
||||||
config.HostName = $('#txtHostName', form).val();
|
|
||||||
config.StreamingPort = $('#txtStreamingPort', form).val();
|
|
||||||
config.WebInterfacePort = $('#txtWebInterfacePort', form).val();
|
|
||||||
config.WebInterfaceUsername = $('#txtWebInterfaceUsername', form).val();
|
|
||||||
config.WebInterfacePassword = $('#txtWebInterfacePassword', form).val();
|
|
||||||
config.UseSecureHTTPS = $('#chkUseSecureHTTPS', form).checked();
|
|
||||||
config.OnlyOneBouquet = $('#chkOnlyOneBouquet', form).checked();
|
|
||||||
config.TVBouquet = $('#txtTVBouquet', form).val();
|
|
||||||
config.ZapToChannel = $('#chkZapToChannel', form).checked();
|
|
||||||
config.FetchPiconsFromWebInterface = $('#chkFetchPiconsFromWebInterface', form).checked();
|
|
||||||
config.PiconsPath = $('#txtPiconsPath', form).val();
|
|
||||||
|
|
||||||
config.RecordingPath = $('#txtRecordingPath', form).val();
|
|
||||||
|
|
||||||
config.EnableDebugLogging = $('#chkDebugLogging', form).checked();
|
|
||||||
|
|
||||||
ApiClient.updatePluginConfiguration(VuPlusConfigurationPage.pluginUniqueId, config).then(Dashboard.processPluginConfigurationUpdateResult);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Disable default form submission
|
|
||||||
return false;
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using MediaBrowser.Model.LiveTv;
|
|
||||||
using System;
|
using System;
|
||||||
|
using MediaBrowser.Model.LiveTv;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace MediaBrowser.Plugins.VuPlus.Helpers
|
namespace MediaBrowser.Plugins.VuPlus.Helpers
|
||||||
@@ -8,7 +8,7 @@ namespace MediaBrowser.Plugins.VuPlus.Helpers
|
|||||||
{
|
{
|
||||||
public static ChannelType GetChannelType(string channelType)
|
public static ChannelType GetChannelType(string channelType)
|
||||||
{
|
{
|
||||||
ChannelType type = new ChannelType();
|
var type = new ChannelType();
|
||||||
|
|
||||||
if (channelType == "0x1")
|
if (channelType == "0x1")
|
||||||
{
|
{
|
||||||
@@ -28,7 +28,7 @@ namespace MediaBrowser.Plugins.VuPlus.Helpers
|
|||||||
public static void DebugInformation(ILogger<LiveTvService> logger, string message)
|
public static void DebugInformation(ILogger<LiveTvService> logger, string message)
|
||||||
{
|
{
|
||||||
var config = Plugin.Instance.Configuration;
|
var config = Plugin.Instance.Configuration;
|
||||||
bool enableDebugLogging = config.EnableDebugLogging;
|
var enableDebugLogging = config.EnableDebugLogging;
|
||||||
|
|
||||||
if (enableDebugLogging)
|
if (enableDebugLogging)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using System.Xml;
|
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 MediaBrowser.Model.LiveTv;
|
||||||
using System.Net;
|
using MediaBrowser.Model.MediaInfo;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Plugins.VuPlus.Helpers;
|
||||||
using MediaBrowser.Common.Plugins;
|
using Microsoft.Extensions.Logging;
|
||||||
using MediaBrowser.Model.ApiClient;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Plugins.VuPlus
|
namespace MediaBrowser.Plugins.VuPlus
|
||||||
{
|
{
|
||||||
@@ -34,21 +27,22 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class LiveTvService : ILiveTvService
|
public class LiveTvService : ILiveTvService
|
||||||
{
|
{
|
||||||
private readonly IHttpClient _httpClient;
|
|
||||||
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
||||||
private readonly ILogger<LiveTvService> _logger;
|
private readonly ILogger<LiveTvService> _logger;
|
||||||
private int _liveStreams;
|
private int _liveStreams;
|
||||||
private readonly Dictionary<int, int> _heartBeat = new Dictionary<int, int>();
|
private readonly Dictionary<int, int> _heartBeat = new Dictionary<int, int>();
|
||||||
|
|
||||||
private String tvBouquetSRef;
|
private string tvBouquetSRef;
|
||||||
List<ChannelInfo> tvChannelInfos = new List<ChannelInfo>();
|
private List<ChannelInfo> tvChannelInfos = new List<ChannelInfo>();
|
||||||
|
|
||||||
public DateTime LastRecordingChange = DateTime.MinValue;
|
public DateTime LastRecordingChange = DateTime.MinValue;
|
||||||
|
|
||||||
public LiveTvService(IHttpClient httpClient, IJsonSerializer jsonSerializer, ILogger<LiveTvService> logger)
|
private readonly HttpClient _httpClient;
|
||||||
|
|
||||||
|
public LiveTvService(ILogger<LiveTvService> logger, IHttpClientFactory httpClientFactory)
|
||||||
{
|
{
|
||||||
_httpClient = httpClient;
|
|
||||||
_logger = logger;
|
_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 StreamingPort: {0}", config.StreamingPort));
|
||||||
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfacePort: {0}", config.WebInterfacePort));
|
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfacePort: {0}", config.WebInterfacePort));
|
||||||
if (string.IsNullOrEmpty(config.WebInterfaceUsername))
|
if (string.IsNullOrEmpty(config.WebInterfaceUsername))
|
||||||
|
{
|
||||||
_logger.LogInformation("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: ");
|
_logger.LogInformation("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: ");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: {0}", "********"));
|
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: {0}", "********"));
|
||||||
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(config.WebInterfacePassword))
|
if (string.IsNullOrEmpty(config.WebInterfacePassword))
|
||||||
|
{
|
||||||
_logger.LogInformation("[VuPlus] EnsureConnectionAsync WebInterfacePassword: ");
|
_logger.LogInformation("[VuPlus] EnsureConnectionAsync WebInterfacePassword: ");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: {0}", "********"));
|
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync WebInterfaceUsername: {0}", "********"));
|
||||||
|
}
|
||||||
|
|
||||||
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync UseSecureHTTPS: {0}", config.UseSecureHTTPS));
|
_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 OnlyOneBouquet: {0}", config.OnlyOneBouquet));
|
||||||
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync TVBouquet: {0}", config.TVBouquet));
|
_logger.LogInformation(string.Format("[VuPlus] EnsureConnectionAsync TVBouquet: {0}", config.TVBouquet));
|
||||||
@@ -131,11 +135,31 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// connect to VuPlus box to test connectivity.
|
// 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;
|
tvBouquetSRef = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates HttpClient for connection to Enigma2
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="httpClientFactory"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks connection to VuPlus and retrieves service reference for channel if only one bouquet.
|
/// Checks connection to VuPlus and retrieves service reference for channel if only one bouquet.
|
||||||
@@ -143,38 +167,27 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <param name="tvBouquet">The TV Bouquet.</param>
|
/// <param name="tvBouquet">The TV Bouquet.</param>
|
||||||
/// <returns>Task{String>}.</returns>
|
/// <returns>Task{String>}.</returns>
|
||||||
public async Task<String> InitiateSession(CancellationToken cancellationToken, String tvBouquet)
|
public async Task<string> InitiateSession(CancellationToken cancellationToken, string tvBouquet)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("[VuPlus] Start InitiateSession, validates connection and returns Bouquet reference if required");
|
_logger.LogInformation("[VuPlus] Start InitiateSession, validates connection and returns Bouquet reference if required");
|
||||||
//await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
//await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
||||||
|
|
||||||
var url = string.Format("{0}/web/getservices", baseUrl);
|
var url = string.Format("{0}/web/getservices", baseUrl);
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] InitiateSession url: {0}", url));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] InitiateSession response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] InitiateSession response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -182,9 +195,9 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
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 TV Bouquet passed find associated service reference
|
||||||
if (!string.IsNullOrEmpty(tvBouquet))
|
if (!string.IsNullOrEmpty(tvBouquet))
|
||||||
@@ -246,7 +259,9 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
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));
|
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))
|
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;
|
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));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelsAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -293,14 +297,14 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
List<ChannelInfo> channelInfos = new List<ChannelInfo>();
|
var channelInfos = new List<ChannelInfo>();
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(tvBouquetSRef))
|
if (string.IsNullOrEmpty(tvBouquetSRef))
|
||||||
{
|
{
|
||||||
// Load channels from all TV Bouquets
|
// Load channels from all TV Bouquets
|
||||||
_logger.LogInformation("[VuPlus] GetChannelsAsync for 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)
|
foreach (XmlNode xmlNode in e2services)
|
||||||
{
|
{
|
||||||
var channelInfo = new ChannelInfo();
|
var channelInfo = new ChannelInfo();
|
||||||
@@ -320,7 +324,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get all channels for TV Bouquet
|
// get all channels for TV Bouquet
|
||||||
List<ChannelInfo> channelInfosForBouquet = await GetChannelsForTVBouquetAsync(cancellationToken, e2servicereference).ConfigureAwait(false);
|
var channelInfosForBouquet = await GetChannelsForTVBouquetAsync(cancellationToken, e2servicereference).ConfigureAwait(false);
|
||||||
|
|
||||||
// store all channels for TV Bouquet
|
// store all channels for TV Bouquet
|
||||||
channelInfos.AddRange(channelInfosForBouquet);
|
channelInfos.AddRange(channelInfosForBouquet);
|
||||||
@@ -331,9 +335,9 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Load channels for specified TV Bouquet only
|
// 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)
|
foreach (XmlNode xmlNode in e2services)
|
||||||
{
|
{
|
||||||
var channelInfo = new ChannelInfo();
|
var channelInfo = new ChannelInfo();
|
||||||
@@ -358,9 +362,13 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
{
|
{
|
||||||
//check for radio channel
|
//check for radio channel
|
||||||
if (e2servicereference.ToUpper().Contains("RADIO"))
|
if (e2servicereference.ToUpper().Contains("RADIO"))
|
||||||
|
{
|
||||||
channelInfo.ChannelType = ChannelType.Radio;
|
channelInfo.ChannelType = ChannelType.Radio;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
channelInfo.ChannelType = ChannelType.TV;
|
channelInfo.ChannelType = ChannelType.TV;
|
||||||
|
}
|
||||||
|
|
||||||
channelInfo.HasImage = true;
|
channelInfo.HasImage = true;
|
||||||
channelInfo.Id = e2servicereference;
|
channelInfo.Id = e2servicereference;
|
||||||
@@ -414,15 +422,18 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
/// Gets the channels async.
|
/// Gets the channels async.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <param name="sRef">Service reference</param>
|
||||||
/// <returns>Task{List<ChannelInfo>}.</returns>
|
/// <returns>Task{List<ChannelInfo>}.</returns>
|
||||||
public async Task<List<ChannelInfo>> GetChannelsForTVBouquetAsync(CancellationToken cancellationToken, String sRef)
|
public async Task<List<ChannelInfo>> GetChannelsForTVBouquetAsync(CancellationToken cancellationToken, string sRef)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("[VuPlus] Start GetChannelsForTVBouquetAsync, retrieve all channels for TV Bouquet " + sRef);
|
_logger.LogInformation("[VuPlus] Start GetChannelsForTVBouquetAsync, retrieve all channels for TV Bouquet " + sRef);
|
||||||
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
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));
|
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))
|
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;
|
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));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelsForTVBouquetAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -461,13 +460,13 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
List<ChannelInfo> channelInfos = new List<ChannelInfo>();
|
var channelInfos = new List<ChannelInfo>();
|
||||||
|
|
||||||
// Load channels for specified TV Bouquet only
|
// 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)
|
foreach (XmlNode xmlNode in e2services)
|
||||||
{
|
{
|
||||||
var channelInfo = new ChannelInfo();
|
var channelInfo = new ChannelInfo();
|
||||||
@@ -492,9 +491,13 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
{
|
{
|
||||||
//check for radio channel
|
//check for radio channel
|
||||||
if (e2servicereference.Contains("radio"))
|
if (e2servicereference.Contains("radio"))
|
||||||
|
{
|
||||||
channelInfo.ChannelType = ChannelType.Radio;
|
channelInfo.ChannelType = ChannelType.Radio;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
channelInfo.ChannelType = ChannelType.TV;
|
channelInfo.ChannelType = ChannelType.TV;
|
||||||
|
}
|
||||||
|
|
||||||
channelInfo.HasImage = true;
|
channelInfo.HasImage = true;
|
||||||
channelInfo.Id = e2servicereference;
|
channelInfo.Id = e2servicereference;
|
||||||
@@ -522,7 +525,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
channelInfo.Number = count.ToString();
|
channelInfo.Number = count.ToString();
|
||||||
|
|
||||||
channelInfos.Add(channelInfo);
|
channelInfos.Add(channelInfo);
|
||||||
count = count + 1;
|
count++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -559,31 +562,20 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
||||||
|
|
||||||
var url = string.Format("{0}/web/movielist", baseUrl);
|
var url = string.Format("{0}/web/movielist", baseUrl);
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetRecordingsAsync url: {0}", url));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetRecordingsAsync response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetRecordingsAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -591,11 +583,11 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
List<MyRecordingInfo> recordingInfos = new List<MyRecordingInfo>();
|
var recordingInfos = new List<MyRecordingInfo>();
|
||||||
|
|
||||||
int count = 1;
|
var count = 1;
|
||||||
|
|
||||||
XmlNodeList e2movie = xml.GetElementsByTagName("e2movie");
|
var e2movie = xml.GetElementsByTagName("e2movie");
|
||||||
|
|
||||||
foreach (XmlNode xmlNode in e2movie)
|
foreach (XmlNode xmlNode in e2movie)
|
||||||
{
|
{
|
||||||
@@ -646,14 +638,19 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
recordingInfo.ChannelId = null;
|
recordingInfo.ChannelId = null;
|
||||||
//check for radio channel
|
//check for radio channel
|
||||||
if (e2servicereference.ToUpper().Contains("RADIO"))
|
if (e2servicereference.ToUpper().Contains("RADIO"))
|
||||||
|
{
|
||||||
recordingInfo.ChannelType = ChannelType.Radio;
|
recordingInfo.ChannelType = ChannelType.Radio;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
recordingInfo.ChannelType = ChannelType.TV;
|
recordingInfo.ChannelType = ChannelType.TV;
|
||||||
|
}
|
||||||
|
|
||||||
recordingInfo.HasImage = false;
|
recordingInfo.HasImage = false;
|
||||||
recordingInfo.ImagePath = null;
|
recordingInfo.ImagePath = null;
|
||||||
recordingInfo.ImageUrl = null;
|
recordingInfo.ImageUrl = null;
|
||||||
|
|
||||||
foreach (ChannelInfo channelInfo in tvChannelInfos)
|
foreach (var channelInfo in tvChannelInfos)
|
||||||
{
|
{
|
||||||
if (channelInfo.Name == e2servicename)
|
if (channelInfo.Name == e2servicename)
|
||||||
{
|
{
|
||||||
@@ -674,16 +671,16 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
recordingInfo.CommunityRating = 0;
|
recordingInfo.CommunityRating = 0;
|
||||||
|
|
||||||
long sdated = Int64.Parse(e2time);
|
var sdated = long.Parse(e2time);
|
||||||
DateTime sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated);
|
var sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated);
|
||||||
recordingInfo.StartDate = sdate.ToUniversalTime();
|
recordingInfo.StartDate = sdate.ToUniversalTime();
|
||||||
|
|
||||||
//length in format mm:ss
|
//length in format mm:ss
|
||||||
string[] words = e2length.Split(':');
|
var words = e2length.Split(':');
|
||||||
long mins = Int64.Parse(words[0]);
|
var mins = long.Parse(words[0]);
|
||||||
long seconds = Int64.Parse(words[1]);
|
var seconds = long.Parse(words[1]);
|
||||||
long edated = Int64.Parse(e2time) + (mins * 60) + (seconds);
|
var edated = long.Parse(e2time) + (mins * 60) + (seconds);
|
||||||
DateTime edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated);
|
var edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated);
|
||||||
recordingInfo.EndDate = edate.ToUniversalTime();
|
recordingInfo.EndDate = edate.ToUniversalTime();
|
||||||
|
|
||||||
//recordingInfo.EpisodeTitle = e2title;
|
//recordingInfo.EpisodeTitle = e2title;
|
||||||
@@ -691,8 +688,10 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
recordingInfo.Overview = e2description;
|
recordingInfo.Overview = e2description;
|
||||||
|
|
||||||
List<String> genre = new List<String>();
|
var genre = new List<string>
|
||||||
genre.Add("Unknown");
|
{
|
||||||
|
"Unknown"
|
||||||
|
};
|
||||||
recordingInfo.Genres = genre;
|
recordingInfo.Genres = genre;
|
||||||
|
|
||||||
recordingInfo.Id = e2servicereference;
|
recordingInfo.Id = e2servicereference;
|
||||||
@@ -742,31 +741,20 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
||||||
|
|
||||||
var url = string.Format("{0}/web/moviedelete?sRef={1}", baseUrl, recordingId);
|
var url = string.Format("{0}/web/moviedelete?sRef={1}", baseUrl, recordingId);
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] DeleteRecordingAsync url: {0}", url));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] DeleteRecordingAsync response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] DeleteRecordingAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -774,7 +762,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
||||||
foreach (XmlNode xmlNode in e2simplexmlresult)
|
foreach (XmlNode xmlNode in e2simplexmlresult)
|
||||||
{
|
{
|
||||||
var recordingInfo = new RecordingInfo();
|
var recordingInfo = new RecordingInfo();
|
||||||
@@ -825,7 +813,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
// extract sRef, id, begin and end from passed timerId
|
// extract sRef, id, begin and end from passed timerId
|
||||||
string[] words = timerId.Split('~');
|
var words = timerId.Split('~');
|
||||||
var sRef = words[0];
|
var sRef = words[0];
|
||||||
var id = words[1];
|
var id = words[1];
|
||||||
var begin = words[2];
|
var begin = words[2];
|
||||||
@@ -833,31 +821,20 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
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);
|
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));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CancelTimerAsync response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CancelTimerAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -865,7 +842,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
||||||
foreach (XmlNode xmlNode in e2simplexmlresult)
|
foreach (XmlNode xmlNode in e2simplexmlresult)
|
||||||
{
|
{
|
||||||
var recordingInfo = new RecordingInfo();
|
var recordingInfo = new RecordingInfo();
|
||||||
@@ -916,12 +893,14 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
// extract eventid from info.ProgramId
|
// extract eventid from info.ProgramId
|
||||||
string[] words = info.ProgramId.Split('~');
|
var words = info.ProgramId.Split('~');
|
||||||
var eventid = words[1];
|
var eventid = words[1];
|
||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
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));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CancelTimerAsync response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] CancelTimerAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -959,7 +925,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
||||||
foreach (XmlNode xmlNode in e2simplexmlresult)
|
foreach (XmlNode xmlNode in e2simplexmlresult)
|
||||||
{
|
{
|
||||||
var recordingInfo = new RecordingInfo();
|
var recordingInfo = new RecordingInfo();
|
||||||
@@ -1010,31 +976,20 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
||||||
|
|
||||||
var url = string.Format("{0}/web/timerlist", baseUrl);
|
var url = string.Format("{0}/web/timerlist", baseUrl);
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetTimersAsync url: {0}", url));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetTimersAsync response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetTimersAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -1042,11 +997,11 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
List<TimerInfo> timerInfos = new List<TimerInfo>();
|
var timerInfos = new List<TimerInfo>();
|
||||||
|
|
||||||
int count = 1;
|
var count = 1;
|
||||||
|
|
||||||
XmlNodeList e2timer = xml.GetElementsByTagName("e2timer");
|
var e2timer = xml.GetElementsByTagName("e2timer");
|
||||||
foreach (XmlNode xmlNode in e2timer)
|
foreach (XmlNode xmlNode in e2timer)
|
||||||
{
|
{
|
||||||
var timerInfo = new TimerInfo();
|
var timerInfo = new TimerInfo();
|
||||||
@@ -1097,8 +1052,8 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
timerInfo.ChannelId = e2servicereference;
|
timerInfo.ChannelId = e2servicereference;
|
||||||
|
|
||||||
long edated = Int64.Parse(e2timeend);
|
var edated = long.Parse(e2timeend);
|
||||||
DateTime edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated);
|
var edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated);
|
||||||
timerInfo.EndDate = edate.ToUniversalTime();
|
timerInfo.EndDate = edate.ToUniversalTime();
|
||||||
|
|
||||||
timerInfo.Id = e2servicereference + "~" + e2eit + "~" + e2timebegin + "~" + e2timeend + "~" + count;
|
timerInfo.Id = e2servicereference + "~" + e2eit + "~" + e2timebegin + "~" + e2timeend + "~" + count;
|
||||||
@@ -1113,14 +1068,19 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
timerInfo.ProgramId = null;
|
timerInfo.ProgramId = null;
|
||||||
timerInfo.SeriesTimerId = null;
|
timerInfo.SeriesTimerId = null;
|
||||||
|
|
||||||
long sdated = Int64.Parse(e2timebegin);
|
var sdated = long.Parse(e2timebegin);
|
||||||
DateTime sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated);
|
var sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated);
|
||||||
timerInfo.StartDate = sdate.ToUniversalTime();
|
timerInfo.StartDate = sdate.ToUniversalTime();
|
||||||
|
|
||||||
if (e2state == "0")
|
if (e2state == "0")
|
||||||
|
{
|
||||||
timerInfo.Status = RecordingStatus.New;
|
timerInfo.Status = RecordingStatus.New;
|
||||||
|
}
|
||||||
|
|
||||||
if (e2state == "2")
|
if (e2state == "2")
|
||||||
|
{
|
||||||
timerInfo.Status = RecordingStatus.InProgress;
|
timerInfo.Status = RecordingStatus.InProgress;
|
||||||
|
}
|
||||||
|
|
||||||
timerInfos.Add(timerInfo);
|
timerInfos.Add(timerInfo);
|
||||||
count = count + 1;
|
count = count + 1;
|
||||||
@@ -1163,7 +1123,9 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.StreamingPort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.StreamingPort;
|
||||||
|
|
||||||
@@ -1174,7 +1136,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
}
|
}
|
||||||
|
|
||||||
_liveStreams++;
|
_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));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetChannelStream url: {0}", streamUrl));
|
||||||
|
|
||||||
return new MediaSourceInfo
|
return new MediaSourceInfo
|
||||||
@@ -1212,38 +1174,27 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
/// <param name="cancellationToken">The CancellationToken</param>
|
/// <param name="cancellationToken">The CancellationToken</param>
|
||||||
/// <param name="channelOid">The channel id</param>
|
/// <param name="channelOid">The channel id</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task ZapToChannel(CancellationToken cancellationToken, String channelOid)
|
public async Task ZapToChannel(CancellationToken cancellationToken, string channelOid)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("[VuPlus] Start ZapToChannel");
|
_logger.LogInformation("[VuPlus] Start ZapToChannel");
|
||||||
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
||||||
|
|
||||||
var url = string.Format("{0}/web/zap?sRef={1}", baseUrl, channelOid);
|
var url = string.Format("{0}/web/zap?sRef={1}", baseUrl, channelOid);
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] ZapToChannel url: {0}", url));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] ZapToChannel response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] ZapToChannel response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -1251,7 +1202,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
XmlNodeList e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
var e2simplexmlresult = xml.GetElementsByTagName("e2simplexmlresult");
|
||||||
foreach (XmlNode xmlNode in e2simplexmlresult)
|
foreach (XmlNode xmlNode in e2simplexmlresult)
|
||||||
{
|
{
|
||||||
var recordingInfo = new RecordingInfo();
|
var recordingInfo = new RecordingInfo();
|
||||||
@@ -1302,7 +1253,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
{
|
{
|
||||||
_logger.LogInformation("[VuPlus] Start GetNewTimerDefaultsAsync");
|
_logger.LogInformation("[VuPlus] Start GetNewTimerDefaultsAsync");
|
||||||
|
|
||||||
SeriesTimerInfo seriesTimerInfo = new SeriesTimerInfo();
|
var seriesTimerInfo = new SeriesTimerInfo();
|
||||||
|
|
||||||
return seriesTimerInfo;
|
return seriesTimerInfo;
|
||||||
}
|
}
|
||||||
@@ -1321,38 +1272,27 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
_logger.LogInformation("[VuPlus] Start GetProgramsAsync");
|
_logger.LogInformation("[VuPlus] Start GetProgramsAsync");
|
||||||
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
await EnsureConnectionAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
Random rnd = new Random();
|
var rnd = new Random();
|
||||||
|
|
||||||
var imagePath = "";
|
var imagePath = "";
|
||||||
var imageUrl = "";
|
var imageUrl = "";
|
||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
||||||
|
|
||||||
var url = string.Format("{0}/web/epgservice?sRef={1}", baseUrl, channelId);
|
var url = string.Format("{0}/web/epgservice?sRef={1}", baseUrl, channelId);
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetProgramsAsync url: {0}", url));
|
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,
|
using (var reader = new StreamReader(stream))
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetProgramsAsync response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetProgramsAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -1360,11 +1300,11 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
List<ProgramInfo> programInfos = new List<ProgramInfo>();
|
var programInfos = new List<ProgramInfo>();
|
||||||
|
|
||||||
int count = 1;
|
var count = 1;
|
||||||
|
|
||||||
XmlNodeList e2event = xml.GetElementsByTagName("e2event");
|
var e2event = xml.GetElementsByTagName("e2event");
|
||||||
foreach (XmlNode xmlNode in e2event)
|
foreach (XmlNode xmlNode in e2event)
|
||||||
{
|
{
|
||||||
var programInfo = new ProgramInfo();
|
var programInfo = new ProgramInfo();
|
||||||
@@ -1419,8 +1359,8 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long sdated = Int64.Parse(e2eventstart);
|
var sdated = long.Parse(e2eventstart);
|
||||||
DateTime sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated);
|
var sdate = ApiHelper.DateTimeFromUnixTimestampSeconds(sdated);
|
||||||
|
|
||||||
// Check whether the current element is within the time range passed
|
// Check whether the current element is within the time range passed
|
||||||
if (sdate > endDateUtc)
|
if (sdate > endDateUtc)
|
||||||
@@ -1436,7 +1376,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
//programInfo.ImageUrl = null;
|
//programInfo.ImageUrl = null;
|
||||||
if (count == 1)
|
if (count == 1)
|
||||||
{
|
{
|
||||||
foreach (ChannelInfo channelInfo in tvChannelInfos)
|
foreach (var channelInfo in tvChannelInfos)
|
||||||
{
|
{
|
||||||
if (channelInfo.Name == e2eventservicename)
|
if (channelInfo.Name == e2eventservicename)
|
||||||
{
|
{
|
||||||
@@ -1462,14 +1402,16 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
programInfo.Overview = e2eventdescriptionextended;
|
programInfo.Overview = e2eventdescriptionextended;
|
||||||
|
|
||||||
long edated = Int64.Parse(e2eventstart) + Int64.Parse(e2eventduration);
|
var edated = long.Parse(e2eventstart) + long.Parse(e2eventduration);
|
||||||
DateTime edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated);
|
var edate = ApiHelper.DateTimeFromUnixTimestampSeconds(edated);
|
||||||
|
|
||||||
programInfo.StartDate = sdate.ToUniversalTime();
|
programInfo.StartDate = sdate.ToUniversalTime();
|
||||||
programInfo.EndDate = edate.ToUniversalTime();
|
programInfo.EndDate = edate.ToUniversalTime();
|
||||||
|
|
||||||
List<String> genre = new List<String>();
|
var genre = new List<string>
|
||||||
genre.Add("Unknown");
|
{
|
||||||
|
"Unknown"
|
||||||
|
};
|
||||||
programInfo.Genres = genre;
|
programInfo.Genres = genre;
|
||||||
|
|
||||||
//programInfo.OriginalAirDate = null;
|
//programInfo.OriginalAirDate = null;
|
||||||
@@ -1515,38 +1457,27 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
|
|
||||||
//TODO: Version check
|
//TODO: Version check
|
||||||
|
|
||||||
bool upgradeAvailable = false;
|
var upgradeAvailable = false;
|
||||||
string serverVersion = "Unknown";
|
var serverVersion = "Unknown";
|
||||||
|
|
||||||
var protocol = "http";
|
var protocol = "http";
|
||||||
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
if (Plugin.Instance.Configuration.UseSecureHTTPS)
|
||||||
|
{
|
||||||
protocol = "https";
|
protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
var baseUrl = protocol + "://" + Plugin.Instance.Configuration.HostName + ":" + Plugin.Instance.Configuration.WebInterfacePort;
|
||||||
|
|
||||||
var url = string.Format("{0}/web/deviceinfo", baseUrl);
|
var url = string.Format("{0}/web/deviceinfo", baseUrl);
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetStatusInfoAsync url: {0}", url));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetStatusInfoAsync url: {0}", url));
|
||||||
|
|
||||||
var options = new HttpRequestOptions()
|
var liveTvTunerInfos = new List<LiveTvTunerInfo>();
|
||||||
{
|
|
||||||
CancellationToken = cancellationToken,
|
|
||||||
Url = url
|
|
||||||
};
|
|
||||||
|
|
||||||
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;
|
using (var reader = new StreamReader(stream))
|
||||||
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
|
|
||||||
options.RequestHeaders["Authorization"] = "Basic " + authInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<LiveTvTunerInfo> liveTvTunerInfos = new List<LiveTvTunerInfo>();
|
|
||||||
|
|
||||||
using (var stream = await _httpClient.Get(options).ConfigureAwait(false))
|
|
||||||
{
|
|
||||||
using (StreamReader reader = new StreamReader(stream))
|
|
||||||
{
|
{
|
||||||
string xmlResponse = reader.ReadToEnd();
|
var xmlResponse = reader.ReadToEnd();
|
||||||
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetStatusInfoAsync response: {0}", xmlResponse));
|
UtilsHelper.DebugInformation(_logger, string.Format("[VuPlus] GetStatusInfoAsync response: {0}", xmlResponse));
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -1554,7 +1485,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
var xml = new XmlDocument();
|
var xml = new XmlDocument();
|
||||||
xml.LoadXml(xmlResponse);
|
xml.LoadXml(xmlResponse);
|
||||||
|
|
||||||
XmlNodeList e2frontend = xml.GetElementsByTagName("e2frontend");
|
var e2frontend = xml.GetElementsByTagName("e2frontend");
|
||||||
foreach (XmlNode xmlNode in e2frontend)
|
foreach (XmlNode xmlNode in e2frontend)
|
||||||
{
|
{
|
||||||
var liveTvTunerInfo = new LiveTvTunerInfo();
|
var liveTvTunerInfo = new LiveTvTunerInfo();
|
||||||
@@ -1605,20 +1536,14 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
/// Gets the homepage url.
|
/// Gets the homepage url.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The homepage url.</value>
|
/// <value>The homepage url.</value>
|
||||||
public string HomePageUrl
|
public string HomePageUrl => "http://www.VuPlus.com/";
|
||||||
{
|
|
||||||
get { return "http://www.VuPlus.com/"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the name.
|
/// Gets the name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The name.</value>
|
/// <value>The name.</value>
|
||||||
public string Name
|
public string Name => "VuPlus";
|
||||||
{
|
|
||||||
get { return "VuPlus"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<MediaSourceInfo> GetRecordingStream(string recordingId, string mediaSourceId, CancellationToken cancellationToken)
|
public async Task<MediaSourceInfo> GetRecordingStream(string recordingId, string mediaSourceId, CancellationToken cancellationToken)
|
||||||
@@ -1636,7 +1561,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
public async Task CopyFilesAsync(StreamReader source, StreamWriter destination)
|
public async Task CopyFilesAsync(StreamReader source, StreamWriter destination)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("[VuPlus] Start CopyFiles Async");
|
_logger.LogInformation("[VuPlus] Start CopyFiles Async");
|
||||||
char[] buffer = new char[0x1000];
|
var buffer = new char[0x1000];
|
||||||
int numRead;
|
int numRead;
|
||||||
while ((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) != 0)
|
while ((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) != 0)
|
||||||
{
|
{
|
||||||
@@ -1660,7 +1585,7 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
{
|
{
|
||||||
_logger.LogInformation("[VuPlus] Start GetSeriesTimersAsync");
|
_logger.LogInformation("[VuPlus] Start GetSeriesTimersAsync");
|
||||||
|
|
||||||
List<SeriesTimerInfo> seriesTimerInfo = new List<SeriesTimerInfo>();
|
var seriesTimerInfo = new List<SeriesTimerInfo>();
|
||||||
return seriesTimerInfo;
|
return seriesTimerInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.1</TargetFrameworks>
|
<TargetFrameworks>net5.0</TargetFrameworks>
|
||||||
<AssemblyVersion>3.1.8</AssemblyVersion>
|
<AssemblyVersion>4.0.0.0</AssemblyVersion>
|
||||||
<FileVersion>3.1.8</FileVersion>
|
<FileVersion>4.0.0.0</FileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net5.0|AnyCPU'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -15,10 +20,12 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Jellyfin.Common" Version="10.6.0" />
|
<PackageReference Include="Jellyfin.Common" Version="10.7.0" />
|
||||||
<PackageReference Include="Jellyfin.Naming" Version="10.6.0" />
|
<PackageReference Include="Jellyfin.Naming" Version="10.7.0" />
|
||||||
<PackageReference Include="Jellyfin.Controller" Version="10.6.0" />
|
<PackageReference Include="Jellyfin.Controller" Version="10.7.0" />
|
||||||
<PackageReference Include="Jellyfin.Model" Version="10.6.0" />
|
<PackageReference Include="Jellyfin.Model" Version="10.7.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Http" Version="5.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -13,8 +13,10 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Plugin : BasePlugin<PluginConfiguration>, IHasWebPages
|
public class Plugin : BasePlugin<PluginConfiguration>, IHasWebPages
|
||||||
{
|
{
|
||||||
public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer)
|
public Plugin(
|
||||||
: base(applicationPaths, xmlSerializer)
|
IApplicationPaths applicationPaths,
|
||||||
|
IXmlSerializer xmlSerializer
|
||||||
|
) : base(applicationPaths, xmlSerializer)
|
||||||
{
|
{
|
||||||
Instance = this;
|
Instance = this;
|
||||||
}
|
}
|
||||||
@@ -23,28 +25,16 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
/// Gets the name of the plugin
|
/// Gets the name of the plugin
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The name.</value>
|
/// <value>The name.</value>
|
||||||
public override string Name
|
public override string Name => "VuPlus";
|
||||||
{
|
|
||||||
get { return "VuPlus"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the description.
|
/// Gets the description.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The description.</value>
|
/// <value>The description.</value>
|
||||||
public override string Description
|
public override string Description => "Provides live tv using Vu+ / Enigma2 pvr as a back-end.";
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return "Provides live tv using Vu+ / Enigma2 pvr as a back-end.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Guid _id = new Guid("9564ac10-af23-39bc-449f-624f23cfa48f");
|
private Guid _id = new Guid("9564ac10-af23-39bc-449f-624f23cfa48f");
|
||||||
public override Guid Id
|
public override Guid Id => _id;
|
||||||
{
|
|
||||||
get { return _id; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the instance.
|
/// Gets the instance.
|
||||||
|
|||||||
@@ -1,20 +1,19 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
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.Common.Extensions;
|
||||||
using MediaBrowser.Model.Dto;
|
using MediaBrowser.Controller.Channels;
|
||||||
using System.Globalization;
|
|
||||||
using MediaBrowser.Controller.Entities;
|
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.LiveTv;
|
||||||
|
using MediaBrowser.Model.MediaInfo;
|
||||||
|
|
||||||
namespace MediaBrowser.Plugins.VuPlus
|
namespace MediaBrowser.Plugins.VuPlus
|
||||||
{
|
{
|
||||||
@@ -27,56 +26,27 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
_liveTvManager = liveTvManager;
|
_liveTvManager = liveTvManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Name
|
public string Name => "VuPlus Recordings";
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return "VuPlus Recordings";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string[] Attributes
|
public string[] Attributes => new[] { "Recordings" };
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new[] { "Recordings" };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Description
|
public string Description => "VuPlus Recordings";
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return "VuPlus Recordings";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string DataVersion
|
public string DataVersion => "1";
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return "1";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string HomePageUrl
|
public string HomePageUrl => null;
|
||||||
{
|
|
||||||
get { return null; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public ChannelParentalRating ParentalRating
|
public ChannelParentalRating ParentalRating => ChannelParentalRating.GeneralAudience;
|
||||||
{
|
|
||||||
get { return ChannelParentalRating.GeneralAudience; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GetCacheKey(string userId)
|
public string GetCacheKey(string userId)
|
||||||
{
|
{
|
||||||
var now = DateTime.UtcNow;
|
var now = DateTime.UtcNow;
|
||||||
|
|
||||||
var values = new List<string>();
|
var values = new List<string>
|
||||||
|
{
|
||||||
values.Add(now.DayOfYear.ToString(CultureInfo.InvariantCulture));
|
now.DayOfYear.ToString(CultureInfo.InvariantCulture),
|
||||||
values.Add(now.Hour.ToString(CultureInfo.InvariantCulture));
|
now.Hour.ToString(CultureInfo.InvariantCulture)
|
||||||
|
};
|
||||||
|
|
||||||
double minute = now.Minute;
|
double minute = now.Minute;
|
||||||
minute /= 5;
|
minute /= 5;
|
||||||
@@ -94,8 +64,8 @@ namespace MediaBrowser.Plugins.VuPlus
|
|||||||
{
|
{
|
||||||
ContentTypes = new List<ChannelMediaContentType>
|
ContentTypes = new List<ChannelMediaContentType>
|
||||||
{
|
{
|
||||||
ChannelMediaContentType.Movie,
|
ChannelMediaContentType.Movie,
|
||||||
ChannelMediaContentType.Episode,
|
ChannelMediaContentType.Episode,
|
||||||
ChannelMediaContentType.Clip
|
ChannelMediaContentType.Clip
|
||||||
},
|
},
|
||||||
MediaTypes = new List<ChannelMediaType>
|
MediaTypes = new List<ChannelMediaType>
|
||||||
|
|||||||
+6
-6
@@ -8,11 +8,13 @@ guid: "9564ac10-af23-39bc-449f-624f23cfa48f"
|
|||||||
# The version of the plugin, starting at 1. Note that the AssemblyVersion
|
# The version of the plugin, starting at 1. Note that the AssemblyVersion
|
||||||
# and FileVersion flags in the `.csproj` file must have two additional
|
# and FileVersion flags in the `.csproj` file must have two additional
|
||||||
# fiels, e.g. 1.0.0 to be built correctly.
|
# 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
|
# The supported Jellyfin version, usually the earliest binary-compatible
|
||||||
# version. Based on the Jellyfin components from NuGet.
|
# 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
|
# The owner name of the plugin, "jellyfin" for official plugins. Change
|
||||||
# to your own name if you wish to remain a 3rd-party plugin.
|
# 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
|
# A longer and more detailed description of the plugin; use multiple
|
||||||
# lines as required for readability.
|
# lines as required for readability.
|
||||||
description: >
|
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.
|
# The plugin category, in a general sense. These fields are dynamic.
|
||||||
category: "Live TV"
|
category: "Live TV"
|
||||||
@@ -41,4 +41,4 @@ artifacts:
|
|||||||
# not need to be changed usually.
|
# not need to be changed usually.
|
||||||
build_type: "dotnet"
|
build_type: "dotnet"
|
||||||
dotnet_configuration: "Release"
|
dotnet_configuration: "Release"
|
||||||
dotnet_framework: "netstandard2.1"
|
dotnet_framework: "net5.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user