public async Task <FileOrganizationResult> OrganizeWithCorrection(EpisodeFileOrganizationRequest request, AutoOrganizeOptions options, CancellationToken cancellationToken)
        {
            var result = _organizationService.GetResult(request.ResultId);

            Series series = null;

            if (request.NewSeriesProviderIds.Count > 0)
            {
                // We're having a new series here
                SeriesInfo seriesRequest = new SeriesInfo();
                seriesRequest.ProviderIds = request.NewSeriesProviderIds;

                var refreshOptions = new MetadataRefreshOptions(_fileSystem);
                series      = new Series();
                series.Id   = Guid.NewGuid();
                series.Name = request.NewSeriesName;

                int year;
                if (int.TryParse(request.NewSeriesYear, out year))
                {
                    series.ProductionYear = year;
                }

                var seriesFolderName = series.Name;
                if (series.ProductionYear.HasValue)
                {
                    seriesFolderName = string.Format("{0} ({1})", seriesFolderName, series.ProductionYear);
                }

                series.Path = Path.Combine(request.TargetFolder, seriesFolderName);

                series.ProviderIds = request.NewSeriesProviderIds;

                await series.RefreshMetadata(refreshOptions, cancellationToken);
            }

            if (series == null)
            {
                // Existing Series
                series = (Series)_libraryManager.GetItemById(new Guid(request.SeriesId));
            }

            await OrganizeEpisode(result.OriginalPath,
                                  series,
                                  request.SeasonNumber,
                                  request.EpisodeNumber,
                                  request.EndingEpisodeNumber,
                                  null,
                                  options,
                                  true,
                                  request.RememberCorrection,
                                  result,
                                  cancellationToken).ConfigureAwait(false);

            await _organizationService.SaveResult(result, CancellationToken.None).ConfigureAwait(false);

            return(result);
        }
示例#2
0
        public FileOrganizationResult OrganizeWithCorrection(MovieFileOrganizationRequest request, MovieFileOrganizationOptions options, CancellationToken cancellationToken)
        {
            var result = _organizationService.GetResult(request.ResultId);

            try
            {
                Movie movie = null;

                if (request.NewMovieProviderIds.Count > 0)
                {
                    BaseItem targetFolder = null;

                    if (!string.IsNullOrEmpty(options.DefaultMovieLibraryPath))
                    {
                        targetFolder = _libraryManager.FindByPath(options.DefaultMovieLibraryPath, true);
                    }

                    // To avoid Series duplicate by mistake (Missing SmartMatch and wrong selection in UI)
                    movie = CreateNewMovie(request, targetFolder, result, options, cancellationToken);
                }

                if (movie == null)
                {
                    // Existing movie
                    movie = (Movie)_libraryManager.GetItemById(request.MovieId);
                    var newPath      = GetMoviePath(result.OriginalPath, movie, options);
                    var targetFolder = _libraryManager
                                       .GetVirtualFolders()
                                       .Where(i => string.Equals(i.CollectionType, CollectionType.Movies.ToString(), StringComparison.OrdinalIgnoreCase))
                                       .FirstOrDefault()
                                       .Locations
                                       .Where(i => movie.Path.Contains(i))
                                       .FirstOrDefault();
                    movie.Path = Path.Combine(targetFolder, newPath);
                }

                // We manually set the media as Movie
                result.Type = CurrentFileOrganizerType;

                OrganizeMovie(result.OriginalPath,
                              movie,
                              options,
                              null,
                              result,
                              cancellationToken);

                _organizationService.SaveResult(result, CancellationToken.None);
            }
            catch (Exception ex)
            {
                result.Status        = FileSortingStatus.Failure;
                result.StatusMessage = ex.Message;
                _logger.ErrorException("Error organizing file {0}", ex, result.OriginalPath);
            }

            return(result);
        }
示例#3
0
        public async Task <FileOrganizationResult> OrganizeWithCorrection(
            EpisodeFileOrganizationRequest request,
            TvFileOrganizationOptions options,
            CancellationToken cancellationToken)
        {
            var result = _organizationService.GetResult(request.ResultId);

            try
            {
                Series series = null;

                if (request.NewSeriesProviderIds.Count > 0)
                {
                    BaseItem targetFolder = null;

                    if (!string.IsNullOrEmpty(options.DefaultSeriesLibraryPath))
                    {
                        targetFolder = _libraryManager.FindByPath(options.DefaultSeriesLibraryPath, true);
                    }

                    series = CreateNewSeries(request, targetFolder, null, options, cancellationToken);
                }

                if (series == null)
                {
                    // Existing Series
                    series = (Series)_libraryManager.GetItemById(request.SeriesId);
                }

                // We manually set the media as Series
                result.Type = CurrentFileOrganizerType;

                await OrganizeEpisode(result.OriginalPath,
                                      series,
                                      request.SeasonNumber,
                                      request.EpisodeNumber,
                                      request.EndingEpisodeNumber,
                                      null,
                                      options,
                                      request.RememberCorrection,
                                      result,
                                      cancellationToken).ConfigureAwait(false);

                _organizationService.SaveResult(result, CancellationToken.None);
            }
            catch (Exception ex)
            {
                result.Status        = FileSortingStatus.Failure;
                result.StatusMessage = ex.Message;
                _logger.ErrorException("Error organizing file {0}", ex, result.OriginalPath);
            }

            return(result);
        }
