This commit is contained in:
Eric Reed 2013-12-09 09:24:21 -05:00
commit 83c4d75b14
43 changed files with 465 additions and 100 deletions

View File

@ -271,6 +271,16 @@ namespace MediaBrowser.Api
item.Overview = request.Overview; item.Overview = request.Overview;
item.Genres = request.Genres; item.Genres = request.Genres;
var episode = item as Episode;
if (episode != null)
{
episode.DvdSeasonNumber = request.DvdSeasonNumber;
episode.DvdEpisodeNumber = request.DvdEpisodeNumber;
episode.AirsAfterSeasonNumber = request.AirsAfterSeasonNumber;
episode.AirsBeforeEpisodeNumber = request.AirsBeforeEpisodeNumber;
episode.AirsBeforeSeasonNumber = request.AirsBeforeSeasonNumber;
}
var hasTags = item as IHasTags; var hasTags = item as IHasTags;
if (hasTags != null) if (hasTags != null)
{ {

View File

@ -38,14 +38,6 @@
<RunPostBuildEvent>Always</RunPostBuildEvent> <RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="ServiceStack.Interfaces, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Text, Version=3.9.70.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Text.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
@ -56,6 +48,12 @@
<HintPath>..\packages\morelinq.1.0.16006\lib\net35\MoreLinq.dll</HintPath> <HintPath>..\packages\morelinq.1.0.16006\lib\net35\MoreLinq.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="ServiceStack.Interfaces">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Text">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Text.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\SharedVersion.cs"> <Compile Include="..\SharedVersion.cs">

View File

@ -37,14 +37,6 @@
<RunPostBuildEvent>Always</RunPostBuildEvent> <RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="ServiceStack.Text, Version=3.9.70.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Text.dll</HintPath>
</Reference>
<Reference Include="SharpCompress, Version=0.10.2.0, Culture=neutral, PublicKeyToken=beaf6f427e128133, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\sharpcompress.0.10.2\lib\net40\SharpCompress.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@ -58,6 +50,12 @@
<Reference Include="SimpleInjector"> <Reference Include="SimpleInjector">
<HintPath>..\packages\SimpleInjector.2.3.6\lib\net40-client\SimpleInjector.dll</HintPath> <HintPath>..\packages\SimpleInjector.2.3.6\lib\net40-client\SimpleInjector.dll</HintPath>
</Reference> </Reference>
<Reference Include="ServiceStack.Text">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Text.dll</HintPath>
</Reference>
<Reference Include="SharpCompress">
<HintPath>..\packages\sharpcompress.0.10.2\lib\net40\SharpCompress.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\SharedVersion.cs"> <Compile Include="..\SharedVersion.cs">

View File

@ -1359,13 +1359,24 @@ namespace MediaBrowser.Controller.Entities
Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path); Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
} }
//this should be functionally equivilent to what was here since it is IEnum and works on a thread-safe copy
return RecursiveChildren.Where(i => i.LocationType != LocationType.Virtual).FirstOrDefault(i => return RecursiveChildren.Where(i => i.LocationType != LocationType.Virtual).FirstOrDefault(i =>
{ {
try try
{ {
return string.Equals(i.Path, path, StringComparison.OrdinalIgnoreCase) if (string.Equals(i.Path, path, StringComparison.OrdinalIgnoreCase))
|| i.ResolveArgs.PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase); {
return true;
}
if (i.LocationType != LocationType.Remote)
{
if (i.ResolveArgs.PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase))
{
return true;
}
}
return false;
} }
catch (IOException ex) catch (IOException ex)
{ {

View File

@ -40,6 +40,17 @@ namespace MediaBrowser.Controller.Entities.TV
public int? AirsAfterSeasonNumber { get; set; } public int? AirsAfterSeasonNumber { get; set; }
public int? AirsBeforeEpisodeNumber { get; set; } public int? AirsBeforeEpisodeNumber { get; set; }
/// <summary>
/// Gets or sets the DVD season number.
/// </summary>
/// <value>The DVD season number.</value>
public int? DvdSeasonNumber { get; set; }
/// <summary>
/// Gets or sets the DVD episode number.
/// </summary>
/// <value>The DVD episode number.</value>
public float? DvdEpisodeNumber { get; set; }
/// <summary> /// <summary>
/// We want to group into series not show individually in an index /// We want to group into series not show individually in an index
/// </summary> /// </summary>

View File

@ -130,7 +130,7 @@ namespace MediaBrowser.Controller.Library
{ {
get get
{ {
return IsDirectory && Path.Equals(_appPaths.RootFolderPath, StringComparison.OrdinalIgnoreCase); return IsDirectory && string.Equals(Path, _appPaths.RootFolderPath, StringComparison.OrdinalIgnoreCase);
} }
} }

View File

@ -58,10 +58,6 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="ServiceStack.Interfaces, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
@ -74,6 +70,9 @@
<Reference Include="MoreLinq"> <Reference Include="MoreLinq">
<HintPath>..\packages\morelinq.1.0.16006\lib\net35\MoreLinq.dll</HintPath> <HintPath>..\packages\morelinq.1.0.16006\lib\net35\MoreLinq.dll</HintPath>
</Reference> </Reference>
<Reference Include="ServiceStack.Interfaces">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\SharedVersion.cs"> <Compile Include="..\SharedVersion.cs">

View File

@ -30,11 +30,20 @@ namespace MediaBrowser.Model.Dto
/// <value>The date created.</value> /// <value>The date created.</value>
public DateTime? DateCreated { get; set; } public DateTime? DateCreated { get; set; }
public int? AirsBeforeSeasonNumber { get; set; }
public int? AirsAfterSeasonNumber { get; set; }
public int? AirsBeforeEpisodeNumber { get; set; }
/// <summary> /// <summary>
/// Gets or sets the special season number. /// Gets or sets the DVD season number.
/// </summary> /// </summary>
/// <value>The special season number.</value> /// <value>The DVD season number.</value>
public int? SpecialSeasonNumber { get; set; } public int? DvdSeasonNumber { get; set; }
/// <summary>
/// Gets or sets the DVD episode number.
/// </summary>
/// <value>The DVD episode number.</value>
public float? DvdEpisodeNumber { get; set; }
/// <summary> /// <summary>
/// Gets or sets the name of the sort. /// Gets or sets the name of the sort.

View File

@ -110,6 +110,12 @@ namespace MediaBrowser.Model.System
/// <value>The HTTP server port number.</value> /// <value>The HTTP server port number.</value>
public int HttpServerPortNumber { get; set; } public int HttpServerPortNumber { get; set; }
/// <summary>
/// Gets or sets the wan address.
/// </summary>
/// <value>The wan address.</value>
public string WanAddress { get; set; }
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="SystemInfo" /> class. /// Initializes a new instance of the <see cref="SystemInfo" /> class.
/// </summary> /// </summary>

View File

@ -36,8 +36,8 @@ Global
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.Build.0 = Debug|x86 {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.Build.0 = Debug|x86
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.ActiveCfg = Release|Any CPU {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.ActiveCfg = Release|x86
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.Build.0 = Release|Any CPU {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.Build.0 = Release|x86
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.ActiveCfg = Debug|Any CPU {2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.ActiveCfg = Debug|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.Build.0 = Debug|Any CPU {2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.Build.0 = Debug|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -82,6 +82,6 @@ Global
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release|x86.Build.0 = Release|Any CPU {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = MediaBrowser.Model\MediaBrowser.Model.csproj StartupItem = MediaBrowser.Server.Mono\MediaBrowser.Server.Mono.csproj
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@ -1,13 +1,29 @@
<Properties> <Properties>
<MonoDevelop.Ide.Workspace ActiveConfiguration="Release" /> <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|x86" />
<MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.Server.Mono\app.config"> <MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.Server.Implementations\Library\UserManager.cs">
<Files> <Files>
<File FileName="MediaBrowser.Server.Mono\app.config" Line="3" Column="19" /> <File FileName="MediaBrowser.Server.Mono\app.config" Line="9" Column="10" />
<File FileName="MediaBrowser.Server.Mono\FFMpeg\FFMpegDownloadInfo.cs" Line="1" Column="1" />
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="84" Column="7" />
<File FileName="MediaBrowser.Server.Implementations\Library\UserManager.cs" Line="235" Column="10" />
</Files> </Files>
<Pads> <Pads>
<Pad Id="ProjectPad"> <Pad Id="ProjectPad">
<State expanded="True" selected="True"> <State expanded="True">
<Node name="MediaBrowser.Server.Implementations" expanded="True" /> <Node name="MediaBrowser.Api" expanded="True" />
<Node name="MediaBrowser.Common" expanded="True" />
<Node name="MediaBrowser.Common.Implementations" expanded="True" />
<Node name="MediaBrowser.Controller" expanded="True" />
<Node name="MediaBrowser.Server.Implementations" expanded="True">
<Node name="Library" expanded="True">
<Node name="UserManager.cs" selected="True" />
</Node>
</Node>
<Node name="MediaBrowser.Server.Mono" expanded="True">
<Node name="References" expanded="True" />
<Node name="FFMpeg" expanded="True" />
</Node>
<Node name="MediaBrowser.WebDashboard" expanded="True" />
</State> </State>
</Pad> </Pad>
<Pad Id="ClassPad"> <Pad Id="ClassPad">
@ -21,6 +37,7 @@
<MonoDevelop.Ide.DebuggingService.Breakpoints> <MonoDevelop.Ide.DebuggingService.Breakpoints>
<BreakpointStore> <BreakpointStore>
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Common.Implementations\HttpClientManager\HttpClientManager.cs" line="477" column="17" /> <Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Common.Implementations\HttpClientManager\HttpClientManager.cs" line="477" column="17" />
<Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Server.Implementations\Library\UserManager.cs" line="222" column="1" />
</BreakpointStore> </BreakpointStore>
</MonoDevelop.Ide.DebuggingService.Breakpoints> </MonoDevelop.Ide.DebuggingService.Breakpoints>
<MonoDevelop.Ide.DebuggingService.PinnedWatches /> <MonoDevelop.Ide.DebuggingService.PinnedWatches />

View File

@ -325,6 +325,7 @@ namespace MediaBrowser.Providers.Movies
{ {
continue; continue;
} }
break;
} }
} }
} }

View File

@ -16,7 +16,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Movies namespace MediaBrowser.Providers.Movies
{ {
class FanArtMovieUpdatesPrescanTask : ILibraryPrescanTask class FanArtMovieUpdatesPrescanTask : ILibraryPostScanTask
{ {
private const string UpdatesUrl = "http://api.fanart.tv/webservice/newmovies/{0}/{1}/"; private const string UpdatesUrl = "http://api.fanart.tv/webservice/newmovies/{0}/{1}/";

View File

@ -16,7 +16,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Movies namespace MediaBrowser.Providers.Movies
{ {
public class MovieUpdatesPreScanTask : ILibraryPrescanTask public class MovieUpdatesPreScanTask : ILibraryPostScanTask
{ {
/// <summary> /// <summary>
/// The updates URL /// The updates URL

View File

@ -203,6 +203,7 @@ namespace MediaBrowser.Providers.Music
{ {
continue; continue;
} }
break;
} }
} }
} }

View File

@ -328,6 +328,7 @@ namespace MediaBrowser.Providers.Music
{ {
continue; continue;
} }
break;
} }
} }
} }

