#pragma warning disable CS1591 using System; using System.Globalization; using System.IO; using System.Text; using System.Threading.Tasks; using MediaBrowser.Controller; namespace MediaBrowser.WebDashboard.Api { public class PackageCreator { private readonly string _basePath; private readonly IResourceFileManager _resourceFileManager; public PackageCreator(string basePath, IResourceFileManager resourceFileManager) { _basePath = basePath; _resourceFileManager = resourceFileManager; } public async Task GetResource( string virtualPath, string mode, string localizationCulture, string appVersion) { var resourcePath = _resourceFileManager.GetResourcePath(_basePath, virtualPath); Stream resourceStream = File.OpenRead(resourcePath); if (resourceStream != null && IsCoreHtml(virtualPath)) { bool isMainIndexPage = string.Equals(virtualPath, "index.html", StringComparison.OrdinalIgnoreCase); resourceStream = await ModifyHtml(isMainIndexPage, resourceStream, mode, appVersion, localizationCulture).ConfigureAwait(false); } return resourceStream; } public static bool IsCoreHtml(string path) { if (path.IndexOf(".template.html", StringComparison.OrdinalIgnoreCase) != -1) { return false; } return string.Equals(Path.GetExtension(path), ".html", StringComparison.OrdinalIgnoreCase); } /// /// Modifies the source HTML stream by adding common meta tags, css and js. /// /// True if the stream contains content for the main index page. /// The stream whose content should be modified. /// The client mode ('cordova', 'android', etc). /// The application version. /// The localization culture. /// /// A task that represents the async operation to read and modify the input stream. /// The task result contains a stream containing the modified HTML content. /// public static async Task ModifyHtml( bool isMainIndexPage, Stream sourceStream, string mode, string appVersion, string localizationCulture) { string html; using (var reader = new StreamReader(sourceStream, Encoding.UTF8)) { html = await reader.ReadToEndAsync().ConfigureAwait(false); } if (isMainIndexPage && !string.IsNullOrWhiteSpace(localizationCulture)) { var lang = localizationCulture.Split('-')[0]; html = html.Replace("", "" + GetMetaTags(mode), StringComparison.Ordinal); } // Disable embedded scripts from plugins. We'll run them later once resources have loaded if (html.IndexOf("", "-->", StringComparison.Ordinal); } if (isMainIndexPage) { html = html.Replace("", GetCommonJavascript(mode, appVersion) + "", StringComparison.Ordinal); } var bytes = Encoding.UTF8.GetBytes(html); return new MemoryStream(bytes); } /// /// Gets the meta tags. /// /// System.String. private static string GetMetaTags(string mode) { var sb = new StringBuilder(); if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase) || string.Equals(mode, "android", StringComparison.OrdinalIgnoreCase)) { sb.Append(""); } return sb.ToString(); } /// /// Gets the common javascript. /// /// The mode. /// The version. /// System.String. private static string GetCommonJavascript(string mode, string version) { var builder = new StringBuilder(); builder.Append(""); if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase)) { builder.Append(""); } builder.Append(""); return builder.ToString(); } } }