2013-03-24 02:45:00 +00:00
using MediaBrowser.Common.Extensions ;
2013-03-23 04:04:36 +00:00
using MediaBrowser.Common.IO ;
2013-02-21 01:33:05 +00:00
using MediaBrowser.Common.Net ;
using MediaBrowser.Common.ScheduledTasks ;
using MediaBrowser.Controller ;
2013-03-23 04:04:36 +00:00
using MediaBrowser.Controller.Configuration ;
2013-04-13 18:02:30 +00:00
using MediaBrowser.Controller.Dto ;
2013-02-21 01:33:05 +00:00
using MediaBrowser.Controller.Plugins ;
2013-05-09 17:38:02 +00:00
using MediaBrowser.Controller.Session ;
2013-02-22 01:26:35 +00:00
using MediaBrowser.Model.Logging ;
2013-02-21 01:33:05 +00:00
using MediaBrowser.Model.Tasks ;
using ServiceStack.ServiceHost ;
using System ;
using System.Collections.Generic ;
2013-03-24 02:45:00 +00:00
using System.Diagnostics ;
2013-02-21 01:33:05 +00:00
using System.IO ;
using System.Linq ;
2013-03-23 04:04:36 +00:00
using System.Reflection ;
2013-02-21 01:33:05 +00:00
using System.Text ;
using System.Threading.Tasks ;
namespace MediaBrowser.WebDashboard.Api
{
/// <summary>
/// Class GetDashboardConfigurationPages
/// </summary>
[Route("/dashboard/ConfigurationPages", "GET")]
2013-03-24 02:45:00 +00:00
[Restrict(VisibilityTo = EndpointAttributes.None)]
2013-03-17 16:52:32 +00:00
public class GetDashboardConfigurationPages : IReturn < List < ConfigurationPageInfo > >
2013-02-21 01:33:05 +00:00
{
/// <summary>
/// Gets or sets the type of the page.
/// </summary>
/// <value>The type of the page.</value>
public ConfigurationPageType ? PageType { get ; set ; }
}
/// <summary>
/// Class GetDashboardConfigurationPage
/// </summary>
[Route("/dashboard/ConfigurationPage", "GET")]
2013-03-24 02:45:00 +00:00
[Restrict(VisibilityTo = EndpointAttributes.None)]
2013-03-17 16:52:32 +00:00
public class GetDashboardConfigurationPage
2013-02-21 01:33:05 +00:00
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get ; set ; }
}
/// <summary>
/// Class GetDashboardResource
/// </summary>
2013-02-27 16:46:48 +00:00
[Route("/dashboard/{ResourceName*}", "GET")]
2013-03-24 02:45:00 +00:00
[Restrict(VisibilityTo = EndpointAttributes.None)]
2013-02-21 01:33:05 +00:00
public class GetDashboardResource
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
2013-02-27 16:46:48 +00:00
public string ResourceName { get ; set ; }
2013-02-21 01:33:05 +00:00
/// <summary>
/// Gets or sets the V.
/// </summary>
/// <value>The V.</value>
public string V { get ; set ; }
}
/// <summary>
/// Class GetDashboardInfo
/// </summary>
[Route("/dashboard/dashboardInfo", "GET")]
2013-03-24 02:45:00 +00:00
[Restrict(VisibilityTo = EndpointAttributes.None)]
2013-02-21 01:33:05 +00:00
public class GetDashboardInfo : IReturn < DashboardInfo >
{
}
/// <summary>
/// Class DashboardService
/// </summary>
2013-03-24 02:45:00 +00:00
public class DashboardService : IRestfulService , IHasResultFactory
2013-02-21 01:33:05 +00:00
{
2013-03-24 02:45:00 +00:00
/// <summary>
/// Gets or sets the logger.
/// </summary>
/// <value>The logger.</value>
public ILogger Logger { get ; set ; }
/// <summary>
/// Gets or sets the HTTP result factory.
/// </summary>
/// <value>The HTTP result factory.</value>
public IHttpResultFactory ResultFactory { get ; set ; }
/// <summary>
/// Gets or sets the request context.
/// </summary>
/// <value>The request context.</value>
public IRequestContext RequestContext { get ; set ; }
2013-05-01 03:28:26 +00:00
2013-02-23 07:57:11 +00:00
/// <summary>
/// Gets or sets the task manager.
/// </summary>
/// <value>The task manager.</value>
private readonly ITaskManager _taskManager ;
2013-03-23 04:04:36 +00:00
/// <summary>
/// The _app host
/// </summary>
2013-03-07 05:34:00 +00:00
private readonly IServerApplicationHost _appHost ;
2013-05-01 03:28:26 +00:00
/// <summary>
/// The _server configuration manager
/// </summary>
2013-03-23 04:04:36 +00:00
private readonly IServerConfigurationManager _serverConfigurationManager ;
2013-05-09 17:38:02 +00:00
private readonly ISessionManager _sessionManager ;
2013-09-04 17:02:19 +00:00
private readonly IDtoService _dtoService ;
2013-05-09 17:38:02 +00:00
2013-02-23 07:57:11 +00:00
/// <summary>
/// Initializes a new instance of the <see cref="DashboardService" /> class.
/// </summary>
/// <param name="taskManager">The task manager.</param>
2013-03-23 04:04:36 +00:00
/// <param name="appHost">The app host.</param>
2013-04-10 17:11:23 +00:00
/// <param name="serverConfigurationManager">The server configuration manager.</param>
2013-06-19 12:24:50 +00:00
/// <param name="sessionManager">The session manager.</param>
2013-09-04 17:02:19 +00:00
public DashboardService ( ITaskManager taskManager , IServerApplicationHost appHost , IServerConfigurationManager serverConfigurationManager , ISessionManager sessionManager , IDtoService dtoService )
2013-02-23 07:57:11 +00:00
{
_taskManager = taskManager ;
2013-03-07 05:34:00 +00:00
_appHost = appHost ;
2013-03-23 04:04:36 +00:00
_serverConfigurationManager = serverConfigurationManager ;
2013-05-09 17:38:02 +00:00
_sessionManager = sessionManager ;
2013-09-04 17:02:19 +00:00
_dtoService = dtoService ;
2013-02-23 07:57:11 +00:00
}
2013-02-21 01:33:05 +00:00
2013-04-06 18:30:36 +00:00
/// <summary>
/// Gets the dashboard UI path.
/// </summary>
/// <value>The dashboard UI path.</value>
public string DashboardUIPath
{
get
{
if ( ! string . IsNullOrEmpty ( _serverConfigurationManager . Configuration . DashboardSourcePath ) )
{
return _serverConfigurationManager . Configuration . DashboardSourcePath ;
}
var runningDirectory = Path . GetDirectoryName ( Process . GetCurrentProcess ( ) . MainModule . FileName ) ;
return Path . Combine ( runningDirectory , "dashboard-ui" ) ;
}
}
/// <summary>
/// Gets the dashboard resource path.
/// </summary>
/// <param name="virtualPath">The virtual path.</param>
/// <returns>System.String.</returns>
private string GetDashboardResourcePath ( string virtualPath )
{
2013-10-05 14:19:29 +00:00
return Path . Combine ( DashboardUIPath , virtualPath . Replace ( '/' , Path . DirectorySeparatorChar ) ) ;
2013-04-06 18:30:36 +00:00
}
2013-02-21 01:33:05 +00:00
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetDashboardInfo request )
{
2013-09-04 17:02:19 +00:00
var result = GetDashboardInfo ( _appHost , _taskManager , _sessionManager , _dtoService ) ;
2013-04-17 22:30:20 +00:00
return ResultFactory . GetOptimizedResult ( RequestContext , result ) ;
2013-02-21 01:33:05 +00:00
}
/// <summary>
/// Gets the dashboard info.
/// </summary>
2013-03-23 04:04:36 +00:00
/// <param name="appHost">The app host.</param>
2013-02-23 07:57:11 +00:00
/// <param name="taskManager">The task manager.</param>
2013-05-09 17:38:02 +00:00
/// <param name="connectionManager">The connection manager.</param>
2013-02-21 01:33:05 +00:00
/// <returns>DashboardInfo.</returns>
2013-06-19 12:24:50 +00:00
public static DashboardInfo GetDashboardInfo ( IServerApplicationHost appHost ,
2013-05-23 22:39:51 +00:00
ITaskManager taskManager ,
2013-09-04 17:02:19 +00:00
ISessionManager connectionManager , IDtoService dtoService )
2013-02-21 01:33:05 +00:00
{
2013-09-20 00:53:18 +00:00
var connections = connectionManager . Sessions . Where ( i = > i . IsActive ) . ToList ( ) ;
2013-02-21 01:33:05 +00:00
return new DashboardInfo
{
2013-03-07 05:34:00 +00:00
SystemInfo = appHost . GetSystemInfo ( ) ,
2013-02-21 01:33:05 +00:00
2013-02-23 07:57:11 +00:00
RunningTasks = taskManager . ScheduledTasks . Where ( i = > i . State = = TaskState . Running | | i . State = = TaskState . Cancelling )
2013-02-21 01:33:05 +00:00
. Select ( ScheduledTaskHelpers . GetTaskInfo )
2013-09-20 00:53:18 +00:00
. ToList ( ) ,
2013-02-21 01:33:05 +00:00
2013-02-26 03:43:04 +00:00
ApplicationUpdateTaskId = taskManager . ScheduledTasks . First ( t = > t . ScheduledTask . GetType ( ) . Name . Equals ( "SystemUpdateTask" , StringComparison . OrdinalIgnoreCase ) ) . Id ,
2013-02-21 01:33:05 +00:00
2013-09-20 00:53:18 +00:00
ActiveConnections = connections . Select ( dtoService . GetSessionInfoDto ) . ToList ( )
2013-02-21 01:33:05 +00:00
} ;
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetDashboardConfigurationPage request )
{
2013-03-05 04:34:00 +00:00
var page = ServerEntryPoint . Instance . PluginConfigurationPages . First ( p = > p . Name . Equals ( request . Name , StringComparison . OrdinalIgnoreCase ) ) ;
2013-02-21 01:33:05 +00:00
2013-03-24 02:45:00 +00:00
return ResultFactory . GetStaticResult ( RequestContext , page . Plugin . Version . ToString ( ) . GetMD5 ( ) , page . Plugin . AssemblyDateLastModified , null , MimeTypes . GetMimeType ( "page.html" ) , ( ) = > ModifyHtml ( page . GetHtmlStream ( ) ) ) ;
2013-02-21 01:33:05 +00:00
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetDashboardConfigurationPages request )
{
2013-07-08 16:13:21 +00:00
const string unavilableMessage = "The server is still loading. Please try again momentarily." ;
var instance = ServerEntryPoint . Instance ;
if ( instance = = null )
{
throw new InvalidOperationException ( unavilableMessage ) ;
}
var pages = instance . PluginConfigurationPages ;
if ( pages = = null )
{
throw new InvalidOperationException ( unavilableMessage ) ;
}
2013-02-21 01:33:05 +00:00
if ( request . PageType . HasValue )
{
pages = pages . Where ( p = > p . ConfigurationPageType = = request . PageType . Value ) ;
}
2013-03-24 02:45:00 +00:00
return ResultFactory . GetOptimizedResult ( RequestContext , pages . Select ( p = > new ConfigurationPageInfo ( p ) ) . ToList ( ) ) ;
2013-02-21 01:33:05 +00:00
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetDashboardResource request )
{
2013-02-27 16:46:48 +00:00
var path = request . ResourceName ;
2013-02-21 01:33:05 +00:00
var contentType = MimeTypes . GetMimeType ( path ) ;
2013-03-23 04:04:36 +00:00
// Don't cache if not configured to do so
// But always cache images to simulate production
if ( ! _serverConfigurationManager . Configuration . EnableDashboardResponseCaching & & ! contentType . StartsWith ( "image/" , StringComparison . OrdinalIgnoreCase ) )
{
2013-03-24 02:45:00 +00:00
return ResultFactory . GetResult ( GetResourceStream ( path ) . Result , contentType ) ;
2013-03-23 04:04:36 +00:00
}
2013-02-21 01:33:05 +00:00
TimeSpan ? cacheDuration = null ;
// Cache images unconditionally - updates to image files will require new filename
// If there's a version number in the query string we can cache this unconditionally
if ( contentType . StartsWith ( "image/" , StringComparison . OrdinalIgnoreCase ) | | ! string . IsNullOrEmpty ( request . V ) )
{
cacheDuration = TimeSpan . FromDays ( 365 ) ;
}
var assembly = GetType ( ) . Assembly . GetName ( ) ;
2013-03-23 04:04:36 +00:00
var cacheKey = ( assembly . Version + path ) . GetMD5 ( ) ;
2013-03-24 02:45:00 +00:00
return ResultFactory . GetStaticResult ( RequestContext , cacheKey , null , cacheDuration , contentType , ( ) = > GetResourceStream ( path ) ) ;
2013-02-21 01:33:05 +00:00
}
/// <summary>
/// Gets the resource stream.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>Task{Stream}.</returns>
private async Task < Stream > GetResourceStream ( string path )
{
Stream resourceStream ;
if ( path . Equals ( "scripts/all.js" , StringComparison . OrdinalIgnoreCase ) )
{
resourceStream = await GetAllJavascript ( ) . ConfigureAwait ( false ) ;
}
2013-04-01 00:22:38 +00:00
else if ( path . Equals ( "css/all.css" , StringComparison . OrdinalIgnoreCase ) )
{
resourceStream = await GetAllCss ( ) . ConfigureAwait ( false ) ;
}
2013-02-21 01:33:05 +00:00
else
{
2013-03-23 04:04:36 +00:00
resourceStream = GetRawResourceStream ( path ) ;
2013-02-21 01:33:05 +00:00
}
if ( resourceStream ! = null )
{
var isHtml = IsHtml ( path ) ;
// Don't apply any caching for html pages
// jQuery ajax doesn't seem to handle if-modified-since correctly
if ( isHtml )
{
resourceStream = await ModifyHtml ( resourceStream ) . ConfigureAwait ( false ) ;
}
}
return resourceStream ;
}
/// <summary>
2013-03-23 04:04:36 +00:00
/// Gets the raw resource stream.
2013-02-21 01:33:05 +00:00
/// </summary>
2013-03-23 04:04:36 +00:00
/// <param name="path">The path.</param>
/// <returns>Task{Stream}.</returns>
private Stream GetRawResourceStream ( string path )
2013-02-21 01:33:05 +00:00
{
2013-04-06 18:30:36 +00:00
return new FileStream ( GetDashboardResourcePath ( path ) , FileMode . Open , FileAccess . Read , FileShare . ReadWrite , StreamDefaults . DefaultFileStreamBufferSize , true ) ;
2013-02-21 01:33:05 +00:00
}
/// <summary>
/// Determines whether the specified path is HTML.
/// </summary>
/// <param name="path">The path.</param>
/// <returns><c>true</c> if the specified path is HTML; otherwise, <c>false</c>.</returns>
private bool IsHtml ( string path )
{
return Path . GetExtension ( path ) . EndsWith ( "html" , StringComparison . OrdinalIgnoreCase ) ;
}
/// <summary>
/// Modifies the HTML by adding common meta tags, css and js.
/// </summary>
/// <param name="sourceStream">The source stream.</param>
/// <returns>Task{Stream}.</returns>
internal async Task < Stream > ModifyHtml ( Stream sourceStream )
{
string html ;
using ( var memoryStream = new MemoryStream ( ) )
{
await sourceStream . CopyToAsync ( memoryStream ) . ConfigureAwait ( false ) ;
html = Encoding . UTF8 . GetString ( memoryStream . ToArray ( ) ) ;
}
var version = GetType ( ) . Assembly . GetName ( ) . Version ;
html = html . Replace ( "<head>" , "<head>" + GetMetaTags ( ) + GetCommonCss ( version ) + GetCommonJavascript ( version ) ) ;
var bytes = Encoding . UTF8 . GetBytes ( html ) ;
sourceStream . Dispose ( ) ;
return new MemoryStream ( bytes ) ;
}
/// <summary>
/// Gets the meta tags.
/// </summary>
/// <returns>System.String.</returns>
private static string GetMetaTags ( )
{
var sb = new StringBuilder ( ) ;
sb . Append ( "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">" ) ;
sb . Append ( "<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">" ) ;
2013-10-11 13:47:38 +00:00
sb . Append ( "<meta http-equiv=\"X-UA-Compatibility\" content=\"IE=Edge\">" ) ;
2013-05-17 02:32:23 +00:00
//sb.Append("<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">");
2013-02-21 01:33:05 +00:00
// http://developer.apple.com/library/ios/#DOCUMENTATION/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html
sb . Append ( "<link rel=\"apple-touch-icon\" href=\"css/images/touchicon.png\" />" ) ;
sb . Append ( "<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"css/images/touchicon72.png\" />" ) ;
sb . Append ( "<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"css/images/touchicon114.png\" />" ) ;
2013-03-25 18:35:02 +00:00
sb . Append ( "<link rel=\"apple-touch-startup-image\" href=\"css/images/iossplash.png\" />" ) ;
sb . Append ( "<link rel=\"shortcut icon\" href=\"favicon.ico\" />" ) ;
2013-02-21 01:33:05 +00:00
return sb . ToString ( ) ;
}
/// <summary>
/// Gets the common CSS.
/// </summary>
2013-02-27 20:25:45 +00:00
/// <param name="version">The version.</param>
2013-02-21 01:33:05 +00:00
/// <returns>System.String.</returns>
private static string GetCommonCss ( Version version )
{
var versionString = "?v=" + version ;
var files = new [ ]
{
2013-08-21 20:07:39 +00:00
"http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css" ,
2013-05-28 17:32:40 +00:00
"thirdparty/jqm-icon-pack-3.0/font-awesome/jqm-icon-pack-3.0.0-fa.css" + versionString ,
2013-04-01 00:22:38 +00:00
"css/all.css" + versionString
2013-02-21 01:33:05 +00:00
} ;
var tags = files . Select ( s = > string . Format ( "<link rel=\"stylesheet\" href=\"{0}\" />" , s ) ) . ToArray ( ) ;
return string . Join ( string . Empty , tags ) ;
}
/// <summary>
/// Gets the common javascript.
/// </summary>
2013-02-27 20:25:45 +00:00
/// <param name="version">The version.</param>
2013-02-21 01:33:05 +00:00
/// <returns>System.String.</returns>
private static string GetCommonJavascript ( Version version )
{
2013-09-17 03:41:49 +00:00
var builder = new StringBuilder ( ) ;
builder . Append ( "<script type=\"text/javascript\">if (navigator.userAgent.toLowerCase().indexOf('compatible; msie 7')!=-1){alert(\"Please ensure you're running at least IE10 and that compatibility mode is disabled.\");}" ) ;
builder . Append ( "</script>" ) ;
2013-02-21 01:33:05 +00:00
var versionString = "?v=" + version ;
var files = new [ ]
{
2013-04-18 15:57:33 +00:00
"http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ,
2013-08-21 20:07:39 +00:00
"http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js" ,
2013-08-02 20:36:44 +00:00
"scripts/all.js" + versionString ,
"thirdparty/jstree1.0fix2/jquery.jstree.js"
2013-02-21 01:33:05 +00:00
} ;
var tags = files . Select ( s = > string . Format ( "<script src=\"{0}\"></script>" , s ) ) . ToArray ( ) ;
2013-09-17 03:41:49 +00:00
builder . Append ( string . Join ( string . Empty , tags ) ) ;
return builder . ToString ( ) ;
2013-02-21 01:33:05 +00:00
}
/// <summary>
/// Gets a stream containing all concatenated javascript
/// </summary>
/// <returns>Task{Stream}.</returns>
private async Task < Stream > GetAllJavascript ( )
{
var assembly = GetType ( ) . Assembly ;
var scriptFiles = new [ ]
{
2013-03-26 18:32:01 +00:00
"extensions.js" ,
"site.js" ,
2013-04-03 12:03:37 +00:00
"librarybrowser.js" ,
2013-04-03 19:53:34 +00:00
2013-03-26 18:32:01 +00:00
"aboutpage.js" ,
2013-07-08 16:13:21 +00:00
"allusersettings.js" ,
2013-05-29 01:45:39 +00:00
"alphapicker.js" ,
2013-03-26 18:32:01 +00:00
"addpluginpage.js" ,
"advancedconfigurationpage.js" ,
"advancedmetadataconfigurationpage.js" ,
2013-04-02 03:28:20 +00:00
"boxsets.js" ,
2013-04-17 04:58:32 +00:00
"clientsettings.js" ,
2013-03-26 18:32:01 +00:00
"dashboardpage.js" ,
2013-07-06 17:20:53 +00:00
"directorybrowser.js" ,
2013-05-06 01:15:48 +00:00
"edititemmetadata.js" ,
2013-06-09 07:50:35 +00:00
"edititempeople.js" ,
2013-05-04 21:20:27 +00:00
"edititemimages.js" ,
2013-03-26 18:32:01 +00:00
"edituserpage.js" ,
2013-04-19 23:57:23 +00:00
"gamesrecommendedpage.js" ,
"gamesystemspage.js" ,
"gamespage.js" ,
"gamegenrepage.js" ,
"gamestudiospage.js" ,
2013-03-26 18:32:01 +00:00
"indexpage.js" ,
2013-03-27 22:29:37 +00:00
"itembynamedetailpage.js" ,
2013-03-26 18:32:01 +00:00
"itemdetailpage.js" ,
2013-06-01 01:48:41 +00:00
"itemgallery.js" ,
2013-03-26 18:32:01 +00:00
"itemlistpage.js" ,
2013-05-21 20:36:26 +00:00
"librarysettings.js" ,
2013-03-26 18:32:01 +00:00
"loginpage.js" ,
"logpage.js" ,
"medialibrarypage.js" ,
"mediaplayer.js" ,
"metadataconfigurationpage.js" ,
"metadataimagespage.js" ,
2013-04-11 19:36:50 +00:00
"moviegenres.js" ,
2013-04-02 00:54:06 +00:00
"movies.js" ,
2013-04-11 22:09:08 +00:00
"moviepeople.js" ,
2013-04-01 15:59:56 +00:00
"moviesrecommended.js" ,
2013-04-11 22:09:08 +00:00
"moviestudios.js" ,
2013-04-17 17:04:57 +00:00
"movietrailers.js" ,
2013-04-22 04:38:03 +00:00
"musicalbums.js" ,
"musicartists.js" ,
2013-04-19 23:57:23 +00:00
"musicgenres.js" ,
2013-04-25 23:28:01 +00:00
"musicrecommended.js" ,
2013-05-28 01:59:26 +00:00
"musicvideos.js" ,
2013-07-06 21:23:32 +00:00
"notifications.js" ,
2013-04-11 19:36:50 +00:00
"playlist.js" ,
2013-04-17 04:58:32 +00:00
"plugincatalogpage.js" ,
2013-03-26 18:32:01 +00:00
"pluginspage.js" ,
"pluginupdatespage.js" ,
2013-05-29 01:45:39 +00:00
"remotecontrol.js" ,
2013-03-26 18:32:01 +00:00
"scheduledtaskpage.js" ,
"scheduledtaskspage.js" ,
2013-04-26 20:53:54 +00:00
"search.js" ,
2013-04-23 03:56:11 +00:00
"songs.js" ,
2013-04-11 19:36:50 +00:00
"supporterkeypage.js" ,
"supporterpage.js" ,
2013-09-13 20:45:27 +00:00
"episodes.js" ,
2013-04-11 19:36:50 +00:00
"tvgenres.js" ,
2013-05-01 03:28:26 +00:00
"tvnextup.js" ,
2013-04-12 03:50:47 +00:00
"tvpeople.js" ,
2013-04-02 01:00:21 +00:00
"tvrecommended.js" ,
2013-04-02 03:28:20 +00:00
"tvshows.js" ,
2013-04-11 22:09:08 +00:00
"tvstudios.js" ,
2013-10-24 17:49:24 +00:00
"tvupcoming.js" ,
2013-03-26 18:32:01 +00:00
"updatepasswordpage.js" ,
"userimagepage.js" ,
"userprofilespage.js" ,
"wizardfinishpage.js" ,
2013-09-30 15:41:18 +00:00
"wizardservice.js" ,
2013-03-26 18:32:01 +00:00
"wizardstartpage.js" ,
2013-09-05 17:05:39 +00:00
"wizardsettings.js" ,
2013-04-19 23:57:23 +00:00
"wizarduserpage.js"
2013-02-21 01:33:05 +00:00
} ;
var memoryStream = new MemoryStream ( ) ;
var newLineBytes = Encoding . UTF8 . GetBytes ( Environment . NewLine ) ;
2013-07-10 12:37:14 +00:00
var versionString = string . Format ( "window.dashboardVersion='{0}';" , _appHost . ApplicationVersion ) ;
2013-07-09 16:11:16 +00:00
var versionBytes = Encoding . UTF8 . GetBytes ( versionString ) ;
await memoryStream . WriteAsync ( versionBytes , 0 , versionBytes . Length ) . ConfigureAwait ( false ) ;
await memoryStream . WriteAsync ( newLineBytes , 0 , newLineBytes . Length ) . ConfigureAwait ( false ) ;
2013-05-01 14:48:26 +00:00
await AppendResource ( memoryStream , "thirdparty/autoNumeric.js" , newLineBytes ) . ConfigureAwait ( false ) ;
2013-05-24 01:47:07 +00:00
await AppendResource ( memoryStream , "thirdparty/html5slider.js" , newLineBytes ) . ConfigureAwait ( false ) ;
2013-05-01 14:48:26 +00:00
2013-03-10 01:18:29 +00:00
await AppendResource ( assembly , memoryStream , "MediaBrowser.WebDashboard.ApiClient.js" , newLineBytes ) . ConfigureAwait ( false ) ;
2013-02-21 01:33:05 +00:00
foreach ( var file in scriptFiles )
{
2013-03-23 04:04:36 +00:00
await AppendResource ( memoryStream , "scripts/" + file , newLineBytes ) . ConfigureAwait ( false ) ;
2013-02-21 01:33:05 +00:00
}
memoryStream . Position = 0 ;
return memoryStream ;
}
2013-04-01 00:22:38 +00:00
/// <summary>
/// Gets all CSS.
/// </summary>
/// <returns>Task{Stream}.</returns>
private async Task < Stream > GetAllCss ( )
{
var files = new [ ]
{
"site.css" ,
"librarybrowser.css" ,
2013-04-25 23:28:01 +00:00
"detailtable.css" ,
"posteritem.css" ,
2013-05-03 19:34:25 +00:00
"tileitem.css" ,
2013-08-02 20:36:44 +00:00
"metadataeditor.css" ,
2013-07-06 21:23:32 +00:00
"notifications.css" ,
2013-04-26 20:53:54 +00:00
"search.css" ,
2013-04-01 00:22:38 +00:00
"pluginupdates.css" ,
2013-05-30 19:58:07 +00:00
"remotecontrol.css" ,
2013-04-01 00:22:38 +00:00
"userimage.css"
} ;
var memoryStream = new MemoryStream ( ) ;
var newLineBytes = Encoding . UTF8 . GetBytes ( Environment . NewLine ) ;
foreach ( var file in files )
{
await AppendResource ( memoryStream , "css/" + file , newLineBytes ) . ConfigureAwait ( false ) ;
}
memoryStream . Position = 0 ;
return memoryStream ;
}
2013-05-01 03:28:26 +00:00
2013-03-23 04:04:36 +00:00
/// <summary>
/// Appends the resource.
/// </summary>
/// <param name="assembly">The assembly.</param>
/// <param name="outputStream">The output stream.</param>
/// <param name="path">The path.</param>
/// <param name="newLineBytes">The new line bytes.</param>
/// <returns>Task.</returns>
2013-03-10 01:18:29 +00:00
private async Task AppendResource ( Assembly assembly , Stream outputStream , string path , byte [ ] newLineBytes )
{
using ( var stream = assembly . GetManifestResourceStream ( path ) )
{
await stream . CopyToAsync ( outputStream ) . ConfigureAwait ( false ) ;
await outputStream . WriteAsync ( newLineBytes , 0 , newLineBytes . Length ) . ConfigureAwait ( false ) ;
}
}
2013-03-23 04:04:36 +00:00
/// <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 )
{
2013-04-06 18:30:36 +00:00
path = GetDashboardResourcePath ( path ) ;
2013-04-01 00:22:38 +00:00
using ( var fs = new FileStream ( path , FileMode . Open , FileAccess . Read , FileShare . ReadWrite , StreamDefaults . DefaultFileStreamBufferSize , 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 ) ;
}
2013-03-23 04:04:36 +00:00
}
2013-04-01 00:22:38 +00:00
await outputStream . WriteAsync ( newLineBytes , 0 , newLineBytes . Length ) . ConfigureAwait ( false ) ;
2013-03-23 04:04:36 +00:00
}
2013-02-21 01:33:05 +00:00
}
}