diff options
Diffstat (limited to 'MediaBrowser.WebDashboard/Api/PackageCreator.cs')
| -rw-r--r-- | MediaBrowser.WebDashboard/Api/PackageCreator.cs | 242 |
1 files changed, 26 insertions, 216 deletions
diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs index 3108c2b9a..8b8a00a63 100644 --- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs +++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs @@ -42,12 +42,7 @@ namespace MediaBrowser.WebDashboard.Api { Stream resourceStream; - if (path.Equals("scripts/all.js", StringComparison.OrdinalIgnoreCase)) - { - resourceStream = await GetAllJavascript(mode, localizationCulture, appVersion, enableMinification).ConfigureAwait(false); - enableMinification = false; - } - else if (path.Equals("css/all.css", StringComparison.OrdinalIgnoreCase)) + if (path.Equals("css/all.css", StringComparison.OrdinalIgnoreCase)) { resourceStream = await GetAllCss(enableMinification).ConfigureAwait(false); enableMinification = false; @@ -70,14 +65,14 @@ namespace MediaBrowser.WebDashboard.Api } else if (IsFormat(path, "js")) { - if (path.IndexOf("thirdparty", StringComparison.OrdinalIgnoreCase) == -1 && path.IndexOf("bower_components", StringComparison.OrdinalIgnoreCase) == -1) + if (path.IndexOf(".min.", StringComparison.OrdinalIgnoreCase) == -1 && path.IndexOf("bower_components", StringComparison.OrdinalIgnoreCase) == -1) { resourceStream = await ModifyJs(resourceStream, enableMinification).ConfigureAwait(false); } } else if (IsFormat(path, "css")) { - if (path.IndexOf("thirdparty", StringComparison.OrdinalIgnoreCase) == -1 && path.IndexOf("bower_components", StringComparison.OrdinalIgnoreCase) == -1) + if (path.IndexOf(".min.", StringComparison.OrdinalIgnoreCase) == -1 && path.IndexOf("bower_components", StringComparison.OrdinalIgnoreCase) == -1) { resourceStream = await ModifyCss(resourceStream, enableMinification).ConfigureAwait(false); } @@ -226,11 +221,6 @@ namespace MediaBrowser.WebDashboard.Api public bool IsCoreHtml(string path) { - if (path.IndexOf("vulcanize", StringComparison.OrdinalIgnoreCase) != -1) - { - return false; - } - if (path.IndexOf(".template.html", StringComparison.OrdinalIgnoreCase) != -1) { return false; @@ -309,21 +299,9 @@ namespace MediaBrowser.WebDashboard.Api .Replace("</body>", "</div>--></div></paper-drawer-panel></body>"); } - var versionString = !string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase) ? "?v=" + appVersion : string.Empty; - - var imports = new[] - { - "vulcanize-out.html" + versionString - }; - var importsHtml = string.Join("", imports.Select(i => "<link rel=\"import\" href=\"" + i + "\">").ToArray()); - - // It would be better to make polymer completely dynamic and loaded on demand, but seeing issues with that - // In chrome it is causing the body to be hidden while loading, which leads to width-check methods to return 0 for everything - //imports = ""; - html = html.Replace("<head>", "<head>" + GetMetaTags(mode) + GetCommonCss(mode, appVersion)); - html = html.Replace("</body>", GetInitialJavascript(mode, appVersion) + importsHtml + GetCommonJavascript(mode, appVersion) + "</body>"); + html = html.Replace("</body>", GetCommonJavascript(mode, appVersion) + "</body>"); var bytes = Encoding.UTF8.GetBytes(html); @@ -333,9 +311,6 @@ namespace MediaBrowser.WebDashboard.Api private string ModifyForCordova(string html) { - // Strip everything between CORDOVA_EXCLUDE_START and CORDOVA_EXCLUDE_END - html = ReplaceBetween(html, "<!--CORDOVA_EXCLUDE_START-->", "<!--CORDOVA_EXCLUDE_END-->", string.Empty); - // Replace CORDOVA_REPLACE_SUPPORTER_SUBMIT_START html = ReplaceBetween(html, "<!--CORDOVA_REPLACE_SUPPORTER_SUBMIT_START-->", "<!--CORDOVA_REPLACE_SUPPORTER_SUBMIT_END-->", "<i class=\"fa fa-check\"></i><span>${ButtonPurchase}</span>"); @@ -379,9 +354,10 @@ namespace MediaBrowser.WebDashboard.Api if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase)) { - //sb.Append("<meta http-equiv=\"Content-Security-Policy\" content=\"default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'\">"); + sb.Append("<meta http-equiv=\"Content-Security-Policy\" content=\"default-src * 'unsafe-inline' 'unsafe-eval'\">"); } + sb.Append("<link rel=\"manifest\" href=\"manifest.json\">"); sb.Append("<meta http-equiv=\"X-UA-Compatibility\" content=\"IE=Edge\">"); sb.Append("<meta name=\"format-detection\" content=\"telephone=no\">"); sb.Append("<meta name=\"msapplication-tap-highlight\" content=\"no\">"); @@ -428,7 +404,7 @@ namespace MediaBrowser.WebDashboard.Api "css/all.css" + versionString }; - var tags = files.Select(s => string.Format("<link rel=\"stylesheet\" href=\"{0}\" />", s)).ToArray(); + var tags = files.Select(s => string.Format("<link rel=\"stylesheet\" href=\"{0}\" async />", s)).ToArray(); return string.Join(string.Empty, tags); } @@ -439,39 +415,29 @@ namespace MediaBrowser.WebDashboard.Api /// <param name="mode">The mode.</param> /// <param name="version">The version.</param> /// <returns>System.String.</returns> - private string GetInitialJavascript(string mode, string version) + private string GetCommonJavascript(string mode, string version) { var builder = new StringBuilder(); - var versionString = !string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase) ? "?v=" + version : string.Empty; - - var files = new List<string> + builder.Append("<script>"); + if (!string.IsNullOrWhiteSpace(mode)) { - "bower_components/webcomponentsjs/webcomponents-lite.js" + versionString - }; + builder.AppendFormat("window.appMode='{0}';", mode); + } - var tags = files.Select(s => string.Format("<script src=\"{0}\"></script>", s)).ToArray(); + if (!string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase)) + { + builder.AppendFormat("window.dashboardVersion='{0}';", version); + } - builder.Append(string.Join(string.Empty, tags)); - - return builder.ToString(); - } - - /// <summary> - /// Gets the common javascript. - /// </summary> - /// <param name="mode">The mode.</param> - /// <param name="version">The version.</param> - /// <returns>System.String.</returns> - private string GetCommonJavascript(string mode, string version) - { - var builder = new StringBuilder(); + builder.Append("</script>"); var versionString = !string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase) ? "?v=" + version : string.Empty; var files = new List<string> { - "scripts/all.js" + versionString + "bower_components/requirejs/require.js" + versionString, + "scripts/site.js" + versionString }; if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase)) @@ -479,168 +445,21 @@ namespace MediaBrowser.WebDashboard.Api files.Insert(0, "cordova.js"); } - var tags = files.Select(s => string.Format("<script src=\"{0}\"></script>", s)).ToArray(); - - builder.Append(string.Join(string.Empty, tags)); - - return builder.ToString(); - } - - /// <summary> - /// Gets a stream containing all concatenated javascript - /// </summary> - /// <returns>Task{Stream}.</returns> - private async Task<Stream> GetAllJavascript(string mode, string culture, string version, bool enableMinification) - { - var memoryStream = new MemoryStream(); - var newLineBytes = Encoding.UTF8.GetBytes(Environment.NewLine); - - await AppendResource(memoryStream, "bower_components/jquery/dist/jquery.min.js", newLineBytes).ConfigureAwait(false); - - //await AppendLocalization(memoryStream, culture, excludePhrases).ConfigureAwait(false); - await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false); - - if (!string.IsNullOrWhiteSpace(mode)) - { - var appModeBytes = Encoding.UTF8.GetBytes(string.Format("window.appMode='{0}';", mode)); - await memoryStream.WriteAsync(appModeBytes, 0, appModeBytes.Length).ConfigureAwait(false); - } - - // Write the version string for the dashboard comparison function - var versionString = string.Format("window.dashboardVersion='{0}';", version); - var versionBytes = Encoding.UTF8.GetBytes(versionString); - - await memoryStream.WriteAsync(versionBytes, 0, versionBytes.Length).ConfigureAwait(false); - await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false); - - var builder = new StringBuilder(); - - var commonFiles = new[] - { - "bower_components/requirejs/require.js", - "thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.js", - "thirdparty/browser.js", - "thirdparty/jquery.unveil-custom.js", - "apiclient/logger.js", - "apiclient/md5.js", - "apiclient/store.js", - "apiclient/device.js", - "apiclient/credentials.js", - "apiclient/ajax.js", - "apiclient/events.js", - "apiclient/deferred.js", - "apiclient/apiclient.js" - }.ToList(); - - commonFiles.Add("apiclient/connectionmanager.js"); - - foreach (var file in commonFiles) + var tags = files.Select(s => { - using (var fs = _fileSystem.GetFileStream(GetDashboardResourcePath(file), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) + if (s.IndexOf("require", StringComparison.OrdinalIgnoreCase) == -1) { - using (var streamReader = new StreamReader(fs)) - { - var text = await streamReader.ReadToEndAsync().ConfigureAwait(false); - builder.Append(text); - builder.Append(Environment.NewLine); - } - } - } - - foreach (var file in GetScriptFiles()) - { - var path = GetDashboardResourcePath("scripts/" + file); - - using (var fs = _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) - { - using (var streamReader = new StreamReader(fs)) - { - var text = await streamReader.ReadToEndAsync().ConfigureAwait(false); - builder.Append(text); - builder.Append(Environment.NewLine); - } - } - } - - var js = builder.ToString(); - - if (enableMinification) - { - try - { - var result = new CrockfordJsMinifier().Minify(js, false, Encoding.UTF8); - - if (result.Errors.Count > 0) - { - _logger.Error("Error minifying javascript: " + result.Errors[0].Message); - } - else - { - js = result.MinifiedContent; - } + return string.Format("<script src=\"{0}\" async></script>", s); } - catch (Exception ex) - { - _logger.ErrorException("Error minifying javascript", ex); - } - } + return string.Format("<script src=\"{0}\"></script>", s); - var bytes = Encoding.UTF8.GetBytes(js); - await memoryStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); + }).ToArray(); - memoryStream.Position = 0; - return memoryStream; - } - private IEnumerable<string> GetScriptFiles() - { - return new[] - { - "extensions.js", - "globalize.js", - "site.js", - "librarybrowser.js", - "librarylist.js", - "librarymenu.js", - "mediacontroller.js", - "backdrops.js", - "sync.js", - "playlistmanager.js", - "appsettings.js", - "mediaplayer.js", - "mediaplayer-video.js", - "alphapicker.js", - "notifications.js", - "remotecontrol.js", - "search.js", - "thememediaplayer.js" - }; - } - - /// <summary> - /// Appends the resource. - /// </summary> - /// <param name="outputStream">The output stream.</param> - /// <param name="path">The path.</param> - /// <param name="newLineBytes">The new line bytes.</param> - /// <returns>Task.</returns> - private async Task AppendResource(Stream outputStream, string path, byte[] newLineBytes) - { - path = GetDashboardResourcePath(path); - - using (var fs = _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) - { - using (var streamReader = new StreamReader(fs)) - { - var text = await streamReader.ReadToEndAsync().ConfigureAwait(false); - var bytes = Encoding.UTF8.GetBytes(text); - await outputStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); - } - } + builder.Append(string.Join(string.Empty, tags)); - await outputStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false); + return builder.ToString(); } - /// <summary> /// Gets all CSS. /// </summary> @@ -654,18 +473,9 @@ namespace MediaBrowser.WebDashboard.Api "thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.theme.css", "thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.structure.css", "css/site.css", - "css/chromecast.css", - "css/mediaplayer.css", - "css/mediaplayer-video.css", "css/librarymenu.css", "css/librarybrowser.css", "css/card.css", - "css/notifications.css", - "css/search.css", - "css/remotecontrol.css", - "css/userimage.css", - "css/nowplaying.css", - "css/materialize.css", "thirdparty/paper-button-style.css" }; |