View File

@ -15,7 +15,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
class FanArtUpdatesPrescanTask : ILibraryPrescanTask class FanArtUpdatesPrescanTask : ILibraryPostScanTask
{ {
private const string UpdatesUrl = "http://api.fanart.tv/webservice/newmusic/{0}/{1}/"; private const string UpdatesUrl = "http://api.fanart.tv/webservice/newmusic/{0}/{1}/";

View File

@ -92,6 +92,16 @@ namespace MediaBrowser.Providers.Savers
builder.Append("<SeasonNumber>" + SecurityElement.Escape(episode.ParentIndexNumber.Value.ToString(_usCulture)) + "</SeasonNumber>"); builder.Append("<SeasonNumber>" + SecurityElement.Escape(episode.ParentIndexNumber.Value.ToString(_usCulture)) + "</SeasonNumber>");
} }
if (episode.DvdEpisodeNumber.HasValue)
{
builder.Append("<DVD_episodenumber>" + SecurityElement.Escape(episode.DvdEpisodeNumber.Value.ToString(_usCulture)) + "</DVD_episodenumber>");
}
if (episode.DvdSeasonNumber.HasValue)
{
builder.Append("<DVD_season>" + SecurityElement.Escape(episode.DvdSeasonNumber.Value.ToString(_usCulture)) + "</DVD_season>");
}
if (episode.PremiereDate.HasValue) if (episode.PremiereDate.HasValue)
{ {
builder.Append("<FirstAired>" + SecurityElement.Escape(episode.PremiereDate.Value.ToString("yyyy-MM-dd")) + "</FirstAired>"); builder.Append("<FirstAired>" + SecurityElement.Escape(episode.PremiereDate.Value.ToString("yyyy-MM-dd")) + "</FirstAired>");
@ -113,7 +123,9 @@ namespace MediaBrowser.Providers.Savers
"EpisodeNumberEnd", "EpisodeNumberEnd",
"airsafter_season", "airsafter_season",
"airsbefore_episode", "airsbefore_episode",
"airsbefore_season" "airsbefore_season",
"DVD_episodenumber",
"DVD_season"
}); });
} }

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Entities.TV; using System;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
@ -142,6 +143,38 @@ namespace MediaBrowser.Providers.TV
break; break;
} }
case "DVD_episodenumber":
{
var number = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(number))
{
float num;
if (float.TryParse(number, NumberStyles.Any, UsCulture, out num))
{
item.DvdEpisodeNumber = num;
}
}
break;
}
case "DVD_season":
{
var number = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(number))
{
float num;
if (float.TryParse(number, NumberStyles.Any, UsCulture, out num))
{
item.DvdSeasonNumber = Convert.ToInt32(num);
}
}
break;
}
case "airsbefore_episode": case "airsbefore_episode":
{ {
var val = reader.ReadElementContentAsString(); var val = reader.ReadElementContentAsString();

View File

@ -143,6 +143,7 @@ namespace MediaBrowser.Providers.TV
{ {
continue; continue;
} }
break;
} }
} }
} }

