diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index f13058924..b7e180eca 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -148,6 +148,11 @@ namespace MediaBrowser.Api.Playback.Progressive
args += " -bsf:v h264_mp4toannexb";
}
+ if (state.RunTimeTicks.HasValue && state.VideoRequest.CopyTimestamps)
+ {
+ args += " -copyts -avoid_negative_ts disabled -start_at_zero";
+ }
+
return args;
}
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index d52e2b37f..3dfbdec56 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1359,7 +1359,7 @@ namespace MediaBrowser.Controller.Entities
{
if (!string.IsNullOrEmpty(info.Path))
{
- var itemByPath = LibraryManager.RootFolder.FindByPath(info.Path);
+ var itemByPath = LibraryManager.FindByPath(info.Path);
if (itemByPath == null)
{
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index f6af12369..8b623d64e 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -45,6 +45,8 @@ namespace MediaBrowser.Controller.Entities
public string NameLessThan { get; set; }
public string NameContains { get; set; }
+ public string Path { get; set; }
+
public string Person { get; set; }
public string[] PersonIds { get; set; }
public string[] ItemIds { get; set; }
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 1c515edd5..ff44953ef 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -56,6 +56,13 @@ namespace MediaBrowser.Controller.Library
/// Task{Person}.
Person GetPerson(string name);
+ ///
+ /// Finds the by path.
+ ///
+ /// The path.
+ /// BaseItem.
+ BaseItem FindByPath(string path);
+
///
/// Gets the artist.
///
diff --git a/MediaBrowser.Providers/Folders/DefaultImageProvider.cs b/MediaBrowser.Providers/Folders/DefaultImageProvider.cs
index e3a8cc261..ca543163d 100644
--- a/MediaBrowser.Providers/Folders/DefaultImageProvider.cs
+++ b/MediaBrowser.Providers/Folders/DefaultImageProvider.cs
@@ -25,8 +25,7 @@ namespace MediaBrowser.Providers.Folders
{
return new List
{
- ImageType.Primary,
- ImageType.Thumb
+ ImageType.Primary
};
}
@@ -57,13 +56,6 @@ namespace MediaBrowser.Providers.Folders
ProviderName = Name,
Url = url,
Type = ImageType.Primary
- },
-
- new RemoteImageInfo
- {
- ProviderName = Name,
- Url = url,
- Type = ImageType.Thumb
}
});
}
diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
index 5d0c90ccf..0559e08ea 100644
--- a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
+++ b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
@@ -664,7 +664,7 @@ namespace MediaBrowser.Server.Implementations.IO
while (item == null && !string.IsNullOrEmpty(path))
{
- item = LibraryManager.RootFolder.FindByPath(path);
+ item = LibraryManager.FindByPath(path);
path = Path.GetDirectoryName(path);
}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 333b1fbe9..721603efe 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -788,6 +788,29 @@ namespace MediaBrowser.Server.Implementations.Library
return _userRootFolder;
}
+ public BaseItem FindByPath(string path)
+ {
+ var query = new InternalItemsQuery
+ {
+ Path = path
+ };
+
+ // Only use the database result if there's exactly one item, otherwise we run the risk of returning old data that hasn't been cleaned yet.
+ var items = GetItemIds(query).Select(GetItemById).Where(i => i != null).ToArray();
+
+ if (items.Length == 1)
+ {
+ return items[0];
+ }
+
+ if (items.Length == 0)
+ {
+ return null;
+ }
+
+ return RootFolder.FindByPath(path);
+ }
+
///
/// Gets a Person
///
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index 697ec2271..cd439d1f2 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -130,6 +130,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
"create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB, ParentId GUID)",
"create index if not exists idx_TypedBaseItems on TypedBaseItems(guid)",
+ "create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)",
"create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
"create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))",
@@ -1804,6 +1805,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
cmd.Parameters.Add(cmd, "@ParentId", DbType.Guid).Value = query.ParentId.Value;
}
+ if (!string.IsNullOrWhiteSpace(query.Path))
+ {
+ whereClauses.Add("Path=@Path");
+ cmd.Parameters.Add(cmd, "@Path", DbType.String).Value = query.Path;
+ }
+
if (query.MinEndDate.HasValue)
{
whereClauses.Add("EndDate>=@MinEndDate");
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncHelper.cs b/MediaBrowser.Server.Implementations/Sync/SyncHelper.cs
index b6242950f..fb4e0c6be 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncHelper.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncHelper.cs
@@ -10,11 +10,11 @@ namespace MediaBrowser.Server.Implementations.Sync
{
if (string.Equals(quality, "medium", StringComparison.OrdinalIgnoreCase))
{
- profileBitrate = Math.Min(Convert.ToInt32(profileBitrate.Value * .7), 4000000);
+ profileBitrate = Math.Min(profileBitrate.Value, 4000000);
}
else if (string.Equals(quality, "low", StringComparison.OrdinalIgnoreCase))
{
- profileBitrate = Math.Min(Convert.ToInt32(profileBitrate.Value * .5), 1500000);
+ profileBitrate = Math.Min(profileBitrate.Value, 1500000);
}
}