aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.ServerApplication
diff options
context:
space:
mode:
authorLukePulverenti <luke.pulverenti@gmail.com>2013-02-20 20:33:05 -0500
committerLukePulverenti <luke.pulverenti@gmail.com>2013-02-20 20:33:05 -0500
commit767cdc1f6f6a63ce997fc9476911e2c361f9d402 (patch)
tree49add55976f895441167c66cfa95e5c7688d18ce /MediaBrowser.ServerApplication
parent845554722efaed872948a9e0f7202e3ef52f1b6e (diff)
Pushing missing changes
Diffstat (limited to 'MediaBrowser.ServerApplication')
-rw-r--r--MediaBrowser.ServerApplication/App.config74
-rw-r--r--MediaBrowser.ServerApplication/App.xaml.cs262
-rw-r--r--MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml63
-rw-r--r--MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml.cs249
-rw-r--r--MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml37
-rw-r--r--MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml.cs144
-rw-r--r--MediaBrowser.ServerApplication/LibraryExplorer.xaml65
-rw-r--r--MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs581
-rw-r--r--MediaBrowser.ServerApplication/MainWindow.xaml94
-rw-r--r--MediaBrowser.ServerApplication/MainWindow.xaml.cs444
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj487
-rw-r--r--MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs105
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Icon.icobin146168 -> 140865 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Loading/1.icobin0 -> 151319 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Loading/2.icobin0 -> 151909 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Loading/3.icobin0 -> 152352 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Loading/4.icobin0 -> 153201 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Loading/5.icobin0 -> 154508 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Loading/6.icobin0 -> 153527 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/album.pngbin0 -> 13162 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/artist.pngbin0 -> 13226 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/audio.pngbin0 -> 7694 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/boxset.pngbin0 -> 8600 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/episode.pngbin0 -> 8456 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/folder.jpgbin0 -> 22954 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/folder.pngbin0 -> 11992 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.icobin179144 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.icobin176716 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.icobin175427 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.icobin176666 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/mblogoblackfull.pngbin0 -> 59905 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/mblogowhitefull.pngbin0 -> 59826 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/movie.pngbin0 -> 15275 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/persons.pngbin0 -> 5132 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/season.pngbin0 -> 1318 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/series.pngbin0 -> 1155 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/starEmpty.pngbin0 -> 1799 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/starFull.pngbin0 -> 2498 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/starHalf.pngbin0 -> 2020 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/trailer.pngbin0 -> 4910 bytes
-rw-r--r--MediaBrowser.ServerApplication/app.manifest51
-rw-r--r--MediaBrowser.ServerApplication/packages.config7
42 files changed, 2224 insertions, 439 deletions
diff --git a/MediaBrowser.ServerApplication/App.config b/MediaBrowser.ServerApplication/App.config
index a5c9453388..4269ade643 100644
--- a/MediaBrowser.ServerApplication/App.config
+++ b/MediaBrowser.ServerApplication/App.config
@@ -1,25 +1,51 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <appSettings>
- <add key="ProgramDataPath" value="..\..\..\ProgramData-Server" />
- </appSettings>
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
- </startup>
- <runtime>
- <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
- <dependentAssembly>
- <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.Reactive.Core" publicKeyToken="f300afd708cefcd3" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-2.0.20823.0" newVersion="2.0.20823.0" />
- </dependentAssembly>
- <dependentAssembly>
- <assemblyIdentity name="System.Reactive.Interfaces" publicKeyToken="f300afd708cefcd3" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-2.0.20823.0" newVersion="2.0.20823.0" />
- </dependentAssembly>
- </assemblyBinding>
- </runtime>
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <configSections>
+ <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
+ </configSections>
+ <system.diagnostics>
+ <assert assertuienabled="false" />
+ </system.diagnostics>
+ <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <targets async="true">
+ </targets>
+ </nlog>
+ <appSettings>
+ <add key="DebugProgramDataPath" value="..\..\..\..\ProgramData-Server" />
+ <add key="ReleaseProgramDataPath" value="%CommonApplicationData%" />
+ <add key="ProgramDataFolderName" value="MediaBrowser-Server"/>
+ <add key="ClientSettingsProvider.ServiceUri" value="" />
+ </appSettings>
+ <startup>
+ <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+ </startup>
+ <runtime>
+ <gcServer enabled ="true" />
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reactive.Core" publicKeyToken="f300afd708cefcd3" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-2.0.20823.0" newVersion="2.0.20823.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reactive.Interfaces" publicKeyToken="f300afd708cefcd3" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-2.0.20823.0" newVersion="2.0.20823.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+ <system.web>
+ <membership defaultProvider="ClientAuthenticationMembershipProvider">
+ <providers>
+ <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
+ </providers>
+ </membership>
+ <roleManager defaultProvider="ClientRoleProvider" enabled="true">
+ <providers>
+ <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
+ </providers>
+ </roleManager>
+ </system.web>
</configuration> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs
index 41fb8f24e7..387ae9577d 100644
--- a/MediaBrowser.ServerApplication/App.xaml.cs
+++ b/MediaBrowser.ServerApplication/App.xaml.cs
@@ -1,67 +1,195 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Common.UI;
-using MediaBrowser.Controller;
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Windows;
-
-namespace MediaBrowser.ServerApplication
-{
- /// <summary>
- /// Interaction logic for App.xaml
- /// </summary>
- public partial class App : BaseApplication, IApplication
- {
- [STAThread]
- public static void Main()
- {
- RunApplication<App>("MediaBrowserServer");
- }
-
- protected override void OnSecondInstanceLaunched(IList<string> args)
- {
- base.OnSecondInstanceLaunched(args);
-
- OpenDashboard();
- InitializeComponent();
- }
-
- public static void OpenDashboard()
- {
- OpenUrl("http://localhost:" + Kernel.Instance.Configuration.HttpServerPortNumber + "/mediabrowser/dashboard/index.html");
- }
-
- public static void OpenUrl(string url)
- {
- var process = new Process
- {
- StartInfo = new ProcessStartInfo
- {
- FileName = url
- },
-
- EnableRaisingEvents = true
- };
-
- process.Exited += ProcessExited;
-
- process.Start();
- }
-
- static void ProcessExited(object sender, EventArgs e)
- {
- (sender as Process).Dispose();
- }
-
- protected override IKernel InstantiateKernel()
- {
- return new Kernel();
- }
-
- protected override Window InstantiateMainWindow()
- {
- return new MainWindow();
- }
- }
-}
+using MediaBrowser.Common.IO;
+using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.UI;
+using MediaBrowser.Controller;
+using MediaBrowser.IsoMounter;
+using MediaBrowser.Server.Uninstall;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Windows;
+
+namespace MediaBrowser.ServerApplication
+{
+ /// <summary>
+ /// Interaction logic for App.xaml
+ /// </summary>
+ public partial class App : BaseApplication, IApplication
+ {
+ /// <summary>
+ /// Defines the entry point of the application.
+ /// </summary>
+ [STAThread]
+ public static void Main()
+ {
+ RunApplication<App>("MediaBrowserServer");
+ }
+
+ /// <summary>
+ /// Gets the instance.
+ /// </summary>
+ /// <value>The instance.</value>
+ public static App Instance
+ {
+ get
+ {
+ return Current as App;
+ }
+ }
+
+ /// <summary>
+ /// Gets the name of the product.
+ /// </summary>
+ /// <value>The name of the product.</value>
+ protected override string ProductName
+ {
+ get { return Globals.ProductName; }
+ }
+
+ /// <summary>
+ /// Gets the name of the publisher.
+ /// </summary>
+ /// <value>The name of the publisher.</value>
+ protected override string PublisherName
+ {
+ get { return Globals.PublisherName; }
+ }
+
+ /// <summary>
+ /// Gets the name of the suite.
+ /// </summary>
+ /// <value>The name of the suite.</value>
+ protected override string SuiteName
+ {
+ get { return Globals.SuiteName; }
+ }
+
+ /// <summary>
+ /// Gets the name of the uninstaller file.
+ /// </summary>
+ /// <value>The name of the uninstaller file.</value>
+ protected override string UninstallerFileName
+ {
+ get { return "MediaBrowser.Server.Uninstall.exe"; }
+ }
+
+ /// <summary>
+ /// Instantiates the iso manager.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <returns>IIsoManager.</returns>
+ protected override IIsoManager InstantiateIsoManager(IKernel kernel)
+ {
+ return new IsoManager(kernel);
+ }
+
+ /// <summary>
+ /// Called when [second instance launched].
+ /// </summary>
+ /// <param name="args">The args.</param>
+ protected override void OnSecondInstanceLaunched(IList<string> args)
+ {
+ base.OnSecondInstanceLaunched(args);
+
+ OpenDashboard();
+ InitializeComponent();
+ }
+
+ /// <summary>
+ /// Opens the dashboard.
+ /// </summary>
+ public static void OpenDashboard()
+ {
+ OpenDashboardPage("dashboard.html");
+ }
+
+ /// <summary>
+ /// Opens the dashboard page.
+ /// </summary>
+ /// <param name="page">The page.</param>
+ public static void OpenDashboardPage(string page)
+ {
+ var url = "http://localhost:" + Controller.Kernel.Instance.Configuration.HttpServerPortNumber + "/" +
+ Controller.Kernel.Instance.WebApplicationName + "/dashboard/" + page;
+
+ url = AddAutoLoginToDashboardUrl(url);
+
+ OpenUrl(url);
+ }
+
+ /// <summary>
+ /// Adds the auto login to dashboard URL.
+ /// </summary>
+ /// <param name="url">The URL.</param>
+ /// <returns>System.String.</returns>
+ public static string AddAutoLoginToDashboardUrl(string url)
+ {
+ var user = Controller.Kernel.Instance.Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
+
+ if (user != null)
+ {
+ if (url.IndexOf('?') == -1)
+ {
+ url += "?u=" + user.Id;
+ }
+ else
+ {
+ url += "&u=" + user.Id;
+ }
+ }
+
+ return url;
+ }
+
+ /// <summary>
+ /// Opens the URL.
+ /// </summary>
+ /// <param name="url">The URL.</param>
+ public static void OpenUrl(string url)
+ {
+ var process = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = url
+ },
+
+ EnableRaisingEvents = true
+ };
+
+ process.Exited += ProcessExited;
+
+ process.Start();
+ }
+
+ /// <summary>
+ /// Processes the exited.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
+ static void ProcessExited(object sender, EventArgs e)
+ {
+ ((Process)sender).Dispose();
+ }
+
+ /// <summary>
+ /// Instantiates the kernel.
+ /// </summary>
+ /// <returns>IKernel.</returns>
+ protected override IKernel InstantiateKernel()
+ {
+ return new Kernel();
+ }
+
+ /// <summary>
+ /// Instantiates the main window.
+ /// </summary>
+ /// <returns>Window.</returns>
+ protected override Window InstantiateMainWindow()
+ {
+ return new MainWindow();
+ }
+ }
+}
diff --git a/MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml b/MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml
new file mode 100644
index 0000000000..22a3ea696c
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml
@@ -0,0 +1,63 @@
+<UserControl x:Class="MediaBrowser.ServerApplication.Controls.ItemUpdateNotification"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+
+ <Grid MaxHeight="280" MaxWidth="600" Margin="20">
+ <Border BorderThickness="0" Background="#333333">
+ <Border.Effect>
+ <DropShadowEffect BlurRadius="25" ShadowDepth="0">
+
+ </DropShadowEffect>
+ </Border.Effect>
+ </Border>
+ <Grid>
+ <Grid.Background>
+ <LinearGradientBrush SpreadMethod="Reflect" ColorInterpolationMode="SRgbLinearInterpolation" StartPoint="0,0" EndPoint="0,1" >
+ <GradientStop Color="#ff222222" Offset="0" />
+ <GradientStop Color="#ffbbbbbb" Offset="1.0" />
+ </LinearGradientBrush>
+ </Grid.Background>
+
+ <Grid Margin="20">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="auto"></RowDefinition>
+ <RowDefinition Height="*"></RowDefinition>
+ </Grid.RowDefinitions>
+
+ <StackPanel Orientation="Vertical" Grid.Row="0">
+ <Image x:Name="imgParentLogo" Stretch="Uniform" Height="40" RenderOptions.BitmapScalingMode="Fant" HorizontalAlignment="Left"></Image>
+ <TextBlock x:Name="txtParentName" FontSize="26" Foreground="White"></TextBlock>
+ <TextBlock x:Name="txtName" FontSize="26" Foreground="White"></TextBlock>
+ </StackPanel>
+
+ <Grid Grid.Row="1" Margin="0 20 0 0">
+
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="auto"></ColumnDefinition>
+ <ColumnDefinition Width="*"></ColumnDefinition>
+ </Grid.ColumnDefinitions>
+
+ <Grid.RowDefinitions>
+ <RowDefinition Height="auto"></RowDefinition>
+ <RowDefinition Height="auto"></RowDefinition>
+ <RowDefinition Height="*"></RowDefinition>
+ <RowDefinition Height="auto"></RowDefinition>
+ </Grid.RowDefinitions>
+
+ <StackPanel Orientation="Vertical" Grid.Column="0" Grid.RowSpan="4" Margin="0 0 20 0" VerticalAlignment="Top">
+ <Image x:Name="img" Stretch="Uniform" RenderOptions.BitmapScalingMode="Fant" Height="150"></Image>
+ </StackPanel>
+
+ <TextBlock x:Name="txtTagline" Foreground="White" Grid.Column="1" Grid.Row="0" Margin="0 0 0 20" TextWrapping="Wrap" FontStyle="Italic"></TextBlock>
+ <StackPanel x:Name="pnlRating" Orientation="Horizontal" Margin="0 2 0 20" Grid.Column="1" Grid.Row="1"></StackPanel>
+ <TextBlock x:Name="txtOverview" Foreground="White" Grid.Column="1" Grid.Row="2" TextWrapping="Wrap" Margin="0 0 0 20"></TextBlock>
+ <TextBlock x:Name="txtPremeireDate" Foreground="White" Grid.Column="1" Grid.Row="3"></TextBlock>
+ </Grid>
+ </Grid>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml.cs b/MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml.cs
new file mode 100644
index 0000000000..8cb42f0e5a
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Controls/ItemUpdateNotification.xaml.cs
@@ -0,0 +1,249 @@
+using MediaBrowser.Common.Logging;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+
+namespace MediaBrowser.ServerApplication.Controls
+{
+ /// <summary>
+ /// Interaction logic for ItemUpdateNotification.xaml
+ /// </summary>
+ public partial class ItemUpdateNotification : UserControl
+ {
+ /// <summary>
+ /// The logger
+ /// </summary>
+ private static readonly ILogger Logger = LogManager.GetLogger("MultiItemUpdateNotification");
+
+ /// <summary>
+ /// Gets the children changed event args.
+ /// </summary>
+ /// <value>The children changed event args.</value>
+ private BaseItem Item
+ {
+ get { return DataContext as BaseItem; }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ItemUpdateNotification" /> class.
+ /// </summary>
+ public ItemUpdateNotification()
+ {
+ InitializeComponent();
+
+ Loaded += ItemUpdateNotification_Loaded;
+ }
+
+ /// <summary>
+ /// Handles the Loaded event of the ItemUpdateNotification control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ void ItemUpdateNotification_Loaded(object sender, RoutedEventArgs e)
+ {
+ DisplayItem(Item);
+ }
+
+ /// <summary>
+ /// Gets the display name.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="includeParentName">if set to <c>true</c> [include parent name].</param>
+ /// <returns>System.String.</returns>
+ internal static string GetDisplayName(BaseItem item, bool includeParentName)
+ {
+ var name = item.Name;
+
+ if (item.ProductionYear.HasValue && !(item is Episode))
+ {
+ name += string.Format(" ({0})", item.ProductionYear);
+ }
+
+ var episode = item as Episode;
+ if (episode != null)
+ {
+ var indexNumbers = new List<int>();
+
+ if (episode.Season.IndexNumber.HasValue)
+ {
+ indexNumbers.Add(episode.Season.IndexNumber.Value);
+ }
+ if (episode.IndexNumber.HasValue)
+ {
+ indexNumbers.Add(episode.IndexNumber.Value);
+ }
+ var indexNumber = string.Join(".", indexNumbers.ToArray());
+
+ name = string.Format("{0} - {1}", indexNumber, name);
+
+ if (includeParentName)
+ {
+ name = episode.Series.Name + " - " + name;
+ }
+ }
+
+ if (includeParentName)
+ {
+ var season = item as Season;
+
+ if (season != null)
+ {
+ name = season.Series.Name + " - " + name;
+ }
+ }
+
+ return name;
+ }
+
+ /// <summary>
+ /// Displays the parent title.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void DisplayParentTitle(BaseItem item)
+ {
+ if (!(item is Episode || item is Season))
+ {
+ txtParentName.Visibility = Visibility.Collapsed;
+ imgParentLogo.Visibility = Visibility.Collapsed;
+ return;
+ }
+
+ var series = item is Episode ? (item as Episode).Series : (item as Season).Series;
+
+ var logo = series.GetImage(ImageType.Logo);
+
+ if (string.IsNullOrEmpty(logo))
+ {
+ imgParentLogo.Visibility = Visibility.Collapsed;
+ txtParentName.Visibility = Visibility.Visible;
+ }
+ else
+ {
+ imgParentLogo.Visibility = Visibility.Visible;
+ txtParentName.Visibility = Visibility.Collapsed;
+ imgParentLogo.Source = App.Instance.GetBitmapImage(logo);
+ }
+
+ txtParentName.Text = series.Name;
+ }
+
+ /// <summary>
+ /// Displays the title.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void DisplayTitle(BaseItem item)
+ {
+ txtName.Text = GetDisplayName(item, false);
+ }
+
+ /// <summary>
+ /// Displays the item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void DisplayItem(BaseItem item)
+ {
+ DisplayParentTitle(item);
+ DisplayTitle(item);
+ DisplayRating(item);
+
+ var path = MultiItemUpdateNotification.GetImagePath(item);
+
+ if (string.IsNullOrEmpty(path))
+ {
+ img.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ img.Visibility = Visibility.Visible;
+
+ try
+ {
+ img.Source = App.Instance.GetBitmapImage(path);
+ }
+ catch (FileNotFoundException)
+ {
+ Logger.Error("Image file not found {0}", path);
+ }
+ }
+
+ if (string.IsNullOrEmpty(item.Overview))
+ {
+ txtOverview.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ txtOverview.Visibility = Visibility.Visible;
+ txtOverview.Text = item.Overview;
+ }
+
+ if (item.Taglines == null || item.Taglines.Count == 0)
+ {
+ txtTagline.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ txtTagline.Visibility = Visibility.Visible;
+ txtTagline.Text = item.Taglines[0];
+ }
+
+ if (!item.PremiereDate.HasValue)
+ {
+ txtPremeireDate.Visibility = Visibility.Collapsed;
+ }
+ else
+ {
+ txtPremeireDate.Visibility = Visibility.Visible;
+ txtPremeireDate.Text = "Premiered " + item.PremiereDate.Value.ToShortDateString();
+ }
+ }
+
+ /// <summary>
+ /// Displays the rating.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ private void DisplayRating(BaseItem item)
+ {
+ if (!item.CommunityRating.HasValue)
+ {
+ pnlRating.Visibility = Visibility.Collapsed;
+ return;
+ }
+
+ pnlRating.Children.Clear();
+ pnlRating.Visibility = Visibility.Visible;
+
+ var rating = item.CommunityRating.Value;
+
+ for (var i = 0; i < 10; i++)
+ {
+ Image image;
+ if (rating < i - 1)
+ {
+ image = App.Instance.GetImage(new Uri("../Resources/Images/starEmpty.png", UriKind.Relative));
+ }
+ else if (rating < i)
+ {
+ image = App.Instance.GetImage(new Uri("../Resources/Images/starHalf.png", UriKind.Relative));
+ }
+ else
+ {
+ image = App.Instance.GetImage(new Uri("../Resources/Images/starFull.png", UriKind.Relative));
+ }
+
+ RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.Fant);
+
+ image.Stretch = Stretch.Uniform;
+ image.Height = 16;
+
+ pnlRating.Children.Add(image);
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml b/MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml
new file mode 100644
index 0000000000..5d3fb785c9
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml
@@ -0,0 +1,37 @@
+<UserControl x:Class="MediaBrowser.ServerApplication.Controls.MultiItemUpdateNotification"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ mc:Ignorable="d"
+ d:DesignHeight="300" d:DesignWidth="300">
+
+ <Grid MaxHeight="400" MaxWidth="600" Margin="20">
+ <Border BorderThickness="0" Background="#333333">
+ <Border.Effect>
+ <DropShadowEffect BlurRadius="25" ShadowDepth="0">
+
+ </DropShadowEffect>
+ </Border.Effect>
+ </Border>
+ <Grid>
+ <Grid.Background>
+ <LinearGradientBrush SpreadMethod="Reflect" ColorInterpolationMode="SRgbLinearInterpolation" StartPoint="0,0" EndPoint="0,1" >
+ <GradientStop Color="#ff222222" Offset="0" />
+ <GradientStop Color="#ffbbbbbb" Offset="1" />
+ </LinearGradientBrush>
+ </Grid.Background>
+
+ <Grid Margin="20">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="auto"></RowDefinition>
+ <RowDefinition Height="*"></RowDefinition>
+ </Grid.RowDefinitions>
+
+ <TextBlock x:Name="header" FontSize="26" Foreground="White" Grid.Row="0"></TextBlock>
+
+ <UniformGrid x:Name="itemsPanel" Columns="4" Margin="0 20 0 0" Grid.Row="1"></UniformGrid>
+ </Grid>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml.cs b/MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml.cs
new file mode 100644
index 0000000000..383e4ccbe7
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Controls/MultiItemUpdateNotification.xaml.cs
@@ -0,0 +1,144 @@
+using MediaBrowser.Common.Logging;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+
+namespace MediaBrowser.ServerApplication.Controls
+{
+ /// <summary>
+ /// Interaction logic for MultiItemUpdateNotification.xaml
+ /// </summary>
+ public partial class MultiItemUpdateNotification : UserControl
+ {
+ /// <summary>
+ /// The logger
+ /// </summary>
+ private static readonly ILogger Logger = LogManager.GetLogger("MultiItemUpdateNotification");
+
+ /// <summary>
+ /// Gets the children changed event args.
+ /// </summary>
+ /// <value>The children changed event args.</value>
+ private List<BaseItem> Items
+ {
+ get { return DataContext as List<BaseItem>; }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MultiItemUpdateNotification" /> class.
+ /// </summary>
+ public MultiItemUpdateNotification()
+ {
+ InitializeComponent();
+
+ Loaded += MultiItemUpdateNotification_Loaded;
+ }
+
+ /// <summary>
+ /// Handles the Loaded event of the MultiItemUpdateNotification control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ void MultiItemUpdateNotification_Loaded(object sender, RoutedEventArgs e)
+ {
+ header.Text = string.Format("{0} New Items!", Items.Count);
+
+ PopulateItems();
+ }
+
+ /// <summary>
+ /// Populates the items.
+ /// </summary>
+ private void PopulateItems()
+ {
+ itemsPanel.Children.Clear();
+
+ var items = Items;
+
+ const int maxItemsToDisplay = 8;
+ var index = 0;
+
+ foreach (var item in items)
+ {
+ if (index >= maxItemsToDisplay)
+ {
+ break;
+ }
+
+ // Try our best to find an image
+ var path = GetImagePath(item);
+
+ if (string.IsNullOrEmpty(path))
+ {
+ continue;
+ }
+
+ Image img;
+
+ try
+ {
+ img = App.Instance.GetImage(path);
+ }
+ catch (FileNotFoundException)
+ {
+ Logger.Error("Image file not found {0}", path);
+ continue;
+ }
+
+ img.Stretch = Stretch.Uniform;
+ img.Margin = new Thickness(0, 0, 5, 5);
+ img.ToolTip = ItemUpdateNotification.GetDisplayName(item, true);
+ RenderOptions.SetBitmapScalingMode(img, BitmapScalingMode.Fant);
+ itemsPanel.Children.Add(img);
+
+ index++;
+ }
+ }
+
+
+
+ /// <summary>
+ /// Gets the image path.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <returns>System.String.</returns>
+ internal static string GetImagePath(BaseItem item)
+ {
+ // Try our best to find an image
+ var path = item.PrimaryImagePath;
+
+ if (string.IsNullOrEmpty(path) && item.BackdropImagePaths != null)
+ {
+ path = item.BackdropImagePaths.FirstOrDefault();
+ }
+
+ if (string.IsNullOrEmpty(path))
+ {
+ path = item.GetImage(ImageType.Thumb);
+ }
+
+ if (string.IsNullOrEmpty(path))
+ {
+ path = item.GetImage(ImageType.Art);
+ }
+
+ if (string.IsNullOrEmpty(path))
+ {
+ path = item.GetImage(ImageType.Logo);
+ }
+
+ if (string.IsNullOrEmpty(path))
+ {
+ path = item.GetImage(ImageType.Disc);
+ }
+
+ return path;
+ }
+ }
+}
diff --git a/MediaBrowser.ServerApplication/LibraryExplorer.xaml b/MediaBrowser.ServerApplication/LibraryExplorer.xaml
new file mode 100644
index 0000000000..2971293c18
--- /dev/null
+++ b/MediaBrowser.ServerApplication/LibraryExplorer.xaml
@@ -0,0 +1,65 @@
+<Window x:Class="MediaBrowser.ServerApplication.LibraryExplorer"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="clr-namespace:MediaBrowser.ServerApplication"
+ Title="Library Explorer" Height="733.75" Width="893">
+ <Grid Margin="0,0,0,10">
+ <TreeView x:Name="tvwLibrary" HorizontalAlignment="Left" Margin="10,54,0,0" Width="399" SelectedItemChanged="tvwLibrary_SelectedItemChanged" Height="417" VerticalAlignment="Top">
+ <TreeView.Resources>
+ <Style TargetType="{x:Type TreeViewItem}">
+ <Setter Property="HeaderTemplate">
+ <Setter.Value>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal">
+ <Image Name="img" Width="20" Height="20" Stretch="Fill"
+ Source="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
+ AncestorType={x:Type TreeViewItem}},
+ Path=Tag,
+ Converter={x:Static local:ItemToImageConverter.Instance}}"
+ />
+ <TextBlock Text="{Binding}" Margin="5,0" />
+ </StackPanel>
+ </DataTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ </TreeView.Resources>
+ </TreeView>
+
+ <Button x:Name="btnLoad" Content="Load" HorizontalAlignment="Left" Margin="218,25,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.373,0.045" Click="btnLoad_Click" Visibility="Hidden"/>
+ <TextBox x:Name="txtData" Margin="427,54,0,0" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Height="417" Width="444" VerticalScrollBarVisibility="Auto" />
+
+ <Label Content="Contents&#xD;&#xA;" HorizontalAlignment="Left" Margin="440,23,0,0" VerticalAlignment="Top" Height="26" Width="74" FontWeight="Bold"/>
+ <ListView x:Name="lstPreviews" HorizontalAlignment="Left" Margin="10,476,0,10" Width="861">
+ <ListView.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel Orientation="Horizontal" MinWidth="100" />
+ </ItemsPanelTemplate>
+ </ListView.ItemsPanel>
+ <ListView.ItemTemplate>
+ <DataTemplate >
+ <Grid >
+ <Grid.RowDefinitions>
+ <RowDefinition Height="150" />
+ <RowDefinition Height="25" />
+ </Grid.RowDefinitions>
+ <Image Source="{Binding Preview}" Height="140" MaxWidth="300" Grid.Row="0"/>
+ <TextBlock Text="{Binding Name}" Grid.Row="1" FontFamily="Segoe Media Center" FontSize="14" FontWeight="Bold" HorizontalAlignment="Center"/>
+ </Grid>
+ </DataTemplate>
+ </ListView.ItemTemplate>
+ </ListView>
+ <ComboBox x:Name="ddlProfile" HorizontalAlignment="Left" Margin="10,25,0,0" VerticalAlignment="Top" Width="191" SelectionChanged="ddlProfile_SelectionChanged"/>
+ <Label Content="View;" HorizontalAlignment="Left" Margin="10,1,0,0" VerticalAlignment="Top" Height="24" Width="119" FontWeight="Bold" />
+ <Label x:Name="lblLoading" Content="Loading..." HorizontalAlignment="Left" Margin="140,150,0,0" VerticalAlignment="Top" FontSize="18" Foreground="LightGray" Visibility="Hidden" FontStyle="Italic" FontWeight="Bold" RenderTransformOrigin="0.258,0.5"/>
+ <Label x:Name="lblObjType" Content="Type:&#xA;" HorizontalAlignment="Left" Margin="534,23,0,0" VerticalAlignment="Top" Height="26" Width="158" FontWeight="Bold"/>
+ <Button x:Name="btnRefresh" Content="Refresh" HorizontalAlignment="Left" Margin="712,25,0,0" VerticalAlignment="Top" Width="82" Click="btnRefresh_Click"/>
+ <CheckBox x:Name="cbxForce" Content="Force" HorizontalAlignment="Left" Margin="816,28,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.14,-0.562" Width="51"/>
+ <ComboBox x:Name="ddlIndexBy" HorizontalAlignment="Left" Margin="218,25,0,0" VerticalAlignment="Top" Width="92" SelectionChanged="ddlIndexBy_SelectionChanged"/>
+ <Label x:Name="lblIndexBy" Content="Index By" HorizontalAlignment="Left" Margin="218,0,0,0" VerticalAlignment="Top" Height="34" Width="75" FontWeight="Bold" />
+ <ComboBox x:Name="ddlSortBy" HorizontalAlignment="Left" Margin="315,25,0,0" VerticalAlignment="Top" Width="94" SelectionChanged="ddlSortBy_SelectionChanged"/>
+ <Label x:Name="lblSortBy" Content="Sort By" HorizontalAlignment="Left" Margin="314,0,0,0" VerticalAlignment="Top" Height="34" Width="75" FontWeight="Bold" />
+ <Label x:Name="lblVersion" Content="Version: " HorizontalAlignment="Left" Margin="729,-6,0,0" VerticalAlignment="Top" Width="138"/>
+
+ </Grid>
+</Window>
diff --git a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
new file mode 100644
index 0000000000..8158b8268c
--- /dev/null
+++ b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
@@ -0,0 +1,581 @@
+using MediaBrowser.Common.Serialization;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Localization;
+using MediaBrowser.Model.Entities;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Input;
+using System.Windows.Media.Imaging;
+
+namespace MediaBrowser.ServerApplication
+{
+ /// <summary>
+ /// Interaction logic for LibraryExplorer.xaml
+ /// </summary>
+ public partial class LibraryExplorer : Window
+ {
+ /// <summary>
+ /// The current user
+ /// </summary>
+ private User CurrentUser;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="LibraryExplorer" /> class.
+ /// </summary>
+ public LibraryExplorer()
+ {
+ InitializeComponent();
+ lblVersion.Content = "Version: " + Kernel.Instance.DisplayVersion;
+ foreach (var user in Kernel.Instance.Users)
+ ddlProfile.Items.Add(user);
+ ddlProfile.Items.Insert(0,new User {Name = "Physical"});
+ ddlProfile.SelectedIndex = 0;
+ ddlIndexBy.Visibility = ddlSortBy.Visibility = lblIndexBy.Visibility = lblSortBy.Visibility = Visibility.Hidden;
+ }
+
+ /// <summary>
+ /// Handles the Click event of the btnLoad control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void btnLoad_Click(object sender, RoutedEventArgs e)
+ {
+ }
+
+ /// <summary>
+ /// Loads the tree.
+ /// </summary>
+ /// <returns>Task.</returns>
+ private async Task LoadTree()
+ {
+ tvwLibrary.Items.Clear();
+ lblLoading.Visibility = Visibility.Visible;
+ //grab UI context so we can update within the below task
+ var ui = TaskScheduler.FromCurrentSynchronizationContext();
+ //this whole async thing doesn't really work in this instance since all my work pretty much needs to be on the UI thread...
+ Cursor = Cursors.Wait;
+ await Task.Run(() =>
+ {
+ IEnumerable<BaseItem> children;
+ children = CurrentUser.Name == "Physical" ? Kernel.Instance.RootFolder.Children.OrderBy(i => i.SortName) : Kernel.Instance.RootFolder.GetChildren(CurrentUser, sortBy: LocalizedStrings.Instance.GetString("NameDispPref"));
+
+ foreach (Folder folder in children)
+ {
+
+ var currentFolder = folder;
+ Task.Factory.StartNew(() =>
+ {
+ var prefs = ddlProfile.SelectedItem != null ? currentFolder.GetDisplayPrefs(ddlProfile.SelectedItem as User, false) ?? new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")} : new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")};
+ var node = new TreeViewItem { Tag = currentFolder };
+ AddChildren(node, currentFolder.GetChildren(CurrentUser, prefs.IndexBy, prefs.SortBy ?? LocalizedStrings.Instance.GetString("NameDispPref")), CurrentUser);
+ node.Header = currentFolder.Name + " (" +
+ node.Items.Count + ")";
+ tvwLibrary.Items.Add(node);
+ }, CancellationToken.None, TaskCreationOptions.None, ui);
+ }
+ });
+ lblLoading.Visibility = Visibility.Hidden;
+ Cursor = Cursors.Arrow;
+
+ }
+
+ /// <summary>
+ /// Adds the children.
+ /// </summary>
+ /// <param name="parent">The parent.</param>
+ /// <param name="children">The children.</param>
+ /// <param name="user">The user.</param>
+ private void AddChildren(TreeViewItem parent, IEnumerable<BaseItem> children, User user)
+ {
+ foreach (var item in children)
+ {
+ var node = new TreeViewItem { Tag = item };
+ var subFolder = item as Folder;
+ if (subFolder != null)
+ {
+ var prefs = subFolder.GetDisplayPrefs(user, false) ?? new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")};
+ AddChildren(node, subFolder.GetChildren(user, sortBy: prefs.SortBy), user);
+ node.Header = item.Name + " (" + node.Items.Count + ")";
+ }
+ else
+ {
+ node.Header = item.Name;
+ }
+ parent.Items.Add(node);
+ }
+ }
+
+ /// <summary>
+ /// TVWs the library_ selected item changed.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ private async void tvwLibrary_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
+ {
+ if (tvwLibrary.SelectedItem != null)
+ {
+ var item = (BaseItem)(tvwLibrary.SelectedItem as TreeViewItem).Tag;
+ lblObjType.Content = "Type: " + item.GetType().Name;
+ var trailers = item.LocalTrailers != null && item.LocalTrailers.Count > 0
+ ? "\nTrailers: " +
+ String.Join(Environment.NewLine, item.LocalTrailers.Select(t => t.Path))
+ : "";
+ var movie = item as Movie;
+ var features = movie != null && movie.SpecialFeatures != null
+ ? "\nSpecial Features: " +
+ string.Join(Environment.NewLine,
+ movie.SpecialFeatures.Select(f => f.Path))
+ : "";
+ var folder = item as Folder;
+ if (folder != null)
+ {
+ lblIndexBy.Visibility = ddlIndexBy.Visibility = ddlSortBy.Visibility = lblSortBy.Visibility = Visibility.Visible;
+ ddlIndexBy.ItemsSource = folder.IndexByOptionStrings;
+ ddlSortBy.ItemsSource = folder.SortByOptionStrings;
+ var prefs = folder.GetDisplayPrefs(ddlProfile.SelectedItem as User, false);
+ ddlIndexBy.SelectedItem = prefs != null
+ ? prefs.IndexBy ?? LocalizedStrings.Instance.GetString("NoneDispPref")
+ : LocalizedStrings.Instance.GetString("NoneDispPref");
+ ddlSortBy.SelectedItem = prefs != null
+ ? prefs.SortBy ?? LocalizedStrings.Instance.GetString("NameDispPref")
+ : LocalizedStrings.Instance.GetString("NameDispPref");
+ }
+ else
+ {
+ lblIndexBy.Visibility = ddlIndexBy.Visibility = ddlSortBy.Visibility = lblSortBy.Visibility = Visibility.Hidden;
+
+ }
+ txtData.Text = FormatJson(JsonSerializer.SerializeToString(item)) + trailers + features;
+
+ var previews = new List<PreviewItem>();
+ await Task.Run(() =>
+ {
+ if (!string.IsNullOrEmpty(item.PrimaryImagePath))
+ {
+ previews.Add(new PreviewItem(item.PrimaryImagePath, "Primary"));
+ }
+ if (item.HasImage(ImageType.Banner))
+ {
+ previews.Add(new PreviewItem(item.GetImage(ImageType.Banner), "Banner"));
+ }
+ if (item.HasImage(ImageType.Logo))
+ {
+ previews.Add(new PreviewItem(item.GetImage(ImageType.Logo), "Logo"));
+ }
+ if (item.HasImage(ImageType.Art))
+ {
+ previews.Add(new PreviewItem(item.GetImage(ImageType.Art), "Art"));
+ }
+ if (item.HasImage(ImageType.Thumb))
+ {
+ previews.Add(new PreviewItem(item.GetImage(ImageType.Thumb), "Thumb"));
+ }
+ if (item.BackdropImagePaths != null)
+ previews.AddRange(
+ item.BackdropImagePaths.Select(
+ image => new PreviewItem(image, "Backdrop")));
+ });
+ lstPreviews.ItemsSource = previews;
+ lstPreviews.Items.Refresh();
+ }
+ }
+
+ /// <summary>
+ /// The INDEN t_ STRING
+ /// </summary>
+ private const string INDENT_STRING = " ";
+ /// <summary>
+ /// Formats the json.
+ /// </summary>
+ /// <param name="str">The STR.</param>
+ /// <returns>System.String.</returns>
+ private static string FormatJson(string str)
+ {
+ var indent = 0;
+ var quoted = false;
+ var sb = new StringBuilder();
+ for (var i = 0; i < str.Length; i++)
+ {
+ var ch = str[i];
+ switch (ch)
+ {
+ case '{':
+ case '[':
+ sb.Append(ch);
+ if (!quoted)
+ {
+ sb.AppendLine();
+ Enumerable.Range(0, ++indent).ForEach(item => sb.Append(INDENT_STRING));
+ }
+ break;
+ case '}':
+ case ']':
+ if (!quoted)
+ {
+ sb.AppendLine();
+ Enumerable.Range(0, --indent).ForEach(item => sb.Append(INDENT_STRING));
+ }
+ sb.Append(ch);
+ break;
+ case '"':
+ sb.Append(ch);
+ bool escaped = false;
+ var index = i;
+ while (index > 0 && str[--index] == '\\')
+ escaped = !escaped;
+ if (!escaped)
+ quoted = !quoted;
+ break;
+ case ',':
+ sb.Append(ch);
+ if (!quoted)
+ {
+ sb.AppendLine();
+ Enumerable.Range(0, indent).ForEach(item => sb.Append(INDENT_STRING));
+ }
+ break;
+ case ':':
+ sb.Append(ch);
+ if (!quoted)
+ sb.Append(" ");
+ break;
+ default:
+ sb.Append(ch);
+ break;
+ }
+ }
+ return sb.ToString();
+ }
+
+ /// <summary>
+ /// Handles the SelectionChanged event of the ddlProfile control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="SelectionChangedEventArgs" /> instance containing the event data.</param>
+ private void ddlProfile_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ CurrentUser = ddlProfile.SelectedItem as User;
+ if (CurrentUser != null)
+ LoadTree().ConfigureAwait(false);
+ }
+
+ /// <summary>
+ /// Handles the Click event of the btnRefresh control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void btnRefresh_Click(object sender, RoutedEventArgs e)
+ {
+ if (tvwLibrary.SelectedItem != null)
+ {
+ var item = ((TreeViewItem)tvwLibrary.SelectedItem).Tag as BaseItem;
+ if (item != null)
+ {
+ item.RefreshMetadata(CancellationToken.None, forceRefresh: cbxForce.IsChecked.Value);
+ tvwLibrary_SelectedItemChanged(this, null);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Handles the SelectionChanged event of the ddlIndexBy control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="SelectionChangedEventArgs" /> instance containing the event data.</param>
+ private async void ddlIndexBy_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (ddlIndexBy.SelectedItem != null)
+ {
+ var treeItem = tvwLibrary.SelectedItem as TreeViewItem;
+ var folder = treeItem != null
+ ? treeItem.Tag as Folder
+ : null;
+ var prefs = folder != null ? folder.GetDisplayPrefs(CurrentUser, true) : new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")};
+ if (folder != null && prefs.IndexBy != ddlIndexBy.SelectedItem as string)
+ {
+ //grab UI context so we can update within the below task
+ var ui = TaskScheduler.FromCurrentSynchronizationContext();
+ Cursor = Cursors.Wait;
+ await Task.Factory.StartNew(() =>
+ {
+ using (
+ new Profiler("Explorer full index expansion for " +
+ folder.Name))
+ {
+ //re-build the current item's children as an index
+ prefs.IndexBy = ddlIndexBy.SelectedItem as string;
+ treeItem.Items.Clear();
+ AddChildren(treeItem,folder.GetChildren(CurrentUser, prefs.IndexBy, prefs.SortBy), CurrentUser);
+ treeItem.Header = folder.Name + "(" +
+ treeItem.Items.Count + ")";
+ Cursor = Cursors.Arrow;
+
+ }
+ }, CancellationToken.None, TaskCreationOptions.None,
+ ui);
+
+ }
+ }
+ }
+
+ /// <summary>
+ /// Handles the SelectionChanged event of the ddlSortBy control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="SelectionChangedEventArgs" /> instance containing the event data.</param>
+ private async void ddlSortBy_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (ddlSortBy.SelectedItem != null)
+ {
+ var treeItem = tvwLibrary.SelectedItem as TreeViewItem;
+ var folder = treeItem != null
+ ? treeItem.Tag as Folder
+ : null;
+ var prefs = folder != null ? folder.GetDisplayPrefs(CurrentUser, true) : new DisplayPreferences();
+ if (folder != null && prefs.SortBy != ddlSortBy.SelectedItem as string)
+ {
+ //grab UI context so we can update within the below task
+ var ui = TaskScheduler.FromCurrentSynchronizationContext();
+ Cursor = Cursors.Wait;
+ await Task.Factory.StartNew(() =>
+ {
+ using (
+ new Profiler("Explorer sorting by " + ddlSortBy.SelectedItem + " for " +
+ folder.Name))
+ {
+ //re-sort
+ prefs.SortBy = ddlSortBy.SelectedItem as string;
+ treeItem.Items.Clear();
+ AddChildren(treeItem,folder.GetChildren(CurrentUser,prefs.IndexBy, prefs.SortBy ?? LocalizedStrings.Instance.GetString("NameDispPref")), CurrentUser);
+ treeItem.Header = folder.Name + "(" +
+ treeItem.Items.Count + ")";
+ Cursor = Cursors.Arrow;
+
+ }
+ }, CancellationToken.None, TaskCreationOptions.None,
+ ui);
+
+ }
+ }
+ }
+
+ }
+
+ /// <summary>
+ /// Class PreviewItem
+ /// </summary>
+ public class PreviewItem
+ {
+
+ /// <summary>
+ /// The preview
+ /// </summary>
+ private readonly string preview;
+ /// <summary>
+ /// The name
+ /// </summary>
+ private readonly string name;
+
+ /// <summary>
+ /// Gets the preview.
+ /// </summary>
+ /// <value>The preview.</value>
+ public string Preview
+ {
+ get { return preview; }
+ }
+
+ /// <summary>
+ /// Gets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ public string Name
+ {
+ get { return name; }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="PreviewItem" /> class.
+ /// </summary>
+ /// <param name="p">The p.</param>
+ /// <param name="n">The n.</param>
+ public PreviewItem(string p, string n)
+ {
+ preview = p;
+ name = n;
+ }
+ }
+
+ /// <summary>
+ /// Class Extensions
+ /// </summary>
+ static class Extensions
+ {
+ /// <summary>
+ /// Fors the each.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="ie">The ie.</param>
+ /// <param name="action">The action.</param>
+ public static void ForEach<T>(this IEnumerable<T> ie, Action<T> action)
+ {
+ foreach (var i in ie)
+ {
+ action(i);
+ }
+ }
+ }
+ #region ItemToImageConverter
+
+ /// <summary>
+ /// Class ItemToImageConverter
+ /// </summary>
+ [ValueConversion(typeof(string), typeof(bool))]
+ public class ItemToImageConverter : IValueConverter
+ {
+ /// <summary>
+ /// The instance
+ /// </summary>
+ public static ItemToImageConverter Instance =
+ new ItemToImageConverter();
+
+ /// <summary>
+ /// Converts a value.
+ /// </summary>
+ /// <param name="value">The value produced by the binding source.</param>
+ /// <param name="targetType">The type of the binding target property.</param>
+ /// <param name="parameter">The converter parameter to use.</param>
+ /// <param name="culture">The culture to use in the converter.</param>
+ /// <returns>A converted value. If the method returns null, the valid null value is used.</returns>
+ public object Convert(object value, Type targetType,
+ object parameter, CultureInfo culture)
+ {
+ var item = value as BaseItem ?? new Folder();
+ switch (item.DisplayMediaType)
+ {
+ case "DVD":
+ case "HD DVD":
+ case "Blu-ray":
+ case "Blu-Ray":
+ case "Movie":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/movie.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "Series":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/series.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "Season":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/season.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "Episode":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/episode.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "BoxSet":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/boxset.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "Audio":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/audio.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "Person":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/persons.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "MusicArtist":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/artist.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "MusicAlbum":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/album.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "Trailer":
+ {
+ var uri = new Uri
+ ("pack://application:,,,/Resources/Images/trailer.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ case "None":
+ {
+ Uri uri;
+ if (item is Movie)
+ uri = new Uri("pack://application:,,,/Resources/Images/movie.png");
+ else if (item is Series)
+ uri = new Uri("pack://application:,,,/Resources/Images/series.png");
+ else if (item is BoxSet)
+ uri = new Uri("pack://application:,,,/Resources/Images/boxset.png");
+ else
+ uri = new Uri("pack://application:,,,/Resources/Images/folder.png");
+
+ return new BitmapImage(uri);
+ }
+ default:
+ {
+ var uri = new Uri("pack://application:,,,/Resources/Images/folder.png");
+ var source = new BitmapImage(uri);
+ return source;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Converts a value.
+ /// </summary>
+ /// <param name="value">The value that is produced by the binding target.</param>
+ /// <param name="targetType">The type to convert to.</param>
+ /// <param name="parameter">The converter parameter to use.</param>
+ /// <param name="culture">The culture to use in the converter.</param>
+ /// <returns>A converted value. If the method returns null, the valid null value is used.</returns>
+ /// <exception cref="System.NotSupportedException">Cannot convert back</exception>
+ public object ConvertBack(object value, Type targetType,
+ object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException("Cannot convert back");
+ }
+ }
+
+ #endregion // ItemToImageConverter
+}
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml b/MediaBrowser.ServerApplication/MainWindow.xaml
index ade1caee92..89b05820e8 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml
+++ b/MediaBrowser.ServerApplication/MainWindow.xaml
@@ -1,41 +1,53 @@
-<Window x:Class="MediaBrowser.ServerApplication.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:tb="http://www.hardcodet.net/taskbar"
- Title="MainWindow" Height="350" Width="525" AllowsTransparency="True" Background="Transparent" WindowStyle="None" ShowInTaskbar="False">
- <Grid>
- <tb:TaskbarIcon Name="MbTaskbarIcon" ToolTipText="MediaBrowser Server">
-
- <tb:TaskbarIcon.ContextMenu>
- <ContextMenu Background="White">
- <MenuItem Name="cmOpenDashboard" Header="Open Dashboard" Click="cmOpenDashboard_click"/>
- <MenuItem Name="cmdReloadServer" Header="Reload Server" Click="cmdReloadServer_click"/>
- <MenuItem Name="cmVisitCT" Header="Visit Community Tracker" Click="cmVisitCT_click"/>
- <Separator/>
- <MenuItem Name="cmExit" Header="Exit" Click="cmExit_click"/>
- </ContextMenu>
- </tb:TaskbarIcon.ContextMenu>
-
- <tb:TaskbarIcon.Style>
- <Style TargetType="{x:Type tb:TaskbarIcon}">
- <Setter Property="IconSource" Value="/Resources/Images/icon.ico" />
- <Style.Triggers>
- <DataTrigger Binding="{Binding LoadingImageIndex}" Value="1">
- <Setter Property="IconSource" Value="/Resources/Images/loadingIcon1.ico" />
- </DataTrigger>
- <DataTrigger Binding="{Binding LoadingImageIndex}" Value="2">
- <Setter Property="IconSource" Value="/Resources/Images/loadingIcon2.ico" />
- </DataTrigger>
- <DataTrigger Binding="{Binding LoadingImageIndex}" Value="3">
- <Setter Property="IconSource" Value="/Resources/Images/loadingIcon3.ico" />
- </DataTrigger>
- <DataTrigger Binding="{Binding LoadingImageIndex}" Value="4">
- <Setter Property="IconSource" Value="/Resources/Images/loadingIcon4.ico" />
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </tb:TaskbarIcon.Style>
-
- </tb:TaskbarIcon>
- </Grid>
-</Window>
+<Window x:Class="MediaBrowser.ServerApplication.MainWindow"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:tb="http://www.hardcodet.net/taskbar"
+ Title="Media Browser Server" Height="350" Width="525" AllowsTransparency="True" Background="Transparent" WindowStyle="None" ShowInTaskbar="False">
+ <Grid>
+ <tb:TaskbarIcon Name="MbTaskbarIcon" ToolTipText="Media Browser Server">
+
+ <tb:TaskbarIcon.ContextMenu>
+ <ContextMenu Background="White">
+ <MenuItem x:Name="cmdBrowseLibrary" Header="Browse Library" Click="cmdBrowseLibrary_click"/>
+ <MenuItem x:Name="cmOpenDashboard" Header="Configure Media Browser" Click="cmOpenDashboard_click"/>
+ <Separator x:Name="separatorDeveloperTools"/>
+ <MenuItem x:Name="cmOpenExplorer" Header="Open Library Explorer" Click="cmOpenExplorer_click" />
+ <MenuItem x:Name="cmdReloadServer" Header="Restart Server" Click="cmdReloadServer_click" />
+ <MenuItem x:Name="cmdApiDocs" Header="View Api Documentation" Click="cmdApiDocs_Click" />
+ <Separator/>
+ <MenuItem x:Name="cmShowLogWindow" Header="Show Log Window" IsCheckable="True" Click="CmShowLogWindow_click"/>
+ <MenuItem x:Name="cmVisitCT" Header="Visit Community" Click="cmVisitCT_click"/>
+ <Separator/>
+ <MenuItem x:Name="cmExit" Header="Exit" Click="cmExit_click"/>
+ </ContextMenu>
+ </tb:TaskbarIcon.ContextMenu>
+
+ <tb:TaskbarIcon.Style>
+ <Style TargetType="{x:Type tb:TaskbarIcon}">
+ <Setter Property="IconSource" Value="/Resources/Images/icon.ico" />
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="1">
+ <Setter Property="IconSource" Value="/Resources/Images/Loading/1.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="2">
+ <Setter Property="IconSource" Value="/Resources/Images/Loading/2.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="3">
+ <Setter Property="IconSource" Value="/Resources/Images/Loading/3.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="4">
+ <Setter Property="IconSource" Value="/Resources/Images/Loading/4.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="5">
+ <Setter Property="IconSource" Value="/Resources/Images/Loading/5.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="6">
+ <Setter Property="IconSource" Value="/Resources/Images/Loading/6.ico" />
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </tb:TaskbarIcon.Style>
+
+ </tb:TaskbarIcon>
+ </Grid>
+</Window>
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml.cs b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
index 6180482d7e..3f0bb11777 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml.cs
+++ b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
@@ -1,109 +1,335 @@
-using Hardcodet.Wpf.TaskbarNotification;
-using MediaBrowser.Common.Events;
-using MediaBrowser.Controller;
-using MediaBrowser.Model.Progress;
-using System;
-using System.ComponentModel;
-using System.Threading;
-using System.Windows;
-
-namespace MediaBrowser.ServerApplication
-{
- /// <summary>
- /// Interaction logic for MainWindow.xaml
- /// </summary>
- public partial class MainWindow : Window, INotifyPropertyChanged
- {
- private Timer LoadingIconTimer { get; set; }
-
- public MainWindow()
- {
- InitializeComponent();
- Loaded += MainWindowLoaded;
- }
-
- void MainWindowLoaded(object sender, RoutedEventArgs e)
- {
- DataContext = this;
-
- Kernel.Instance.ReloadBeginning += KernelReloadBeginning;
- Kernel.Instance.ReloadCompleted += KernelReloadCompleted;
- }
-
- void KernelReloadBeginning(object sender, GenericEventArgs<IProgress<TaskProgress>> e)
- {
- MbTaskbarIcon.ShowBalloonTip("Media Browser is reloading", "Please wait...", BalloonIcon.Info);
-
- LoadingImageIndex = 0;
-
- LoadingIconTimer = new Timer(LoadingIconTimerCallback, null, 0, 250);
- }
-
- void KernelReloadCompleted(object sender, GenericEventArgs<IProgress<TaskProgress>> e)
- {
- LoadingIconTimer.Dispose();
-
- LoadingImageIndex = 0;
- }
-
- public event PropertyChangedEventHandler PropertyChanged;
-
- public void OnPropertyChanged(String info)
- {
- if (PropertyChanged != null)
- {
- PropertyChanged(this, new PropertyChangedEventArgs(info));
- }
- }
-
- private int _loadingImageIndex;
- public int LoadingImageIndex
- {
- get { return _loadingImageIndex; }
- set
- {
- _loadingImageIndex = value;
- OnPropertyChanged("LoadingImageIndex");
- }
- }
-
- #region Context Menu events
-
- private void cmOpenDashboard_click(object sender, RoutedEventArgs e)
- {
- App.OpenDashboard();
- }
-
- private void cmVisitCT_click(object sender, RoutedEventArgs e)
- {
- App.OpenUrl("http://community.mediabrowser.tv/");
- }
-
- private void cmExit_click(object sender, RoutedEventArgs e)
- {
- Close();
- }
-
- private async void cmdReloadServer_click(object sender, RoutedEventArgs e)
- {
- await Kernel.Instance.Reload(new Progress<TaskProgress>()).ConfigureAwait(false);
- }
-
- private void LoadingIconTimerCallback(object stateInfo)
- {
- const int numImages = 4;
-
- if (LoadingImageIndex < numImages)
- {
- LoadingImageIndex++;
- }
- else
- {
- LoadingImageIndex = 1;
- }
- }
-
- #endregion
-
- }
-}
+using MediaBrowser.Common.Logging;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.ServerApplication.Controls;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading;
+using System.Windows;
+using System.Windows.Controls.Primitives;
+using System.Windows.Threading;
+
+namespace MediaBrowser.ServerApplication
+{
+ /// <summary>
+ /// Interaction logic for MainWindow.xaml
+ /// </summary>
+ public partial class MainWindow : Window, INotifyPropertyChanged
+ {
+ /// <summary>
+ /// Holds the list of new items to display when the NewItemTimer expires
+ /// </summary>
+ private readonly List<BaseItem> _newlyAddedItems = new List<BaseItem>();
+
+ /// <summary>
+ /// The amount of time to wait before showing a new item notification
+ /// This allows us to group items together into one notification
+ /// </summary>
+ private const int NewItemDelay = 60000;
+
+ /// <summary>
+ /// The current new item timer
+ /// </summary>
+ /// <value>The new item timer.</value>
+ private Timer NewItemTimer { get; set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MainWindow" /> class.
+ /// </summary>
+ public MainWindow()
+ {
+ InitializeComponent();
+
+ Loaded += MainWindowLoaded;
+ }
+
+ /// <summary>
+ /// Mains the window loaded.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ void MainWindowLoaded(object sender, RoutedEventArgs e)
+ {
+ DataContext = this;
+
+ Instance_ConfigurationUpdated(null, EventArgs.Empty);
+
+ Kernel.Instance.ReloadCompleted += KernelReloadCompleted;
+ Kernel.Instance.LoggerLoaded += LoadLogWindow;
+ Kernel.Instance.HasPendingRestartChanged += Instance_HasPendingRestartChanged;
+ Kernel.Instance.ConfigurationUpdated += Instance_ConfigurationUpdated;
+ }
+
+ /// <summary>
+ /// Handles the ConfigurationUpdated event of the Instance control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
+ void Instance_ConfigurationUpdated(object sender, EventArgs e)
+ {
+ Dispatcher.InvokeAsync(() =>
+ {
+ var developerToolsVisibility = Kernel.Instance.Configuration.EnableDeveloperTools
+ ? Visibility.Visible
+ : Visibility.Collapsed;
+
+ separatorDeveloperTools.Visibility = developerToolsVisibility;
+ cmdReloadServer.Visibility = developerToolsVisibility;
+ cmOpenExplorer.Visibility = developerToolsVisibility;
+ });
+ }
+
+ /// <summary>
+ /// Sets visibility of the restart message when the kernel value changes
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
+ void Instance_HasPendingRestartChanged(object sender, EventArgs e)
+ {
+ Dispatcher.InvokeAsync(() =>
+ {
+ MbTaskbarIcon.ToolTipText = Kernel.Instance.HasPendingRestart ? "Media Browser Server - Please restart to finish updating." : "Media Browser Server";
+ });
+ }
+
+ /// <summary>
+ /// Handles the LibraryChanged event of the Instance control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param>
+ void Instance_LibraryChanged(object sender, ChildrenChangedEventArgs e)
+ {
+ var newItems = e.ItemsAdded.Where(i => !i.IsFolder).ToList();
+
+ // Use a timer to prevent lots of these notifications from showing in a short period of time
+ if (newItems.Count > 0)
+ {
+ lock (_newlyAddedItems)
+ {
+ _newlyAddedItems.AddRange(newItems);
+
+ if (NewItemTimer == null)
+ {
+ NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite);
+ }
+ else
+ {
+ NewItemTimer.Change(NewItemDelay, Timeout.Infinite);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Called when the new item timer expires
+ /// </summary>
+ /// <param name="state">The state.</param>
+ private void NewItemTimerCallback(object state)
+ {
+ List<BaseItem> newItems;
+
+ // Lock the list and release all resources
+ lock (_newlyAddedItems)
+ {
+ newItems = _newlyAddedItems.ToList();
+ _newlyAddedItems.Clear();
+
+ NewItemTimer.Dispose();
+ NewItemTimer = null;
+ }
+
+ // Show the notification
+ if (newItems.Count == 1)
+ {
+ Dispatcher.InvokeAsync(() => MbTaskbarIcon.ShowCustomBalloon(new ItemUpdateNotification { DataContext = newItems[0] }, PopupAnimation.Slide, 6000));
+ }
+ else if (newItems.Count > 1)
+ {
+ Dispatcher.InvokeAsync(() => MbTaskbarIcon.ShowCustomBalloon(new MultiItemUpdateNotification { DataContext = newItems }, PopupAnimation.Slide, 6000));
+ }
+ }
+
+ /// <summary>
+ /// Loads the log window.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="args">The <see cref="EventArgs" /> instance containing the event data.</param>
+ void LoadLogWindow(object sender, EventArgs args)
+ {
+ CloseLogWindow();
+ Dispatcher.InvokeAsync(() =>
+ {
+ // Add our log window if specified
+ if (Kernel.Instance.Configuration.ShowLogWindow)
+ {
+ Trace.Listeners.Add(new WindowTraceListener(new LogWindow(Kernel.Instance)));
+ }
+ else
+ {
+ Trace.Listeners.Remove("MBLogWindow");
+ }
+ // Set menu option indicator
+ cmShowLogWindow.IsChecked = Kernel.Instance.Configuration.ShowLogWindow;
+
+ }, DispatcherPriority.Normal);
+ }
+
+ /// <summary>
+ /// Closes the log window.
+ /// </summary>
+ void CloseLogWindow()
+ {
+ Dispatcher.InvokeAsync(() =>
+ {
+ foreach (var win in Application.Current.Windows.OfType<LogWindow>())
+ {
+ win.Close();
+ }
+ });
+ }
+
+ /// <summary>
+ /// Kernels the reload completed.
+ /// </summary>
+ /// <param name="sender">The sender.</param>
+ /// <param name="e">The e.</param>
+ void KernelReloadCompleted(object sender, EventArgs e)
+ {
+ Kernel.Instance.LibraryManager.LibraryChanged -= Instance_LibraryChanged;
+ Kernel.Instance.LibraryManager.LibraryChanged += Instance_LibraryChanged;
+
+ if (Kernel.Instance.IsFirstRun)
+ {
+ LaunchStartupWizard();
+ }
+ }
+
+ /// <summary>
+ /// Launches the startup wizard.
+ /// </summary>
+ private void LaunchStartupWizard()
+ {
+ App.OpenDashboardPage("wizardStart.html");
+ }
+
+ /// <summary>
+ /// Handles the Click event of the cmdApiDocs control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
+ void cmdApiDocs_Click(object sender, EventArgs e)
+ {
+ App.OpenUrl("http://localhost:" + Controller.Kernel.Instance.Configuration.HttpServerPortNumber + "/" +
+ Controller.Kernel.Instance.WebApplicationName + "/metadata");
+ }
+
+ /// <summary>
+ /// Occurs when [property changed].
+ /// </summary>
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ /// <summary>
+ /// Called when [property changed].
+ /// </summary>
+ /// <param name="info">The info.</param>
+ public void OnPropertyChanged(String info)
+ {
+ if (PropertyChanged != null)
+ {
+ try
+ {
+ PropertyChanged(this, new PropertyChangedEventArgs(info));
+ }
+ catch (Exception ex)
+ {
+ Logger.LogException("Error in event handler", ex);
+ }
+ }
+ }
+
+ #region Context Menu events
+ /// <summary>
+ /// Handles the click event of the cmOpenExplorer control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void cmOpenExplorer_click(object sender, RoutedEventArgs e)
+ {
+ (new LibraryExplorer()).Show();
+ }
+
+ /// <summary>
+ /// Handles the click event of the cmOpenDashboard control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void cmOpenDashboard_click(object sender, RoutedEventArgs e)
+ {
+ App.OpenDashboard();
+ }
+
+ /// <summary>
+ /// Handles the click event of the cmVisitCT control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void cmVisitCT_click(object sender, RoutedEventArgs e)
+ {
+ App.OpenUrl("http://community.mediabrowser.tv/");
+ }
+
+ /// <summary>
+ /// Handles the click event of the cmdBrowseLibrary control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void cmdBrowseLibrary_click(object sender, RoutedEventArgs e)
+ {
+ App.OpenDashboardPage("index.html");
+ }
+
+ /// <summary>
+ /// Handles the click event of the cmExit control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void cmExit_click(object sender, RoutedEventArgs e)
+ {
+ Application.Current.Shutdown();
+ }
+
+ /// <summary>
+ /// Handles the click event of the cmdReloadServer control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void cmdReloadServer_click(object sender, RoutedEventArgs e)
+ {
+ App.Instance.Restart();
+ }
+
+ /// <summary>
+ /// Handles the click event of the CmShowLogWindow control.
+ /// </summary>
+ /// <param name="sender">The source of the event.</param>
+ /// <param name="e">The <see cref="RoutedEventArgs" /> instance containing the event data.</param>
+ private void CmShowLogWindow_click(object sender, RoutedEventArgs e)
+ {
+ Kernel.Instance.Configuration.ShowLogWindow = !Kernel.Instance.Configuration.ShowLogWindow;
+ Kernel.Instance.SaveConfiguration();
+ LoadLogWindow(sender, e);
+ }
+
+ #endregion
+
+ private void cmdApiDocs_Click_1(object sender, RoutedEventArgs e)
+ {
+
+ }
+
+ }
+}
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index de20c9256c..f318600baf 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -1,143 +1,346 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProjectGuid>{156EA256-AD2D-4D2F-B116-2ED4B9EFD869}</ProjectGuid>
- <OutputType>WinExe</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>MediaBrowser.ServerApplication</RootNamespace>
- <AssemblyName>MediaBrowser.ServerApplication</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
- <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <PlatformTarget>AnyCPU</PlatformTarget>
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>bin\Debug\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <PlatformTarget>AnyCPU</PlatformTarget>
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup>
- <StartupObject>MediaBrowser.ServerApplication.App</StartupObject>
- </PropertyGroup>
- <PropertyGroup>
- <ApplicationIcon>Resources\Images\icon.ico</ApplicationIcon>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="Hardcodet.Wpf.TaskbarNotification">
- <HintPath>..\packages\Hardcodet.Wpf.TaskbarNotification.1.0.4.0\lib\net40\Hardcodet.Wpf.TaskbarNotification.dll</HintPath>
- </Reference>
- <Reference Include="System" />
- <Reference Include="System.Data" />
- <Reference Include="System.Drawing" />
- <Reference Include="System.Runtime.Remoting" />
- <Reference Include="System.Xml" />
- <Reference Include="Microsoft.CSharp" />
- <Reference Include="System.Core" />
- <Reference Include="System.Xml.Linq" />
- <Reference Include="System.Data.DataSetExtensions" />
- <Reference Include="System.Xaml">
- <RequiredTargetFramework>4.0</RequiredTargetFramework>
- </Reference>
- <Reference Include="WindowsBase" />
- <Reference Include="PresentationCore" />
- <Reference Include="PresentationFramework" />
- </ItemGroup>
- <ItemGroup>
- <Page Include="App.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
- <Page Include="MainWindow.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
- <Compile Include="App.xaml.cs">
- <DependentUpon>App.xaml</DependentUpon>
- <SubType>Code</SubType>
- </Compile>
- <Compile Include="MainWindow.xaml.cs">
- <DependentUpon>MainWindow.xaml</DependentUpon>
- <SubType>Code</SubType>
- </Compile>
- </ItemGroup>
- <ItemGroup>
- <Compile Include="Properties\AssemblyInfo.cs">
- <SubType>Code</SubType>
- </Compile>
- <Compile Include="Properties\Resources.Designer.cs">
- <AutoGen>True</AutoGen>
- <DesignTime>True</DesignTime>
- <DependentUpon>Resources.resx</DependentUpon>
- </Compile>
- <Compile Include="Properties\Settings.Designer.cs">
- <AutoGen>True</AutoGen>
- <DependentUpon>Settings.settings</DependentUpon>
- <DesignTimeSharedInput>True</DesignTimeSharedInput>
- </Compile>
- <EmbeddedResource Include="Properties\Resources.resx">
- <Generator>ResXFileCodeGenerator</Generator>
- <LastGenOutput>Resources.Designer.cs</LastGenOutput>
- </EmbeddedResource>
- <None Include="packages.config" />
- <None Include="Properties\Settings.settings">
- <Generator>SettingsSingleFileGenerator</Generator>
- <LastGenOutput>Settings.Designer.cs</LastGenOutput>
- </None>
- <AppDesigner Include="Properties\" />
- </ItemGroup>
- <ItemGroup>
- <None Include="App.config">
- <SubType>Designer</SubType>
- </None>
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
- <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
- <Name>MediaBrowser.Common</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
- <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
- <Name>MediaBrowser.Controller</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
- <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
- <Name>MediaBrowser.Model</Name>
- </ProjectReference>
- </ItemGroup>
- <ItemGroup>
- <Resource Include="Resources\Images\icon.ico" />
- </ItemGroup>
- <ItemGroup>
- <Resource Include="Resources\Images\loadingIcon1.ico" />
- <Resource Include="Resources\Images\loadingIcon2.ico" />
- </ItemGroup>
- <ItemGroup>
- <Resource Include="Resources\Images\loadingIcon3.ico" />
- <Resource Include="Resources\Images\loadingIcon4.ico" />
- </ItemGroup>
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
- Other similar extension points exist, see Microsoft.Common.targets.
- <Target Name="BeforeBuild">
- </Target>
- <Target Name="AfterBuild">
- </Target>
- -->
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{156EA256-AD2D-4D2F-B116-2ED4B9EFD869}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>MediaBrowser.ServerApplication</RootNamespace>
+ <AssemblyName>MediaBrowser.ServerApplication</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <WarningLevel>4</WarningLevel>
+ <IsWebBootstrapper>true</IsWebBootstrapper>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+ <RestorePackages>true</RestorePackages>
+ <PublishUrl>http://www.mb3admin.com/downloads/server/</PublishUrl>
+ <Install>true</Install>
+ <InstallFrom>Web</InstallFrom>
+ <UpdateEnabled>false</UpdateEnabled>
+ <UpdateMode>Background</UpdateMode>
+ <UpdateInterval>1</UpdateInterval>
+ <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+ <UpdatePeriodically>false</UpdatePeriodically>
+ <UpdateRequired>false</UpdateRequired>
+ <MapFileExtensions>true</MapFileExtensions>
+ <SupportUrl>http://forum.mediabrowser3.com</SupportUrl>
+ <ProductName>Media Browser Server</ProductName>
+ <PublisherName>Media Browser Team</PublisherName>
+ <SuiteName>Media Browser 3</SuiteName>
+ <ApplicationRevision>3033</ApplicationRevision>
+ <ApplicationVersion>2.9.4795.3033</ApplicationVersion>
+ <UseApplicationTrust>false</UseApplicationTrust>
+ <CreateDesktopShortcut>true</CreateDesktopShortcut>
+ <PublishWizardCompleted>true</PublishWizardCompleted>
+ <BootstrapperEnabled>true</BootstrapperEnabled>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>1</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup>
+ <StartupObject>MediaBrowser.ServerApplication.App</StartupObject>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ApplicationIcon>Resources\Images\icon.ico</ApplicationIcon>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ApplicationManifest>app.manifest</ApplicationManifest>
+ </PropertyGroup>
+ <PropertyGroup>
+ <RunPostBuildEvent>Always</RunPostBuildEvent>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ManifestCertificateThumbprint>9633DCDB4A07D3328EFB99299C6DFB1823EBC4BE</ManifestCertificateThumbprint>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ManifestKeyFile>
+ </ManifestKeyFile>
+ </PropertyGroup>
+ <PropertyGroup>
+ <GenerateManifests>true</GenerateManifests>
+ </PropertyGroup>
+ <PropertyGroup>
+ <SignManifests>true</SignManifests>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ManifestTimestampUrl>http://timestamp.verisign.com/scripts/timstamp.dll</ManifestTimestampUrl>
+ </PropertyGroup>
+ <PropertyGroup>
+ <SignAssembly>false</SignAssembly>
+ </PropertyGroup>
+ <PropertyGroup>
+ <AssemblyOriginatorKeyFile>MediaBrowser.ServerApplication_TemporaryKey.pfx</AssemblyOriginatorKeyFile>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\x86\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <WarningLevel>1</WarningLevel>
+ <DebugType>full</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <Prefer32Bit>true</Prefer32Bit>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+ <OutputPath>bin\x86\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>x86</PlatformTarget>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+ <Prefer32Bit>true</Prefer32Bit>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="Hardcodet.Wpf.TaskbarNotification">
+ <HintPath>..\packages\Hardcodet.Wpf.TaskbarNotification.1.0.4.0\lib\net40\Hardcodet.Wpf.TaskbarNotification.dll</HintPath>
+ </Reference>
+ <Reference Include="Platinum.Managed, Version=1.0.4794.22684, Culture=neutral, processorArchitecture=x86">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\ThirdParty\UPnP\Libs\Platinum.Managed.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Configuration" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Data.SQLite, Version=1.0.84.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\System.Data.SQLite.1.0.84.0\lib\net45\System.Data.SQLite.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Data.SQLite.Linq">
+ <HintPath>..\packages\System.Data.SQLite.1.0.84.0\lib\net45\System.Data.SQLite.Linq.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Runtime.Remoting" />
+ <Reference Include="System.Web.Extensions" />
+ <Reference Include="System.Xml" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="WindowsBase" />
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ </ItemGroup>
+ <ItemGroup>
+ <Page Include="App.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Page Include="Controls\ItemUpdateNotification.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="Controls\MultiItemUpdateNotification.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="LibraryExplorer.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ <Page Include="MainWindow.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Compile Include="App.xaml.cs">
+ <DependentUpon>App.xaml</DependentUpon>
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Controls\ItemUpdateNotification.xaml.cs">
+ <DependentUpon>ItemUpdateNotification.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Controls\MultiItemUpdateNotification.xaml.cs">
+ <DependentUpon>MultiItemUpdateNotification.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="LibraryExplorer.xaml.cs">
+ <DependentUpon>LibraryExplorer.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="MainWindow.xaml.cs">
+ <DependentUpon>MainWindow.xaml</DependentUpon>
+ <SubType>Code</SubType>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <None Include="app.manifest" />
+ <None Include="MediaBrowser.ServerApplication_TemporaryKey.pfx" />
+ <None Include="packages.config" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <AppDesigner Include="Properties\" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="App.config">
+ <SubType>Designer</SubType>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
+ <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
+ <Name>MediaBrowser.Common</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
+ <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
+ <Name>MediaBrowser.Controller</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.IsoMounter\MediaBrowser.IsoMounter.csproj">
+ <Project>{5356ae30-6a6e-4a64-81e3-f76c50595e64}</Project>
+ <Name>MediaBrowser.IsoMounter</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
+ <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
+ <Name>MediaBrowser.Model</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Server.Uninstall\MediaBrowser.Server.Uninstall.csproj">
+ <Project>{5443422f-9548-417a-90dd-2fc91f2b5999}</Project>
+ <Name>MediaBrowser.Server.Uninstall</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\icon.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\folder.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\movie.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\series.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\season.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\episode.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\audio.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\starEmpty.png" />
+ <Resource Include="Resources\Images\starFull.png" />
+ <Resource Include="Resources\Images\starHalf.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\artist.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\persons.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\album.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\boxset.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\trailer.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\folder.jpg" />
+ <Resource Include="Resources\Images\mblogoblackfull.png" />
+ <Resource Include="Resources\Images\mblogowhitefull.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Resources\Images\Loading\1.ico" />
+ <Resource Include="Resources\Images\Loading\2.ico" />
+ <Resource Include="Resources\Images\Loading\3.ico" />
+ <Resource Include="Resources\Images\Loading\4.ico" />
+ <Resource Include="Resources\Images\Loading\5.ico" />
+ <Resource Include="Resources\Images\Loading\6.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <BootstrapperPackage Include=".NETFramework,Version=v4.5">
+ <Visible>False</Visible>
+ <ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>
+ <Install>true</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5 SP1</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Visual.C++.10.0.x86">
+ <Visible>False</Visible>
+ <ProductName>Visual C++ 2010 Runtime Libraries %28x86%29</ProductName>
+ <Install>true</Install>
+ </BootstrapperPackage>
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="MediaBrowser.Api.dll">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ <Content Include="MediaBrowser.ApiInteraction.Javascript.dll">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ <Content Include="MediaBrowser.WebDashboard.dll">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ <Content Include="x64\SQLite.Interop.dll">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ <Content Include="x86\SQLite.Interop.dll">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ </ItemGroup>
+ <ItemGroup />
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>xcopy "$(SolutionDir)\packages\System.Data.SQLite.1.0.84.0\content\net40\x86\SQLite.Interop.dll" "$(TargetDir)" /y</PostBuildEvent>
+ </PropertyGroup>
+ <Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
</Project> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs b/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs
index 35b3c6f98c..20ef6e7007 100644
--- a/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs
+++ b/MediaBrowser.ServerApplication/Properties/AssemblyInfo.cs
@@ -1,53 +1,52 @@
-using System.Reflection;
-using System.Runtime.InteropServices;
-using System.Windows;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("MediaBrowser.ServerApplication")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("MediaBrowser.ServerApplication")]
-[assembly: AssemblyCopyright("Copyright © 2012")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-//In order to begin building localizable applications, set
-//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
-//inside a <PropertyGroup>. For example, if you are using US english
-//in your source files, set the <UICulture> to en-US. Then uncomment
-//the NeutralResourceLanguage attribute below. Update the "en-US" in
-//the line below to match the UICulture setting in the project file.
-
-//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
-
-
-[assembly: ThemeInfo(
- ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
- //(used if a resource is not found in the page,
- // or application resource dictionaries)
- ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
- //(used if a resource is not found in the page,
- // app, or any theme specific resource dictionaries)
-)]
-
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Media Browser Server")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Media Browser Server")]
+[assembly: AssemblyCopyright("Copyright © 2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
+//inside a <PropertyGroup>. For example, if you are using US english
+//in your source files, set the <UICulture> to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("2.9.*")]
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Icon.ico b/MediaBrowser.ServerApplication/Resources/Images/Icon.ico
index 1541dabdc4..4acd8f9219 100644
--- a/MediaBrowser.ServerApplication/Resources/Images/Icon.ico
+++ b/MediaBrowser.ServerApplication/Resources/Images/Icon.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Loading/1.ico b/MediaBrowser.ServerApplication/Resources/Images/Loading/1.ico
new file mode 100644
index 0000000000..63acf6d33c
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/Loading/1.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Loading/2.ico b/MediaBrowser.ServerApplication/Resources/Images/Loading/2.ico
new file mode 100644
index 0000000000..6eb60cbe08
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/Loading/2.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Loading/3.ico b/MediaBrowser.ServerApplication/Resources/Images/Loading/3.ico
new file mode 100644
index 0000000000..7cde0746f3
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/Loading/3.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Loading/4.ico b/MediaBrowser.ServerApplication/Resources/Images/Loading/4.ico
new file mode 100644
index 0000000000..db2a895a5f
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/Loading/4.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Loading/5.ico b/MediaBrowser.ServerApplication/Resources/Images/Loading/5.ico
new file mode 100644
index 0000000000..4c9c4fd0df
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/Loading/5.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Loading/6.ico b/MediaBrowser.ServerApplication/Resources/Images/Loading/6.ico
new file mode 100644
index 0000000000..6d2eba5488
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/Loading/6.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/album.png b/MediaBrowser.ServerApplication/Resources/Images/album.png
new file mode 100644
index 0000000000..796a2c627b
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/album.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/artist.png b/MediaBrowser.ServerApplication/Resources/Images/artist.png
new file mode 100644
index 0000000000..c9e890c3c2
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/artist.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/audio.png b/MediaBrowser.ServerApplication/Resources/Images/audio.png
new file mode 100644
index 0000000000..373913d1af
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/audio.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/boxset.png b/MediaBrowser.ServerApplication/Resources/Images/boxset.png
new file mode 100644
index 0000000000..d451125399
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/boxset.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/episode.png b/MediaBrowser.ServerApplication/Resources/Images/episode.png
new file mode 100644
index 0000000000..6a12ab45b5
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/episode.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/folder.jpg b/MediaBrowser.ServerApplication/Resources/Images/folder.jpg
new file mode 100644
index 0000000000..f61e754778
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/folder.jpg
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/folder.png b/MediaBrowser.ServerApplication/Resources/Images/folder.png
new file mode 100644
index 0000000000..b6e5cbbc53
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/folder.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.ico
deleted file mode 100644
index f7c2f27830..0000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.ico
deleted file mode 100644
index 0f20c2b7aa..0000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.ico
deleted file mode 100644
index bc915ea9f0..0000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.ico
deleted file mode 100644
index 183049b06b..0000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/mblogoblackfull.png b/MediaBrowser.ServerApplication/Resources/Images/mblogoblackfull.png
new file mode 100644
index 0000000000..340f12d9df
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/mblogoblackfull.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/mblogowhitefull.png b/MediaBrowser.ServerApplication/Resources/Images/mblogowhitefull.png
new file mode 100644
index 0000000000..48c8f72d39
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/mblogowhitefull.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/movie.png b/MediaBrowser.ServerApplication/Resources/Images/movie.png
new file mode 100644
index 0000000000..c964216e39
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/movie.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/persons.png b/MediaBrowser.ServerApplication/Resources/Images/persons.png
new file mode 100644
index 0000000000..6322fe96f9
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/persons.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/season.png b/MediaBrowser.ServerApplication/Resources/Images/season.png
new file mode 100644
index 0000000000..096c4a07f5
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/season.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/series.png b/MediaBrowser.ServerApplication/Resources/Images/series.png
new file mode 100644
index 0000000000..a1b715edfb
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/series.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/starEmpty.png b/MediaBrowser.ServerApplication/Resources/Images/starEmpty.png
new file mode 100644
index 0000000000..b8355c7b16
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/starEmpty.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/starFull.png b/MediaBrowser.ServerApplication/Resources/Images/starFull.png
new file mode 100644
index 0000000000..d5df241024
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/starFull.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/starHalf.png b/MediaBrowser.ServerApplication/Resources/Images/starHalf.png
new file mode 100644
index 0000000000..e3251f0dd2
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/starHalf.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/trailer.png b/MediaBrowser.ServerApplication/Resources/Images/trailer.png
new file mode 100644
index 0000000000..b2892ae1c9
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/trailer.png
Binary files differ
diff --git a/MediaBrowser.ServerApplication/app.manifest b/MediaBrowser.ServerApplication/app.manifest
new file mode 100644
index 0000000000..d040f5fb9c
--- /dev/null
+++ b/MediaBrowser.ServerApplication/app.manifest
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+ <security>
+ <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+ <!-- UAC Manifest Options
+ If you want to change the Windows User Account Control level replace the
+ requestedExecutionLevel node with one of the following.
+
+ <requestedExecutionLevel level="asInvoker" uiAccess="false" />
+ <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
+ <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
+
+ Specifying requestedExecutionLevel node will disable file and registry virtualization.
+ If you want to utilize File and Registry Virtualization for backward
+ compatibility then delete the requestedExecutionLevel node.
+ -->
+ </requestedPrivileges>
+ <applicationRequestMinimum>
+ <defaultAssemblyRequest permissionSetReference="Custom" />
+ <PermissionSet ID="Custom" SameSite="site" Unrestricted="true" />
+ </applicationRequestMinimum>
+ </security>
+ </trustInfo>
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!-- A list of all Windows versions that this application is designed to work with.
+ Windows will automatically select the most compatible environment.-->
+ <!-- If your application is designed to work with Windows Vista, uncomment the following supportedOS node-->
+ <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>-->
+ <!-- If your application is designed to work with Windows 7, uncomment the following supportedOS node-->
+ <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
+ <!-- If your application is designed to work with Windows 8, uncomment the following supportedOS node-->
+ <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>-->
+ </application>
+ </compatibility>
+ <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
+ <!-- <dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+ </dependency>-->
+</asmv1:assembly> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config
index bd2832dcea..868a15c6d0 100644
--- a/MediaBrowser.ServerApplication/packages.config
+++ b/MediaBrowser.ServerApplication/packages.config
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="Hardcodet.Wpf.TaskbarNotification" version="1.0.4.0" targetFramework="net45" />
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="Hardcodet.Wpf.TaskbarNotification" version="1.0.4.0" targetFramework="net45" />
+ <package id="System.Data.SQLite" version="1.0.84.0" targetFramework="net45" />
</packages> \ No newline at end of file