View File

@ -264,6 +264,7 @@ namespace MediaBrowser.Providers.TV
{ {
continue; continue;
} }
break;
} }
} }
} }

View File

@ -16,7 +16,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.TV namespace MediaBrowser.Providers.TV
{ {
class FanArtTvUpdatesPrescanTask : ILibraryPrescanTask class FanArtTvUpdatesPrescanTask : ILibraryPostScanTask
{ {
private const string UpdatesUrl = "http://api.fanart.tv/webservice/newtv/{0}/{1}/"; private const string UpdatesUrl = "http://api.fanart.tv/webservice/newtv/{0}/{1}/";

View File

@ -404,6 +404,40 @@ namespace MediaBrowser.Providers.TV
break; break;
} }
case "DVD_episodenumber":
{
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
float num;
if (float.TryParse(val, NumberStyles.Any, _usCulture, out num))
{
item.DvdEpisodeNumber = num;
}
}
break;
}
case "DVD_season":
{
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
float num;
if (float.TryParse(val, NumberStyles.Any, _usCulture, out num))
{
item.DvdSeasonNumber = Convert.ToInt32(num);
}
}
break;
}
case "airsbefore_episode": case "airsbefore_episode":
{ {
var val = reader.ReadElementContentAsString(); var val = reader.ReadElementContentAsString();

View File

@ -1,4 +1,5 @@
using MediaBrowser.Common.IO; using System.Net;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
@ -6,6 +7,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Providers; using MediaBrowser.Model.Providers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -159,24 +161,12 @@ namespace MediaBrowser.Providers.TV
{ {
if (!item.HasImage(ImageType.Primary)) if (!item.HasImage(ImageType.Primary))
{ {
var image = images.FirstOrDefault(i => i.Type == ImageType.Primary); await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
if (image != null)
{
await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Primary, null, cancellationToken)
.ConfigureAwait(false);
}
} }
if (ConfigurationManager.Configuration.DownloadSeasonImages.Banner && !item.HasImage(ImageType.Banner)) if (ConfigurationManager.Configuration.DownloadSeasonImages.Banner && !item.HasImage(ImageType.Banner))
{ {
var image = images.FirstOrDefault(i => i.Type == ImageType.Banner); await SaveImage(item, images, ImageType.Banner, cancellationToken).ConfigureAwait(false);
if (image != null)
{
await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Banner, null, cancellationToken)
.ConfigureAwait(false);
}
} }
if (ConfigurationManager.Configuration.DownloadSeasonImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit) if (ConfigurationManager.Configuration.DownloadSeasonImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit)
@ -196,5 +186,26 @@ namespace MediaBrowser.Providers.TV
} }
} }
} }
private async Task SaveImage(BaseItem item, List<RemoteImageInfo> images, ImageType type, CancellationToken cancellationToken)
{
foreach (var image in images.Where(i => i.Type == type))
{
try
{
await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, type, null, cancellationToken).ConfigureAwait(false);
break;
}
catch (HttpException ex)
{
// Sometimes fanart has bad url's in their xml
if (ex.StatusCode.HasValue && ex.StatusCode.Value == HttpStatusCode.NotFound)
{
continue;
}
break;
}
}
}
} }
} }