示例#4
0
        public async Task <FileOrganizationResult> OrganizeWithCorrection(EpisodeFileOrganizationRequest request, TvFileOrganizationOptions options, CancellationToken cancellationToken)
        {
            var result = _organizationService.GetResult(request.ResultId);

            var series = (Series)_libraryManager.GetItemById(new Guid(request.SeriesId));

            await OrganizeEpisode(result.OriginalPath, series, request.SeasonNumber, request.EpisodeNumber, request.EndingEpisodeNumber, options, true, result, cancellationToken).ConfigureAwait(false);

            await _organizationService.SaveResult(result, CancellationToken.None).ConfigureAwait(false);

            return(result);
        }
示例#5
0
        public async Task <FileOrganizationResult> OrganizeWithCorrection(MovieFileOrganizationRequest request, MovieFileOrganizationOptions options, CancellationToken cancellationToken)
        {
            var result = _organizationService.GetResult(request.ResultId);

            try
            {
                Movie movie = null;

                if (request.NewMovieProviderIds.Count > 0)
                {
                    // To avoid Series duplicate by mistake (Missing SmartMatch and wrong selection in UI)
                    movie = CreateNewMovie(request, result, options, cancellationToken);
                }

                if (movie == null)
                {
                    // Existing movie
                    movie = (Movie)_libraryManager.GetItemById(request.MovieId);
                    var newPath      = GetMoviePath(result.OriginalPath, movie, options);
                    var targetFolder = _libraryManager
                                       .GetVirtualFolders()
                                       .Where(i => i.CollectionType == CollectionType.Movies)
                                       .FirstOrDefault()
                                       .Locations
                                       .Where(i => movie.Path.Contains(i))
                                       .FirstOrDefault();
                    movie.Path = Path.Combine(targetFolder, newPath);
                }

                // We manually set the media as Movie
                result.Type = CurrentFileOrganizerType;

                await OrganizeMovie(result.OriginalPath,
                                    movie,
                                    options,
                                    null,
                                    result,
                                    cancellationToken).ConfigureAwait(false);

                _organizationService.SaveResult(result, CancellationToken.None);
            }
            catch (Exception ex)
            {
                result.Status        = FileSortingStatus.Failure;
                result.StatusMessage = ex.Message;
            }

            return(result);
        }
示例#6
0
        /// <summary>
        /// Organize an episode file with parameters provided by the end-user.
        /// </summary>
        /// <param name="request">The parameters provided by the user via API request.</param>
        /// <param name="options">The organization options to use.</param>
        /// <param name="cancellationToken">A cancellation token for the operation.</param>
        /// <returns>A task representing the organization operation and containing the operation result.</returns>
        public async Task <FileOrganizationResult> OrganizeWithCorrection(
            EpisodeFileOrganizationRequest request,
            TvFileOrganizationOptions options,
            CancellationToken cancellationToken)
        {
            var result = _organizationService.GetResult(request.ResultId);

            try
            {
                Series series = null;

                if (request.NewSeriesProviderIds.Count > 0)
                {
                    series = await CreateNewSeries(request, null, options, cancellationToken).ConfigureAwait(false);
                }

                if (series == null)
                {
                    // Existing Series
                    series = (Series)_libraryManager.GetItemById(request.SeriesId);
                }

                // We manually set the media as Series
                result.Type = CurrentFileOrganizerType;

                await OrganizeEpisode(
                    result.OriginalPath,
                    series,
                    request.SeasonNumber,
                    request.EpisodeNumber,
                    request.EndingEpisodeNumber,
                    null,
                    options,
                    request.RememberCorrection,
                    result,
                    cancellationToken).ConfigureAwait(false);

                _organizationService.SaveResult(result, CancellationToken.None);
            }
            catch (Exception ex)
            {
                result.Status        = FileSortingStatus.Failure;
                result.StatusMessage = ex.Message;
            }

            return(result);
        }
        public async Task <FileOrganizationResult> OrganizeWithCorrection(MovieFileOrganizationRequest request, MovieFileOrganizationOptions options, CancellationToken cancellationToken)
        {
            var result = _organizationService.GetResult(request.ResultId);

            try
            {
                Movie movie = null;

                if (request.NewMovieProviderIds.Count > 0)
                {
                    // To avoid Series duplicate by mistake (Missing SmartMatch and wrong selection in UI)
                    movie = CreateNewMovie(request, result.OriginalPath, options, cancellationToken);
                }

                if (movie == null)
                {
                    // Existing movie
                    movie = (Movie)_libraryManager.GetItemById(new Guid(request.MovieId));
                }

                // We manually set the media as Movie
                result.Type = CurrentFileOrganizerType;

                await OrganizeMovie(result.OriginalPath,
                                    movie,
                                    options,
                                    null,
                                    true,
                                    result,
                                    cancellationToken).ConfigureAwait(false);

                await _organizationService.SaveResult(result, CancellationToken.None).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                result.Status        = FileSortingStatus.Failure;
                result.StatusMessage = ex.Message;
            }

            return(result);
        }