mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-19 12:44:19 +01:00
add option to merge metadata and IBN paths
This commit is contained in:
10
MediaBrowser.Controller/Devices/CameraImageUploadInfo.cs
Normal file
10
MediaBrowser.Controller/Devices/CameraImageUploadInfo.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using MediaBrowser.Model.Devices;
|
||||
|
||||
namespace MediaBrowser.Controller.Devices
|
||||
{
|
||||
public class CameraImageUploadInfo
|
||||
{
|
||||
public LocalFileInfo FileInfo { get; set; }
|
||||
public DeviceInfo Device { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ using MediaBrowser.Model.Events;
|
||||
using MediaBrowser.Model.Querying;
|
||||
using MediaBrowser.Model.Session;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -15,6 +14,10 @@ namespace MediaBrowser.Controller.Devices
|
||||
/// Occurs when [device options updated].
|
||||
/// </summary>
|
||||
event EventHandler<GenericEventArgs<DeviceInfo>> DeviceOptionsUpdated;
|
||||
/// <summary>
|
||||
/// Occurs when [camera image uploaded].
|
||||
/// </summary>
|
||||
event EventHandler<GenericEventArgs<CameraImageUploadInfo>> CameraImageUploaded;
|
||||
|
||||
/// <summary>
|
||||
/// Registers the device.
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
[Obsolete]
|
||||
public class AdultVideo : Video, IHasProductionLocations, IHasTaglines
|
||||
{
|
||||
public List<string> ProductionLocations { get; set; }
|
||||
|
||||
public List<string> Taglines { get; set; }
|
||||
|
||||
public AdultVideo()
|
||||
{
|
||||
Taglines = new List<string>();
|
||||
ProductionLocations = new List<string>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Configuration;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Users;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using MediaBrowser.Model.Users;
|
||||
|
||||
namespace MediaBrowser.Controller.Entities.Audio
|
||||
{
|
||||
@@ -181,10 +181,4 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
[Obsolete]
|
||||
public class MusicAlbumDisc : Folder
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,44 +129,21 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||
var others = items.Except(songs).ToList();
|
||||
|
||||
var totalItems = songs.Count + others.Count;
|
||||
var percentages = new Dictionary<Guid, double>(totalItems);
|
||||
|
||||
var tasks = new List<Task>();
|
||||
var numComplete = 0;
|
||||
|
||||
// Refresh songs
|
||||
foreach (var item in songs)
|
||||
{
|
||||
if (tasks.Count >= 2)
|
||||
{
|
||||
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
tasks.Clear();
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
var innerProgress = new ActionableProgress<double>();
|
||||
|
||||
// Avoid implicitly captured closure
|
||||
var currentChild = item;
|
||||
innerProgress.RegisterAction(p =>
|
||||
{
|
||||
lock (percentages)
|
||||
{
|
||||
percentages[currentChild.Id] = p / 100;
|
||||
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
var percent = percentages.Values.Sum();
|
||||
percent /= totalItems;
|
||||
percent *= 100;
|
||||
progress.Report(percent);
|
||||
}
|
||||
});
|
||||
|
||||
var taskChild = item;
|
||||
tasks.Add(Task.Run(async () => await RefreshItem(taskChild, refreshOptions, innerProgress, cancellationToken).ConfigureAwait(false), cancellationToken));
|
||||
numComplete++;
|
||||
double percent = numComplete;
|
||||
percent /= totalItems;
|
||||
progress.Report(percent * 100);
|
||||
}
|
||||
|
||||
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
tasks.Clear();
|
||||
|
||||
// Refresh current item
|
||||
await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
@@ -175,31 +152,17 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
// Avoid implicitly captured closure
|
||||
var currentChild = item;
|
||||
|
||||
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
||||
lock (percentages)
|
||||
{
|
||||
percentages[currentChild.Id] = 1;
|
||||
|
||||
var percent = percentages.Values.Sum();
|
||||
percent /= totalItems;
|
||||
percent *= 100;
|
||||
progress.Report(percent);
|
||||
}
|
||||
numComplete++;
|
||||
double percent = numComplete;
|
||||
percent /= totalItems;
|
||||
progress.Report(percent * 100);
|
||||
}
|
||||
|
||||
progress.Report(100);
|
||||
}
|
||||
|
||||
private async Task RefreshItem(BaseItem item, MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
|
||||
{
|
||||
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
progress.Report(100);
|
||||
}
|
||||
|
||||
public ArtistInfo GetLookupInfo()
|
||||
{
|
||||
var info = GetItemLookupInfo<ArtistInfo>();
|
||||
|
||||
@@ -283,7 +283,17 @@ namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
get
|
||||
{
|
||||
return _children ?? (_children = LoadChildrenInternal());
|
||||
if (_children == null)
|
||||
{
|
||||
lock (_childrenSyncLock)
|
||||
{
|
||||
if (_children == null)
|
||||
{
|
||||
_children = LoadChildrenInternal();
|
||||
}
|
||||
}
|
||||
}
|
||||
return _children;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -749,28 +759,6 @@ namespace MediaBrowser.Controller.Entities
|
||||
return childrenItems;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves the child.
|
||||
/// </summary>
|
||||
/// <param name="child">The child.</param>
|
||||
/// <returns>BaseItem.</returns>
|
||||
private BaseItem RetrieveChild(Guid child)
|
||||
{
|
||||
var item = LibraryManager.GetItemById(child);
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
if (item is IByReferenceItem)
|
||||
{
|
||||
return LibraryManager.GetOrAddByReferenceItem(item);
|
||||
}
|
||||
|
||||
item.Parent = this;
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
private BaseItem RetrieveChild(BaseItem child)
|
||||
{
|
||||
if (child.Id == Guid.Empty)
|
||||
|
||||
@@ -143,31 +143,19 @@ namespace MediaBrowser.Controller.Entities.Movies
|
||||
var items = GetRecursiveChildren().ToList();
|
||||
|
||||
var totalItems = items.Count;
|
||||
var percentages = new Dictionary<Guid, double>(totalItems);
|
||||
var numComplete = 0;
|
||||
|
||||
// Refresh songs
|
||||
foreach (var item in items)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
var innerProgress = new ActionableProgress<double>();
|
||||
|
||||
// Avoid implicitly captured closure
|
||||
var currentChild = item;
|
||||
innerProgress.RegisterAction(p =>
|
||||
{
|
||||
lock (percentages)
|
||||
{
|
||||
percentages[currentChild.Id] = p / 100;
|
||||
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
var percent = percentages.Values.Sum();
|
||||
percent /= totalItems;
|
||||
percent *= 100;
|
||||
progress.Report(percent);
|
||||
}
|
||||
});
|
||||
|
||||
// Avoid implicitly captured closure
|
||||
await RefreshItem(item, refreshOptions, innerProgress, cancellationToken).ConfigureAwait(false);
|
||||
numComplete++;
|
||||
double percent = numComplete;
|
||||
percent /= totalItems;
|
||||
progress.Report(percent * 100);
|
||||
}
|
||||
|
||||
// Refresh current item
|
||||
@@ -176,13 +164,6 @@ namespace MediaBrowser.Controller.Entities.Movies
|
||||
progress.Report(100);
|
||||
}
|
||||
|
||||
private async Task RefreshItem(BaseItem item, MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
|
||||
{
|
||||
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
progress.Report(100);
|
||||
}
|
||||
|
||||
public override bool IsVisible(User user)
|
||||
{
|
||||
if (base.IsVisible(user))
|
||||
|
||||
@@ -64,8 +64,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
CollectionType.Books,
|
||||
CollectionType.HomeVideos,
|
||||
CollectionType.Photos,
|
||||
string.Empty
|
||||
CollectionType.Photos
|
||||
};
|
||||
|
||||
var collectionFolder = folder as ICollectionFolder;
|
||||
|
||||
@@ -409,12 +409,21 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
private QueryResult<BaseItem> GetMusicLatest(Folder parent, User user, InternalItemsQuery query)
|
||||
{
|
||||
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
|
||||
query.SortOrder = SortOrder.Descending;
|
||||
var items = _userViewManager.GetLatestItems(new LatestItemsQuery
|
||||
{
|
||||
UserId = user.Id.ToString("N"),
|
||||
Limit = GetSpecialItemsLimit(),
|
||||
IncludeItemTypes = new[] { typeof(Audio.Audio).Name },
|
||||
ParentId = (parent == null ? null : parent.Id.ToString("N")),
|
||||
GroupItems = true
|
||||
|
||||
var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }, i => i is MusicVideo || i is Audio.Audio && FilterItem(i, query));
|
||||
}).Select(i => i.Item1);
|
||||
|
||||
return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
||||
query.SortBy = new string[] { };
|
||||
|
||||
//var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }, i => i is MusicVideo || i is Audio.Audio && FilterItem(i, query));
|
||||
|
||||
return PostFilterAndSort(items, parent, null, query);
|
||||
}
|
||||
|
||||
private async Task<QueryResult<BaseItem>> GetMovieFolders(Folder parent, User user, InternalItemsQuery query)
|
||||
@@ -741,7 +750,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
private async Task<QueryResult<BaseItem>> GetGameGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
|
||||
{
|
||||
var items = GetRecursiveChildren(queryParent, user, new[] {CollectionType.Games},
|
||||
var items = GetRecursiveChildren(queryParent, user, new[] { CollectionType.Games },
|
||||
i => i is Game && i.Genres.Contains(displayParent.Name, StringComparer.OrdinalIgnoreCase));
|
||||
|
||||
return GetResult(items, queryParent, query);
|
||||
@@ -1686,7 +1695,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
return parent.GetRecursiveChildren(user);
|
||||
}
|
||||
|
||||
private IEnumerable<BaseItem> GetRecursiveChildren(Folder parent, User user, IEnumerable<string> viewTypes, Func<BaseItem,bool> filter)
|
||||
private IEnumerable<BaseItem> GetRecursiveChildren(Folder parent, User user, IEnumerable<string> viewTypes, Func<BaseItem, bool> filter)
|
||||
{
|
||||
if (parent == null || parent is UserView)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Controller.Playlists;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MediaBrowser.Controller.Library
|
||||
@@ -13,7 +12,7 @@ namespace MediaBrowser.Controller.Library
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="user">The user.</param>
|
||||
/// <returns>IEnumerable{Audio}.</returns>
|
||||
IEnumerable<Audio> GetInstantMixFromSong(Audio item, User user);
|
||||
IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user);
|
||||
/// <summary>
|
||||
/// Gets the instant mix from artist.
|
||||
/// </summary>
|
||||
@@ -22,20 +21,6 @@ namespace MediaBrowser.Controller.Library
|
||||
/// <returns>IEnumerable{Audio}.</returns>
|
||||
IEnumerable<Audio> GetInstantMixFromArtist(string name, User user);
|
||||
/// <summary>
|
||||
/// Gets the instant mix from album.
|
||||
/// </summary>
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="user">The user.</param>
|
||||
/// <returns>IEnumerable{Audio}.</returns>
|
||||
IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user);
|
||||
/// <summary>
|
||||
/// Gets the instant mix from playlist.
|
||||
/// </summary>
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="user">The user.</param>
|
||||
/// <returns>IEnumerable<Audio>.</returns>
|
||||
IEnumerable<Audio> GetInstantMixFromPlaylist(Playlist item, User user);
|
||||
/// <summary>
|
||||
/// Gets the instant mix from genre.
|
||||
/// </summary>
|
||||
/// <param name="genres">The genres.</param>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Model.Library;
|
||||
using MediaBrowser.Model.Querying;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@@ -16,5 +18,7 @@ namespace MediaBrowser.Controller.Library
|
||||
Task<UserView> GetUserView(string type, string sortName, CancellationToken cancellationToken);
|
||||
|
||||
Task<UserView> GetUserView(string category, string type, User user, string sortName, CancellationToken cancellationToken);
|
||||
|
||||
List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
<Compile Include="Collections\ICollectionManager.cs" />
|
||||
<Compile Include="Connect\IConnectManager.cs" />
|
||||
<Compile Include="Connect\UserLinkResult.cs" />
|
||||
<Compile Include="Devices\CameraImageUploadInfo.cs" />
|
||||
<Compile Include="Devices\IDeviceManager.cs" />
|
||||
<Compile Include="Devices\IDeviceRepository.cs" />
|
||||
<Compile Include="Dlna\ControlRequest.cs" />
|
||||
@@ -117,7 +118,6 @@
|
||||
<Compile Include="Drawing\ImageStream.cs" />
|
||||
<Compile Include="Dto\DtoOptions.cs" />
|
||||
<Compile Include="Dto\IDtoService.cs" />
|
||||
<Compile Include="Entities\AdultVideo.cs" />
|
||||
<Compile Include="Entities\Audio\IHasAlbumArtist.cs" />
|
||||
<Compile Include="Entities\Audio\IHasMusicGenres.cs" />
|
||||
<Compile Include="Entities\Book.cs" />
|
||||
|
||||
@@ -113,38 +113,17 @@ namespace MediaBrowser.Controller.Playlists
|
||||
return LibraryManager.Sort(items, user, new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName }, SortOrder.Ascending);
|
||||
}
|
||||
|
||||
// Grab these explicitly to avoid the sorting that will happen below
|
||||
var collection = item as BoxSet;
|
||||
if (collection != null)
|
||||
{
|
||||
var items = user == null
|
||||
? collection.Children
|
||||
: collection.GetChildren(user, true);
|
||||
|
||||
return items
|
||||
.Where(m => !m.IsFolder);
|
||||
}
|
||||
|
||||
// Grab these explicitly to avoid the sorting that will happen below
|
||||
var season = item as Season;
|
||||
if (season != null)
|
||||
{
|
||||
var items = user == null
|
||||
? season.Children
|
||||
: season.GetChildren(user, true);
|
||||
|
||||
return items
|
||||
.Where(m => !m.IsFolder);
|
||||
}
|
||||
|
||||
var folder = item as Folder;
|
||||
|
||||
if (folder != null)
|
||||
{
|
||||
var items = user == null
|
||||
? folder.GetRecursiveChildren(m => !m.IsFolder)
|
||||
: folder.GetRecursiveChildren(user, m => !m.IsFolder);
|
||||
|
||||
if (folder.IsPreSorted)
|
||||
{
|
||||
return items;
|
||||
}
|
||||
return LibraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user