View File

@ -1061,7 +1061,12 @@ namespace MediaBrowser.Server.Implementations.Dto
if (episode != null) if (episode != null)
{ {
dto.IndexNumberEnd = episode.IndexNumberEnd; dto.IndexNumberEnd = episode.IndexNumberEnd;
dto.SpecialSeasonNumber = episode.AirsAfterSeasonNumber ?? episode.AirsBeforeSeasonNumber;
dto.DvdSeasonNumber = episode.DvdSeasonNumber;
dto.DvdEpisodeNumber = episode.DvdEpisodeNumber;
dto.AirsAfterSeasonNumber = episode.AirsAfterSeasonNumber;
dto.AirsBeforeEpisodeNumber = episode.AirsBeforeEpisodeNumber;
dto.AirsBeforeSeasonNumber = episode.AirsBeforeSeasonNumber;
var seasonId = episode.SeasonId; var seasonId = episode.SeasonId;
if (seasonId.HasValue) if (seasonId.HasValue)

View File

@ -63,8 +63,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer
_logger = logManager.GetLogger("HttpServer"); _logger = logManager.GetLogger("HttpServer");
LogManager.LogFactory = new ServerLogFactory(logManager);
_containerAdapter = new ContainerAdapter(applicationHost); _containerAdapter = new ContainerAdapter(applicationHost);
for (var i = 0; i < 2; i++) for (var i = 0; i < 2; i++)
@ -477,7 +475,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
ServiceController = CreateServiceController(); ServiceController = CreateServiceController();
_logger.Info("Calling ServiceStack AppHost.Init"); _logger.Info("Calling ServiceStack AppHost.Init");
Init();
base.Init();
} }
/// <summary> /// <summary>

