lazy load scripts

This commit is contained in:
Luke Pulverenti 2015-05-16 15:09:02 -04:00
parent 477a182efd
commit c8a38c139f
6 changed files with 180 additions and 13 deletions

View File

@ -56,6 +56,8 @@ namespace MediaBrowser.Api
[ApiMember(Name = "IsAdult", Description = "Optional. Filter by package that contain adult content.", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] [ApiMember(Name = "IsAdult", Description = "Optional. Filter by package that contain adult content.", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")]
public bool? IsAdult { get; set; } public bool? IsAdult { get; set; }
public bool? IsAppStoreEnabled { get; set; }
} }
/// <summary> /// <summary>
@ -207,6 +209,11 @@ namespace MediaBrowser.Api
packages = packages.Where(p => p.adult == request.IsAdult.Value); packages = packages.Where(p => p.adult == request.IsAdult.Value);
} }
if (request.IsAppStoreEnabled.HasValue)
{
packages = packages.Where(p => p.enableInAppStore == request.IsAppStoreEnabled.Value);
}
return ToOptimizedResult(packages.ToList()); return ToOptimizedResult(packages.ToList());
} }

View File

@ -25,6 +25,7 @@ namespace MediaBrowser.Api
[Authenticated] [Authenticated]
public class GetPlugins : IReturn<List<PluginInfo>> public class GetPlugins : IReturn<List<PluginInfo>>
{ {
public bool? IsAppStoreEnabled { get; set; }
} }
/// <summary> /// <summary>
@ -181,6 +182,7 @@ namespace MediaBrowser.Api
public async Task<object> Get(GetPlugins request) public async Task<object> Get(GetPlugins request)
{ {
var result = _appHost.Plugins.OrderBy(p => p.Name).Select(p => p.GetPluginInfo()).ToList(); var result = _appHost.Plugins.OrderBy(p => p.Name).Select(p => p.GetPluginInfo()).ToList();
var requireAppStoreEnabled = request.IsAppStoreEnabled.HasValue && request.IsAppStoreEnabled.Value;
// Don't fail just on account of image url's // Don't fail just on account of image url's
try try
@ -197,10 +199,26 @@ namespace MediaBrowser.Api
plugin.ImageUrl = pkg.thumbImage; plugin.ImageUrl = pkg.thumbImage;
} }
} }
if (requireAppStoreEnabled)
{
result = result
.Where(plugin =>
{
var pkg = packages.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i.guid) && new Guid(plugin.Id).Equals(new Guid(i.guid)));
return pkg != null && pkg.enableInAppStore;
})
.ToList();
}
} }
catch catch
{ {
// Play it safe here
if (requireAppStoreEnabled)
{
result = new List<PluginInfo>();
}
} }
return ToOptimizedSerializedResultUsingCache(result); return ToOptimizedSerializedResultUsingCache(result);

View File

@ -153,6 +153,12 @@ namespace MediaBrowser.Model.Updates
/// <value>The versions.</value> /// <value>The versions.</value>
public List<PackageVersionInfo> versions { get; set; } public List<PackageVersionInfo> versions { get; set; }
/// <summary>
/// Gets or sets a value indicating whether [enable in application store].
/// </summary>
/// <value><c>true</c> if [enable in application store]; otherwise, <c>false</c>.</value>
public bool enableInAppStore { get; set; }
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="PackageInfo"/> class. /// Initializes a new instance of the <see cref="PackageInfo"/> class.
/// </summary> /// </summary>

View File

@ -295,6 +295,14 @@ namespace MediaBrowser.WebDashboard.Api
var mode = request.Mode; var mode = request.Mode;
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
{
// Overwrite certain files with cordova specific versions
var cordovaVersion = Path.Combine(path, "thirdparty", "cordova", "registrationservices.js");
File.Copy(cordovaVersion, Path.Combine(path, "scripts", "registrationservices.js"), true);
File.Delete(cordovaVersion);
}
await DumpHtml(creator.DashboardUIPath, path, mode, culture, appVersion); await DumpHtml(creator.DashboardUIPath, path, mode, culture, appVersion);
await DumpJs(creator.DashboardUIPath, path, mode, culture, appVersion); await DumpJs(creator.DashboardUIPath, path, mode, culture, appVersion);

View File

