Пример #1
0
        private void File_OnChange(FileService.FileResult fileResult, List <Media> medias, Action <FileService.FileResult, List <Media> > fileDeliveryCallback = null)
        {
            switch (fileResult.Action)
            {
            case FileService.FileResult.FileAction.Deliver:
                if (fileResult.Status == FileService.FileResult.ActionStatus.OK && (fileResult.Files?.Any() ?? false))
                {
                    File_OnDelivery(fileResult, medias);
                }
                break;

            case FileService.FileResult.FileAction.Rename:
                if (fileResult.Status == FileService.FileResult.ActionStatus.OK && (fileResult.Files?.Any() ?? false))
                {
                    medias.ForEach(x => x.RelativePath = fileResult.Files);
                    this.Library.Save();
                }
                break;

            case FileService.FileResult.FileAction.Delete:
                if (fileResult.Status == FileService.FileResult.ActionStatus.OK || fileResult.Status == FileService.FileResult.ActionStatus.MediaNotFound)
                {
                    medias.ForEach(x => x.RelativePath = new string[0]);
                    this.Library.Save();
                }
                break;
            }

            fileDeliveryCallback?.Invoke(fileResult, medias);
        }
Пример #2
0
        private void File_OnDelivery(FileService.FileResult fileResult, List <Media> medias)
        {
            if (medias.Count == 1)
            {
                medias.First().RelativePath = fileResult.Files;
            }
            else if (medias.All(x => x is Episode))
            {
                var episodes = medias.OfType <Episode>().OrderBy(x => x.Number).ToList();
                try
                {
                    var indexer = GetBestNumberingIndexer(episodes.First(), fileResult);

                    var episodeFiles = fileResult.Files.Select(x => new { Numbering = indexer.GetNumbering(x), File = x }).GroupBy(x => x.Numbering).ToDictionary(x => x.Key, x => x.Select(y => y.File).ToArray());
                    foreach (var media in episodes)
                    {
                        var redirectedMedia = this.Scouter.GetRedirectedMedia(media) as Episode ?? media;
                        media.RelativePath = episodeFiles.GetValueByKey((redirectedMedia.Season, redirectedMedia.Number, null)) ?? episodeFiles.FirstOrDefault(x => x.Key.Season == redirectedMedia.Season && x.Key.Episode <= redirectedMedia.Number && x.Key.Range >= redirectedMedia.Number).Value;
                    }
                }
                catch
                {
                    var alphabeticallyOrderedFiles = new Queue <string>(fileResult.Files.Where(x => this.File.Config.MediaTypes.Contains(System.IO.Path.GetExtension(x).Substring(1))).OrderByDescending(x => x));
                    if (alphabeticallyOrderedFiles.Count() >= medias.Count)
                    {
                        foreach (var media in episodes.OrderByDescending(x => x.Number))
                        {
                            media.RelativePath = new[] { alphabeticallyOrderedFiles.Dequeue() };
                        }

                        if (alphabeticallyOrderedFiles.Count > 0)
                        {
                            var lastEpisode = episodes.Last();
                            lastEpisode.RelativePath = lastEpisode.RelativePath.Concat(alphabeticallyOrderedFiles).ToArray();
                        }
                    }
                }
            }

            // TODO: Some more error handling here? If we fail to correctly apply paths to media then it breaks the functionality that cleans up the library, we need to at the very least log the results of this operation.

            this.Library.Save();
        }
Пример #3
0
 private IIndexer GetBestNumberingIndexer(Media media, FileService.FileResult delivery)
 {
     return(Scouter.GetIndexersForMedia(media).OrderByDescending(idxr => delivery.Files.Count(x => idxr.GetNumbering(x).Episode.HasValue)).FirstOrDefault());
 }