View File

@ -1,6 +1,7 @@
using MediaBrowser.Common; using MediaBrowser.Common;
using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using ServiceStack.Logging;
namespace MediaBrowser.Server.Implementations.HttpServer namespace MediaBrowser.Server.Implementations.HttpServer
{ {
@ -20,6 +21,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// <returns>IHttpServer.</returns> /// <returns>IHttpServer.</returns>
public static IHttpServer CreateServer(IApplicationHost applicationHost, ILogManager logManager, string serverName, string handlerPath, string defaultRedirectpath) public static IHttpServer CreateServer(IApplicationHost applicationHost, ILogManager logManager, string serverName, string handlerPath, string defaultRedirectpath)
{ {
LogManager.LogFactory = new ServerLogFactory(logManager);
return new HttpListenerHost(applicationHost, logManager, serverName, handlerPath, defaultRedirectpath); return new HttpListenerHost(applicationHost, logManager, serverName, handlerPath, defaultRedirectpath);
} }
} }

View File

@ -116,6 +116,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
return null; return null;
} }
var filename = Path.GetFileName(args.Path);
// Don't misidentify xbmc trailers as a movie
if (filename.IndexOf(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) != -1)
{
return null;
}
// Find movies that are mixed in the same folder // Find movies that are mixed in the same folder
if (args.Path.IndexOf("[trailers]", StringComparison.OrdinalIgnoreCase) != -1 || if (args.Path.IndexOf("[trailers]", StringComparison.OrdinalIgnoreCase) != -1 ||
string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase)) string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase))

View File

@ -2,4 +2,5 @@ DE-FSK0,1
DE-FSK6+,5 DE-FSK6+,5
DE-FSK12+,7 DE-FSK12+,7
DE-FSK16+,8 DE-FSK16+,8
DE-16,8
DE-FSK18+,9 DE-FSK18+,9

View File

@ -37,25 +37,8 @@
<Reference Include="Alchemy"> <Reference Include="Alchemy">
<HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath> <HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath>
</Reference> </Reference>
<Reference Include="ServiceStack, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Mono.Data.Sqlite">
<SpecificVersion>False</SpecificVersion> <HintPath>..\ThirdParty\Mono.Data.Sqlite\Mono.Data.Sqlite.dll</HintPath>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Client, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Client.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Common, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Common.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Interfaces, Version=4.0.0.0, Culture=neutral, PublicKeyToken=e06fbc6124f57c43, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Text, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Text.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@ -73,6 +56,21 @@
<Reference Include="System.Data.SQLite"> <Reference Include="System.Data.SQLite">
<HintPath>..\packages\System.Data.SQLite.x86.1.0.89.0\lib\net45\System.Data.SQLite.dll</HintPath> <HintPath>..\packages\System.Data.SQLite.x86.1.0.89.0\lib\net45\System.Data.SQLite.dll</HintPath>
</Reference> </Reference>
<Reference Include="ServiceStack">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Client">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Client.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Common">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Common.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Interfaces">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Text">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Text.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\SharedVersion.cs"> <Compile Include="..\SharedVersion.cs">
@ -169,6 +167,7 @@
<Compile Include="Sorting\AlbumArtistComparer.cs" /> <Compile Include="Sorting\AlbumArtistComparer.cs" />
<Compile Include="Sorting\AlbumComparer.cs" /> <Compile Include="Sorting\AlbumComparer.cs" />
<Compile Include="Sorting\AlbumCountComparer.cs" /> <Compile Include="Sorting\AlbumCountComparer.cs" />
<Compile Include="Sorting\AlphanumComparator.cs" />
<Compile Include="Sorting\ArtistComparer.cs" /> <Compile Include="Sorting\ArtistComparer.cs" />
<Compile Include="Sorting\BudgetComparer.cs" /> <Compile Include="Sorting\BudgetComparer.cs" />
<Compile Include="Sorting\CommunityRatingComparer.cs" /> <Compile Include="Sorting\CommunityRatingComparer.cs" />

