| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 | using MediaBrowser.Controller.Dto;using MediaBrowser.Controller.Entities;using MediaBrowser.Controller.Entities.Audio;using MediaBrowser.Controller.Library;using MediaBrowser.Controller.Providers;using ServiceStack;using System;using System.Linq;using System.Threading;using System.Threading.Tasks;namespace MediaBrowser.Api{    public class BaseRefreshRequest : IReturnVoid    {        [ApiMember(Name = "Forced", Description = "Indicates if a normal or forced refresh should occur.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")]        public bool Forced { get; set; }    }    [Route("/Items/{Id}/Refresh", "POST")]    [Api(Description = "Refreshes metadata for an item")]    public class RefreshItem : BaseRefreshRequest    {        [ApiMember(Name = "Recursive", Description = "Indicates if the refresh should occur recursively.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")]        public bool Recursive { get; set; }        [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]        public string Id { get; set; }    }    [Route("/Artists/{Name}/Refresh", "POST")]    [Api(Description = "Refreshes metadata for an artist")]    public class RefreshArtist : BaseRefreshRequest    {        [ApiMember(Name = "Name", Description = "Name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]        public string Name { get; set; }    }    [Route("/Genres/{Name}/Refresh", "POST")]    [Api(Description = "Refreshes metadata for a genre")]    public class RefreshGenre : BaseRefreshRequest    {        [ApiMember(Name = "Name", Description = "Name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]        public string Name { get; set; }    }    [Route("/MusicGenres/{Name}/Refresh", "POST")]    [Api(Description = "Refreshes metadata for a music genre")]    public class RefreshMusicGenre : BaseRefreshRequest    {        [ApiMember(Name = "Name", Description = "Name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]        public string Name { get; set; }    }    [Route("/GameGenres/{Name}/Refresh", "POST")]    [Api(Description = "Refreshes metadata for a game genre")]    public class RefreshGameGenre : BaseRefreshRequest    {        [ApiMember(Name = "Name", Description = "Name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]        public string Name { get; set; }    }    [Route("/Persons/{Name}/Refresh", "POST")]    [Api(Description = "Refreshes metadata for a person")]    public class RefreshPerson : BaseRefreshRequest    {        [ApiMember(Name = "Name", Description = "Name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]        public string Name { get; set; }    }    [Route("/Studios/{Name}/Refresh", "POST")]    [Api(Description = "Refreshes metadata for a studio")]    public class RefreshStudio : BaseRefreshRequest    {        [ApiMember(Name = "Name", Description = "Name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]        public string Name { get; set; }    }    public class ItemRefreshService : BaseApiService    {        private readonly ILibraryManager _libraryManager;        private readonly IDtoService _dtoService;        public ItemRefreshService(ILibraryManager libraryManager, IDtoService dtoService)        {            _libraryManager = libraryManager;            _dtoService = dtoService;        }        public void Post(RefreshArtist request)        {            var task = RefreshArtist(request);            Task.WaitAll(task);        }        private async Task RefreshArtist(RefreshArtist request)        {            var item = GetArtist(request.Name, _libraryManager);            var cancellationToken = CancellationToken.None;            var albums = _libraryManager.RootFolder                                        .RecursiveChildren                                        .OfType<MusicAlbum>()                                        .Where(i => i.HasArtist(item.Name))                                        .ToList();            var musicArtists = albums                .Select(i => i.Parent)                .OfType<MusicArtist>()                .ToList();            var options = GetRefreshOptions(request);            var musicArtistRefreshTasks = musicArtists.Select(i => i.ValidateChildren(new Progress<double>(), cancellationToken, options, true));            await Task.WhenAll(musicArtistRefreshTasks).ConfigureAwait(false);            try            {                await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);            }            catch (Exception ex)            {                Logger.ErrorException("Error refreshing library", ex);            }        }        public void Post(RefreshGenre request)        {            var task = RefreshGenre(request);            Task.WaitAll(task);        }        private async Task RefreshGenre(RefreshGenre request)        {            var item = GetGenre(request.Name, _libraryManager);            try            {                await item.RefreshMetadata(GetRefreshOptions(request), CancellationToken.None).ConfigureAwait(false);            }            catch (Exception ex)            {                Logger.ErrorException("Error refreshing library", ex);            }        }        public void Post(RefreshMusicGenre request)        {            var task = RefreshMusicGenre(request);            Task.WaitAll(task);        }        private async Task RefreshMusicGenre(RefreshMusicGenre request)        {            var item = GetMusicGenre(request.Name, _libraryManager);            try            {                await item.RefreshMetadata(GetRefreshOptions(request), CancellationToken.None).ConfigureAwait(false);            }            catch (Exception ex)            {                Logger.ErrorException("Error refreshing library", ex);            }        }        public void Post(RefreshGameGenre request)        {            var task = RefreshGameGenre(request);            Task.WaitAll(task);        }        private async Task RefreshGameGenre(RefreshGameGenre request)        {            var item = GetGameGenre(request.Name, _libraryManager);            try            {                await item.RefreshMetadata(GetRefreshOptions(request), CancellationToken.None).ConfigureAwait(false);            }            catch (Exception ex)            {                Logger.ErrorException("Error refreshing library", ex);            }        }        public void Post(RefreshPerson request)        {            var task = RefreshPerson(request);            Task.WaitAll(task);        }        private async Task RefreshPerson(RefreshPerson request)        {            var item = GetPerson(request.Name, _libraryManager);            try            {                await item.RefreshMetadata(GetRefreshOptions(request), CancellationToken.None).ConfigureAwait(false);            }            catch (Exception ex)            {                Logger.ErrorException("Error refreshing library", ex);            }        }        public void Post(RefreshStudio request)        {            var task = RefreshStudio(request);            Task.WaitAll(task);        }        private async Task RefreshStudio(RefreshStudio request)        {            var item = GetStudio(request.Name, _libraryManager);            try            {                await item.RefreshMetadata(GetRefreshOptions(request), CancellationToken.None).ConfigureAwait(false);            }            catch (Exception ex)            {                Logger.ErrorException("Error refreshing library", ex);            }        }        /// <summary>        /// Posts the specified request.        /// </summary>        /// <param name="request">The request.</param>        public void Post(RefreshItem request)        {            var task = RefreshItem(request);            Task.WaitAll(task);        }        /// <summary>        /// Refreshes the item.        /// </summary>        /// <param name="request">The request.</param>        /// <returns>Task.</returns>        private async Task RefreshItem(RefreshItem request)        {            var item = _dtoService.GetItemByDtoId(request.Id);            var options = GetRefreshOptions(request);                        try            {                await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);                if (item.IsFolder)                {                    // Collection folders don't validate their children so we'll have to simulate that here                    var collectionFolder = item as CollectionFolder;                    if (collectionFolder != null)                    {                        await RefreshCollectionFolderChildren(request, collectionFolder).ConfigureAwait(false);                    }                    else                    {                        var folder = (Folder)item;                        await folder.ValidateChildren(new Progress<double>(), CancellationToken.None, options, request.Recursive).ConfigureAwait(false);                    }                }            }            catch (Exception ex)            {                Logger.ErrorException("Error refreshing library", ex);            }        }        /// <summary>        /// Refreshes the collection folder children.        /// </summary>        /// <param name="request">The request.</param>        /// <param name="collectionFolder">The collection folder.</param>        /// <returns>Task.</returns>        private async Task RefreshCollectionFolderChildren(RefreshItem request, CollectionFolder collectionFolder)        {            var options = GetRefreshOptions(request);            foreach (var child in collectionFolder.Children.ToList())            {                await child.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);                if (child.IsFolder)                {                    var folder = (Folder)child;                    await folder.ValidateChildren(new Progress<double>(), CancellationToken.None, options, request.Recursive).ConfigureAwait(false);                }            }        }        private MetadataRefreshOptions GetRefreshOptions(BaseRefreshRequest request)        {            return new MetadataRefreshOptions            {                MetadataRefreshMode = MetadataRefreshMode.FullRefresh,                ImageRefreshMode = ImageRefreshMode.FullRefresh,                ReplaceAllMetadata = request.Forced            };        }    }}
 |