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-12-07 15:52:38 +00:00
using MediaBrowser.Controller.Net ;
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 ;
2013-12-07 15:52:38 +00:00
using ServiceStack ;
2013-02-21 01:33:05 +00:00
using System ;
using System.Collections.Generic ;
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 ;
2013-12-07 15:52:38 +00:00
using ServiceStack.Web ;
2013-02-21 01:33:05 +00:00
namespace MediaBrowser.WebDashboard.Api
{
/// <summary>
/// Class GetDashboardConfigurationPages
/// </summary>
[Route("/dashboard/ConfigurationPages", "GET")]
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-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-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")]
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>
2013-12-07 15:52:38 +00:00
public IRequest Request { 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-10-31 14:03:23 +00:00
private readonly IFileSystem _fileSystem ;
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-10-31 14:03:23 +00:00
public DashboardService ( ITaskManager taskManager , IServerApplicationHost appHost , IServerConfigurationManager serverConfigurationManager , ISessionManager sessionManager , IDtoService dtoService , IFileSystem fileSystem )
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-10-31 14:03:23 +00:00
_fileSystem = fileSystem ;
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 ;
}
2013-12-04 14:52:38 +00:00
var runningDirectory = Path . GetDirectoryName ( _serverConfigurationManager . ApplicationPaths . ApplicationPath ) ;
2013-04-06 18:30:36 +00:00
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
2013-12-07 15:52:38 +00:00
return ResultFactory . GetOptimizedResult ( Request , 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-12-07 15:52:38 +00:00
return ResultFactory . GetStaticResult ( Request , 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-12-15 01:17:57 +00:00
// Don't allow a failing plugin to fail them all
var configPages = pages . Select ( p = >
{
try
{
return new ConfigurationPageInfo ( p ) ;
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error getting plugin information from {0}" , ex , p . GetType ( ) . Name ) ;
return null ;
}
} )
. Where ( i = > i ! = null )
. ToList ( ) ;
return ResultFactory . GetOptimizedResult ( Request , configPages ) ;
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
2013-12-16 18:44:03 +00:00
if ( ! _serverConfigurationManager . Configuration . EnableDashboardResponseCaching & &
! contentType . StartsWith ( "image/" , StringComparison . OrdinalIgnoreCase ) & &
! contentType . StartsWith ( "font/" , StringComparison . OrdinalIgnoreCase ) )
2013-03-23 04:04:36 +00:00
{
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
2013-12-16 18:44:03 +00:00
if ( contentType . StartsWith ( "image/" , StringComparison . OrdinalIgnoreCase ) | | contentType . StartsWith ( "font/" , StringComparison . OrdinalIgnoreCase ) | | ! string . IsNullOrEmpty ( request . V ) )
2013-02-21 01:33:05 +00:00
{
cacheDuration = TimeSpan . FromDays ( 365 ) ;
}
var assembly = GetType ( ) . Assembly . GetName ( ) ;
2013-03-23 04:04:36 +00:00
var cacheKey = ( assembly . Version + path ) . GetMD5 ( ) ;
2013-12-07 15:52:38 +00:00
return ResultFactory . GetStaticResult ( Request , 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-10-31 14:03:23 +00:00
return _fileSystem . GetFileStream ( GetDashboardResourcePath ( path ) , FileMode . Open , FileAccess . Read , FileShare . ReadWrite , 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 ( ) ;
2013-11-06 15:45:40 +00:00
sb . Append ( "<meta http-equiv=\"X-UA-Compatibility\" content=\"IE=Edge\">" ) ;
2013-02-21 01:33:05 +00:00
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-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-12-15 17:42:15 +00:00
"thirdparty/jquerymobile-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-08-02 20:36:44 +00:00
"scripts/all.js" + versionString ,
2013-12-15 17:24:05 +00:00
"thirdparty/jstree1.0/jquery.jstree.min.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-11-07 17:27:05 +00:00
"ratingdialog.js" ,
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-11-24 23:37:38 +00:00
"livetvchannel.js" ,
2013-11-14 22:22:46 +00:00
"livetvchannels.js" ,
"livetvguide.js" ,
2013-12-17 20:02:12 +00:00
"livetvnewrecording.js" ,
2013-12-20 20:09:49 +00:00
"livetvprogram.js" ,
2013-12-01 06:25:19 +00:00
"livetvrecording.js" ,
2013-11-14 22:22:46 +00:00
"livetvrecordings.js" ,
2013-11-29 18:44:51 +00:00
"livetvtimer.js" ,
2013-12-14 15:49:11 +00:00
"livetvseriestimer.js" ,
"livetvseriestimers.js" ,
2013-11-27 19:04:19 +00:00
"livetvtimers.js" ,
2013-03-26 18:32:01 +00:00
"loginpage.js" ,
"logpage.js" ,
"medialibrarypage.js" ,
"mediaplayer.js" ,
"metadataconfigurationpage.js" ,
"metadataimagespage.js" ,
2013-12-18 04:39:44 +00:00
"metadataimageextraction.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" ,
2013-11-21 20:48:26 +00:00
"musicalbumartists.js" ,
2013-04-22 04:38:03 +00:00
"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" ,
2013-10-25 15:52:10 +00:00
"usersettings.js" ,
2013-03-26 18:32:01 +00:00
"wizardfinishpage.js" ,
2013-12-23 03:46:03 +00:00
"wizardimagesettings.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-12-15 17:42:15 +00:00
await AppendResource ( memoryStream , "thirdparty/jquery-1.9.1.min.js" , newLineBytes ) . ConfigureAwait ( false ) ;
await AppendResource ( memoryStream , "thirdparty/jquerymobile-1.3.2/jquery.mobile-1.3.2.min.js" , newLineBytes ) . ConfigureAwait ( false ) ;
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-12-15 17:24:05 +00:00
await AppendResource ( memoryStream , "thirdparty/autonumeric/autoNumeric.min.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-12-20 20:09:49 +00:00
"userimage.css" ,
"livetv.css"
2013-04-01 00:22:38 +00:00
} ;
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
2013-10-31 14:03:23 +00:00
using ( var fs = _fileSystem . GetFileStream ( path , FileMode . Open , FileAccess . Read , FileShare . ReadWrite , true ) )
2013-04-01 00:22:38 +00:00
{
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
}
}