View File

@ -32,6 +32,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
_logger = logManager.GetLogger(GetType().Name); _logger = logManager.GetLogger(GetType().Name);
} }
private SqliteShrinkMemoryTimer _shrinkMemoryTimer;
/// <summary> /// <summary>
/// Opens the connection to the database /// Opens the connection to the database
/// </summary> /// </summary>
@ -52,6 +54,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.RunQueries(queries, _logger); _connection.RunQueries(queries, _logger);
PrepareStatements(); PrepareStatements();
_shrinkMemoryTimer = new SqliteShrinkMemoryTimer(_connection, _writeLock, _logger);
} }
/// <summary> /// <summary>
@ -282,6 +286,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
lock (_disposeLock) lock (_disposeLock)
{ {
if (_shrinkMemoryTimer != null)
{
_shrinkMemoryTimer.Dispose();
_shrinkMemoryTimer = null;
}
if (_connection != null) if (_connection != null)
{ {
if (_connection.IsOpen()) if (_connection.IsOpen())

View File

@ -25,6 +25,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
_logger = logManager.GetLogger(GetType().Name); _logger = logManager.GetLogger(GetType().Name);
} }
private SqliteShrinkMemoryTimer _shrinkMemoryTimer;
/// <summary> /// <summary>
/// Opens the connection to the database /// Opens the connection to the database
/// </summary> /// </summary>
@ -50,6 +52,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.RunQueries(queries, _logger); _connection.RunQueries(queries, _logger);
PrepareStatements(); PrepareStatements();
_shrinkMemoryTimer = new SqliteShrinkMemoryTimer(_connection, _writeLock, _logger);
} }
private static readonly string[] SaveColumns = private static readonly string[] SaveColumns =
@ -240,6 +244,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
lock (_disposeLock) lock (_disposeLock)
{ {
if (_shrinkMemoryTimer != null)
{
_shrinkMemoryTimer.Dispose();
_shrinkMemoryTimer = null;
}
if (_connection != null) if (_connection != null)
{ {
if (_connection.IsOpen()) if (_connection.IsOpen())

View File

@ -62,7 +62,7 @@ namespace MediaBrowser.Server.Implementations.Sorting
return CompareEpisodes(x, y); return CompareEpisodes(x, y);
} }
if (!isXSpecial && isYSpecial) if (!isXSpecial)
{ {
return CompareEpisodeToSpecial(x, y); return CompareEpisodeToSpecial(x, y);
} }
@ -87,8 +87,17 @@ namespace MediaBrowser.Server.Implementations.Sorting
// Add 1 to to non-specials to account for AirsBeforeEpisodeNumber // Add 1 to to non-specials to account for AirsBeforeEpisodeNumber
var xEpisode = x.IndexNumber ?? -1; var xEpisode = x.IndexNumber ?? -1;
xEpisode++; xEpisode++;
var yEpisode = y.AirsBeforeEpisodeNumber ?? 10000; var yEpisode = y.AirsBeforeEpisodeNumber ?? 10000;
// Sometimes they'll both have a value.
// For example AirsAfterSeasonNumber=1, AirsBeforeSeasonNumber=2, AirsBeforeEpisodeNumber=1
// The episode should be displayed at the end of season 1
if (y.AirsAfterSeasonNumber.HasValue && y.AirsBeforeSeasonNumber.HasValue && y.AirsBeforeSeasonNumber.Value > y.AirsAfterSeasonNumber.Value)
{
yEpisode = 10000;
}
return xEpisode.CompareTo(yEpisode); return xEpisode.CompareTo(yEpisode);
} }

View File