@ -38,17 +38,17 @@ namespace MediaBrowser.WebDashboard.Api
string appVersion, string appVersion,
bool enableMinification) bool enableMinification)
{ {
var isHtml = IsHtml(path);
Stream resourceStream; Stream resourceStream;
if (path.Equals("scripts/all.js", StringComparison.OrdinalIgnoreCase)) if (path.Equals("scripts/all.js", StringComparison.OrdinalIgnoreCase))
{ {
resourceStream = await GetAllJavascript(mode, localizationCulture, appVersion, enableMinification).ConfigureAwait(false); resourceStream = await GetAllJavascript(mode, localizationCulture, appVersion, enableMinification).ConfigureAwait(false);
enableMinification = false;
} }
else if (path.Equals("css/all.css", StringComparison.OrdinalIgnoreCase)) else if (path.Equals("css/all.css", StringComparison.OrdinalIgnoreCase))
{ {
resourceStream = await GetAllCss(enableMinification).ConfigureAwait(false); resourceStream = await GetAllCss(enableMinification).ConfigureAwait(false);
enableMinification = false;
} }
else else
{ {
@ -59,7 +59,7 @@ namespace MediaBrowser.WebDashboard.Api
{ {
// Don't apply any caching for html pages // Don't apply any caching for html pages
// jQuery ajax doesn't seem to handle if-modified-since correctly // jQuery ajax doesn't seem to handle if-modified-since correctly
if (isHtml && path.IndexOf("cordovaindex.html", StringComparison.OrdinalIgnoreCase) == -1) if (IsHtml(path) && path.IndexOf("cordovaindex.html", StringComparison.OrdinalIgnoreCase) == -1)
{ {
resourceStream = await ModifyHtml(resourceStream, mode, localizationCulture, enableMinification).ConfigureAwait(false); resourceStream = await ModifyHtml(resourceStream, mode, localizationCulture, enableMinification).ConfigureAwait(false);
} }
@ -115,6 +115,86 @@ namespace MediaBrowser.WebDashboard.Api
return fullPath; return fullPath;
} }
public async Task<Stream> ModifyCss(Stream sourceStream, bool enableMinification)
{
using (sourceStream)
{
string content;
using (var memoryStream = new MemoryStream())
{
await sourceStream.CopyToAsync(memoryStream).ConfigureAwait(false);
content = Encoding.UTF8.GetString(memoryStream.ToArray());
if (enableMinification)
{
try
{
var result = new KristensenCssMinifier().Minify(content, false, Encoding.UTF8);
if (result.Errors.Count > 0)
{
_logger.Error("Error minifying css: " + result.Errors[0].Message);
}
else
{
content = result.MinifiedContent;
}
}
catch (Exception ex)
{
_logger.ErrorException("Error minifying css", ex);
}
}
}
var bytes = Encoding.UTF8.GetBytes(content);
return new MemoryStream(bytes);
}
}
public async Task<Stream> ModifyJs(Stream sourceStream, bool enableMinification)
{
using (sourceStream)
{
string content;
using (var memoryStream = new MemoryStream())
{
await sourceStream.CopyToAsync(memoryStream).ConfigureAwait(false);
content = Encoding.UTF8.GetString(memoryStream.ToArray());
if (enableMinification)
{
try
{
var result = new CrockfordJsMinifier().Minify(content, false, Encoding.UTF8);
if (result.Errors.Count > 0)
{
_logger.Error("Error minifying javascript: " + result.Errors[0].Message);
}
else
{
content = result.MinifiedContent;
}
}
catch (Exception ex)
{
_logger.ErrorException("Error minifying javascript", ex);
}
}
}
var bytes = Encoding.UTF8.GetBytes(content);
return new MemoryStream(bytes);
}
}
/// <summary> /// <summary>
/// Modifies the HTML by adding common meta tags, css and js. /// Modifies the HTML by adding common meta tags, css and js.
/// </summary> /// </summary>
@ -135,6 +215,11 @@ namespace MediaBrowser.WebDashboard.Api
html = Encoding.UTF8.GetString(memoryStream.ToArray()); html = Encoding.UTF8.GetString(memoryStream.ToArray());
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
{
html = ModifyForCordova(html);
}
if (!string.IsNullOrWhiteSpace(localizationCulture)) if (!string.IsNullOrWhiteSpace(localizationCulture))
{ {
var lang = localizationCulture.Split('-').FirstOrDefault(); var lang = localizationCulture.Split('-').FirstOrDefault();
@ -182,6 +267,22 @@ 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>${ButtonDonate}</span>");
return html;
}
private string ReplaceBetween(string html, string startToken, string endToken, string newHtml)
{
return html;
}
private string GetLocalizationToken(string phrase) private string GetLocalizationToken(string phrase)
{ {
return "${" + phrase + "}"; return "${" + phrase + "}";
@ -293,7 +394,14 @@ namespace MediaBrowser.WebDashboard.Api
await AppendResource(memoryStream, "thirdparty/jquery.unveil-custom.js", newLineBytes).ConfigureAwait(false); await AppendResource(memoryStream, "thirdparty/jquery.unveil-custom.js", newLineBytes).ConfigureAwait(false);
await AppendLocalization(memoryStream, culture).ConfigureAwait(false); var excludePhrases = new List<string>();
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
{
excludePhrases.Add("paypal");
}
await AppendLocalization(memoryStream, culture, excludePhrases).ConfigureAwait(false);
await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false); await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false);
if (!string.IsNullOrWhiteSpace(mode)) if (!string.IsNullOrWhiteSpace(mode))
@ -424,13 +532,11 @@ namespace MediaBrowser.WebDashboard.Api
"taskbutton.js", "taskbutton.js",
"ratingdialog.js", "ratingdialog.js",
"aboutpage.js",
"alphapicker.js", "alphapicker.js",
"addpluginpage.js", "addpluginpage.js",
"metadataadvanced.js", "metadataadvanced.js",
"autoorganizetv.js", "autoorganizetv.js",
"autoorganizelog.js", "autoorganizelog.js",
"channels.js",
"channelslatest.js", "channelslatest.js",
"channelitems.js", "channelitems.js",
"channelsettings.js", "channelsettings.js",
@ -489,10 +595,6 @@ namespace MediaBrowser.WebDashboard.Api
"moviepeople.js", "moviepeople.js",
"moviestudios.js", "moviestudios.js",
"movietrailers.js", "movietrailers.js",
"musicalbums.js",
"musicalbumartists.js",
"musicartists.js",
"musicrecommended.js",
"mypreferencesdisplay.js", "mypreferencesdisplay.js",
"mypreferenceslanguages.js", "mypreferenceslanguages.js",
@ -538,9 +640,29 @@ namespace MediaBrowser.WebDashboard.Api
}; };
} }
private async Task AppendLocalization(Stream stream, string culture) private async Task AppendLocalization(Stream stream, string culture, List<string> excludePhrases)
{ {
var js = "window.localizationGlossary=" + _jsonSerializer.SerializeToString(_localization.GetJavaScriptLocalizationDictionary(culture)); var dictionary = _localization.GetJavaScriptLocalizationDictionary(culture);
if (excludePhrases.Count > 0)
{
var removes = new List<string>();
foreach (var pair in dictionary)
{
if (excludePhrases.Any(i => pair.Key.IndexOf(i, StringComparison.OrdinalIgnoreCase) != -1 || pair.Value.IndexOf(i, StringComparison.OrdinalIgnoreCase) != -1))
{
removes.Add(pair.Key);
}
}
foreach (var remove in removes)
{
dictionary.Remove(remove);
}
}
var js = "window.localizationGlossary=" + _jsonSerializer.SerializeToString(dictionary);
var bytes = Encoding.UTF8.GetBytes(js); var bytes = Encoding.UTF8.GetBytes(js);
await stream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); await stream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);

View File

@ -156,6 +156,9 @@
<Content Include="dashboard-ui\scripts\photos.js"> <Content Include="dashboard-ui\scripts\photos.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\scripts\registrationservices.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\scripts\reports.js"> <Content Include="dashboard-ui\scripts\reports.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -222,6 +225,9 @@
<Content Include="dashboard-ui\thirdparty\cordova\imagestore.js"> <Content Include="dashboard-ui\thirdparty\cordova\imagestore.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\thirdparty\cordova\registrationservices.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\cordova\remotecontrols.js"> <Content Include="dashboard-ui\thirdparty\cordova\remotecontrols.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>