@ -0,0 +1,113 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace MediaBrowser.Server.Implementations.Sorting
{
public class AlphanumComparator : IComparer<string>
{
private enum ChunkType { Alphanumeric, Numeric };
private static bool InChunk(char ch, char otherCh)
{
var type = ChunkType.Alphanumeric;
if (char.IsDigit(otherCh))
{
type = ChunkType.Numeric;
}
if ((type == ChunkType.Alphanumeric && char.IsDigit(ch))
|| (type == ChunkType.Numeric && !char.IsDigit(ch)))
{
return false;
}
return true;
}
public static int CompareValues(string s1, string s2)
{
if (s1 == null || s2 == null)
{
return 0;
}
int thisMarker = 0, thisNumericChunk = 0;
int thatMarker = 0, thatNumericChunk = 0;
while ((thisMarker < s1.Length) || (thatMarker < s2.Length))
{
if (thisMarker >= s1.Length)
{
return -1;
}
else if (thatMarker >= s2.Length)
{
return 1;
}
char thisCh = s1[thisMarker];
char thatCh = s2[thatMarker];
StringBuilder thisChunk = new StringBuilder();
StringBuilder thatChunk = new StringBuilder();
while ((thisMarker < s1.Length) && (thisChunk.Length == 0 || InChunk(thisCh, thisChunk[0])))
{
thisChunk.Append(thisCh);
thisMarker++;
if (thisMarker < s1.Length)
{
thisCh = s1[thisMarker];
}
}
while ((thatMarker < s2.Length) && (thatChunk.Length == 0 || InChunk(thatCh, thatChunk[0])))
{
thatChunk.Append(thatCh);
thatMarker++;
if (thatMarker < s2.Length)
{
thatCh = s2[thatMarker];
}
}
int result = 0;
// If both chunks contain numeric characters, sort them numerically
if (char.IsDigit(thisChunk[0]) && char.IsDigit(thatChunk[0]))
{
thisNumericChunk = Convert.ToInt32(thisChunk.ToString());
thatNumericChunk = Convert.ToInt32(thatChunk.ToString());
if (thisNumericChunk < thatNumericChunk)
{
result = -1;
}
if (thisNumericChunk > thatNumericChunk)
{
result = 1;
}
}
else
{
result = thisChunk.ToString().CompareTo(thatChunk.ToString());
}
if (result != 0)
{
return result;
}
}
return 0;
}
public int Compare(string x, string y)
{
return CompareValues(x, y);
}
}
}

View File

@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Sorting; using MediaBrowser.Controller.Sorting;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
using System;
namespace MediaBrowser.Server.Implementations.Sorting namespace MediaBrowser.Server.Implementations.Sorting
{ {
@ -18,7 +17,7 @@ namespace MediaBrowser.Server.Implementations.Sorting
/// <returns>System.Int32.</returns> /// <returns>System.Int32.</returns>
public int Compare(BaseItem x, BaseItem y) public int Compare(BaseItem x, BaseItem y)
{ {
return string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase); return AlphanumComparator.CompareValues(x.Name, y.Name);
} }
/// <summary> /// <summary>

View File

@ -16,7 +16,7 @@ namespace MediaBrowser.Server.Implementations.Sorting
/// <returns>System.Int32.</returns> /// <returns>System.Int32.</returns>
public int Compare(BaseItem x, BaseItem y) public int Compare(BaseItem x, BaseItem y)
{ {
return string.Compare(GetValue(x), GetValue(y), StringComparison.CurrentCultureIgnoreCase); return AlphanumComparator.CompareValues(GetValue(x), GetValue(y));
} }
private string GetValue(BaseItem item) private string GetValue(BaseItem item)

View File

@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Sorting; using MediaBrowser.Controller.Sorting;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
using System;
namespace MediaBrowser.Server.Implementations.Sorting namespace MediaBrowser.Server.Implementations.Sorting
{ {
@ -18,7 +17,7 @@ namespace MediaBrowser.Server.Implementations.Sorting
/// <returns>System.Int32.</returns> /// <returns>System.Int32.</returns>
public int Compare(BaseItem x, BaseItem y) public int Compare(BaseItem x, BaseItem y)
{ {
return string.Compare(x.SortName, y.SortName, StringComparison.CurrentCultureIgnoreCase); return AlphanumComparator.CompareValues(x.SortName, y.SortName);
} }
/// <summary> /// <summary>

View File

@ -39,11 +39,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="ServiceStack.Common">
<HintPath>..\packages\ServiceStack.Common.3.9.70\lib\net35\ServiceStack.Common.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Interfaces"> <Reference Include="ServiceStack.Interfaces">
<HintPath>..\packages\ServiceStack.Common.3.9.70\lib\net35\ServiceStack.Interfaces.dll</HintPath> <HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -74,6 +71,9 @@
</Compile> </Compile>
<Compile Include="FFMpeg\FFMpegDownloadInfo.cs" /> <Compile Include="FFMpeg\FFMpegDownloadInfo.cs" />
<Compile Include="IO\FileSystemFactory.cs" /> <Compile Include="IO\FileSystemFactory.cs" />
<Compile Include="..\MediaBrowser.ServerApplication\EntryPoints\WanAddressEntryPoint.cs">
<Link>EntryPoints\WanAddressEntryPoint.cs</Link>
</Compile>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>

View File

@ -28,7 +28,6 @@ using MediaBrowser.Controller.Session;
using MediaBrowser.Controller.Sorting; using MediaBrowser.Controller.Sorting;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.System; using MediaBrowser.Model.System;
using MediaBrowser.Model.Updates; using MediaBrowser.Model.Updates;
using MediaBrowser.Providers; using MediaBrowser.Providers;
@ -49,6 +48,7 @@ using MediaBrowser.Server.Implementations.Providers;
using MediaBrowser.Server.Implementations.ServerManager; using MediaBrowser.Server.Implementations.ServerManager;
using MediaBrowser.Server.Implementations.Session; using MediaBrowser.Server.Implementations.Session;
using MediaBrowser.Server.Implementations.WebSocket; using MediaBrowser.Server.Implementations.WebSocket;
using MediaBrowser.ServerApplication.EntryPoints;
using MediaBrowser.ServerApplication.FFMpeg; using MediaBrowser.ServerApplication.FFMpeg;
using MediaBrowser.ServerApplication.IO; using MediaBrowser.ServerApplication.IO;
using MediaBrowser.ServerApplication.Native; using MediaBrowser.ServerApplication.Native;
@ -616,7 +616,8 @@ namespace MediaBrowser.ServerApplication
HttpServerPortNumber = ServerConfigurationManager.Configuration.HttpServerPortNumber, HttpServerPortNumber = ServerConfigurationManager.Configuration.HttpServerPortNumber,
OperatingSystem = Environment.OSVersion.ToString(), OperatingSystem = Environment.OSVersion.ToString(),
CanSelfRestart = CanSelfRestart, CanSelfRestart = CanSelfRestart,
CanSelfUpdate = CanSelfUpdate CanSelfUpdate = CanSelfUpdate,
WanAddress = WanAddressEntryPoint.WanAddress
}; };
} }

View File

@ -0,0 +1,56 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Plugins;
using System;
using System.IO;
using System.Threading;
namespace MediaBrowser.ServerApplication.EntryPoints
{
public class WanAddressEntryPoint : IServerEntryPoint
{
public static string WanAddress;
private Timer _timer;
private readonly IHttpClient _httpClient;
public WanAddressEntryPoint(IHttpClient httpClient)
{
_httpClient = httpClient;
}
public void Run()
{
_timer = new Timer(TimerCallback, null, TimeSpan.FromMinutes(1), TimeSpan.FromHours(24));
}
private async void TimerCallback(object state)
{
try
{
using (var stream = await _httpClient.Get(new HttpRequestOptions
{
Url = "http://bot.whatismyipaddress.com/"
}).ConfigureAwait(false))
{
using (var reader = new StreamReader(stream))
{
WanAddress = await reader.ReadToEndAsync().ConfigureAwait(false);
}
}
}
catch (Exception ex)
{
var b = true;
}
}
public void Dispose()
{
if (_timer != null)
{
_timer.Dispose();
_timer = null;
}
}
}
}

View File

@ -88,7 +88,7 @@ namespace MediaBrowser.ServerApplication
Cursor = Cursors.Wait; Cursor = Cursors.Wait;
await Task.Run(() => await Task.Run(() =>
{ {
IEnumerable<BaseItem> children = CurrentUser.Name == "Physical" ? _libraryManager.RootFolder.Children : _libraryManager.RootFolder.GetChildren(CurrentUser, true); IEnumerable<BaseItem> children = CurrentUser.Name == "Physical" ? new[] { _libraryManager.RootFolder } : _libraryManager.RootFolder.GetChildren(CurrentUser, true);
children = OrderByName(children, CurrentUser); children = OrderByName(children, CurrentUser);
foreach (Folder folder in children) foreach (Folder folder in children)

View File

@ -162,6 +162,7 @@
</Compile> </Compile>
<Compile Include="EntryPoints\ResourceEntryPoint.cs" /> <Compile Include="EntryPoints\ResourceEntryPoint.cs" />
<Compile Include="EntryPoints\StartupWizard.cs" /> <Compile Include="EntryPoints\StartupWizard.cs" />
<Compile Include="EntryPoints\WanAddressEntryPoint.cs" />
<Compile Include="FFMpeg\FFMpegDownloadInfo.cs" /> <Compile Include="FFMpeg\FFMpegDownloadInfo.cs" />
<Compile Include="FFMpeg\FFMpegInfo.cs" /> <Compile Include="FFMpeg\FFMpegInfo.cs" />
<Compile Include="IO\FileSystemFactory.cs" /> <Compile Include="IO\FileSystemFactory.cs" />

View File

@ -37,16 +37,15 @@
<RunPostBuildEvent>Always</RunPostBuildEvent> <RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="ServiceStack.Interfaces, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="ServiceStack.Interfaces">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Interfaces.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\SharedVersion.cs"> <Compile Include="..\SharedVersion.cs">