public virtual void Start() { _iisProvider.StopServer(); _securityProvider.MakeAccessible(); if (_securityProvider.IsCurrentUserAdmin()) { var tempFiles = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "Temporary ASP.NET Files"); logger.Debug("Creating Temporary ASP.Net folder: {0}", tempFiles); _diskProvider.CreateDirectory(tempFiles); } _iisProvider.StartServer(); //Todo: verify that IIS is actually started _debuggerProvider.Attach(); if (_environmentProvider.IsUserInteractive && _configFileProvider.LaunchBrowser) { try { logger.Info("Starting default browser. {0}", _iisProvider.AppUrl); _processProvider.Start(_iisProvider.AppUrl); } catch (Exception e) { logger.ErrorException("Failed to open URL in default browser.", e); } } _monitoringProvider.Start(); }
public JsonResult AddNewSeries(string path, string seriesName, int seriesId, int qualityProfileId, string startDate) { if (string.IsNullOrWhiteSpace(path) || String.Equals(path, "null", StringComparison.InvariantCultureIgnoreCase)) { return(JsonNotificationResult.Error("Couldn't add " + seriesName, "You need a valid root folder")); } path = Path.Combine(path, MediaFileProvider.CleanFilename(seriesName)); //Create the folder for the new series //Use the created folder name when adding the series path = _diskProvider.CreateDirectory(path); return(AddExistingSeries(path, seriesName, seriesId, qualityProfileId, startDate)); }
public virtual bool Download(Series series) { var bannerPath = _environmentProvider.GetBannerPath(); logger.Trace("Ensuring Banner Folder exists: ", bannerPath); _diskProvider.CreateDirectory(bannerPath); var bannerFilename = Path.Combine(bannerPath, series.SeriesId.ToString()) + ".jpg"; logger.Trace("Downloading banner for '{0}'", series.Title); try { _httpProvider.DownloadFile(BANNER_URL_PREFIX + series.BannerUrl, bannerFilename); logger.Trace("Successfully download banner for '{0}'", series.Title); } catch (Exception) { logger.Debug("Failed to download banner for '{0}'", series.Title); return(false); } return(true); }
public virtual void ProcessDownload(DirectoryInfo subfolderInfo) { if (subfolderInfo.Name.StartsWith("_") && _diskProvider.GetLastDirectoryWrite(subfolderInfo.FullName).AddMinutes(2) > DateTime.UtcNow) { Logger.Trace("[{0}] is too fresh. skipping", subfolderInfo.Name); return; } if (_diskProvider.IsFolderLocked(subfolderInfo.FullName)) { Logger.Trace("[{0}] is currently locked by another process, skipping", subfolderInfo.Name); return; } string seriesName = Parser.ParseSeriesName(RemoveStatusFromFolderName(subfolderInfo.Name)); var series = _seriesProvider.FindSeries(seriesName); if (series == null) { Logger.Trace("Unknown Series on Import: {0}", subfolderInfo.Name); TagFolder(subfolderInfo, PostDownloadStatusType.UnknownSeries); return; } if (!_diskProvider.FolderExists(series.Path)) { Logger.Warn("Series Folder doesn't exist: {0}, creating it.", series.Path); _diskProvider.CreateDirectory(series.Path); } var size = _diskProvider.GetDirectorySize(subfolderInfo.FullName); var freeSpace = _diskProvider.FreeDiskSpace(new DirectoryInfo(series.Path)); if (Convert.ToUInt64(size) > freeSpace) { Logger.Error("Not enough free disk space for series: {0}, {1}", series.Title, series.Path); return; } _diskScanProvider.CleanUpDropFolder(subfolderInfo.FullName); var importedFiles = _diskScanProvider.Scan(series, subfolderInfo.FullName); importedFiles.ForEach(file => _diskScanProvider.MoveEpisodeFile(file, true)); //Create Metadata for all the episode files found if (importedFiles.Any()) { _metadataProvider.CreateForEpisodeFiles(importedFiles); } //Delete the folder only if folder is small enough if (_diskProvider.GetDirectorySize(subfolderInfo.FullName) < Constants.IgnoreFileSize) { Logger.Trace("Episode(s) imported, deleting folder: {0}", subfolderInfo.Name); _diskProvider.DeleteFolder(subfolderInfo.FullName, true); } else { if (importedFiles.Count == 0) { Logger.Trace("No Imported files: {0}", subfolderInfo.Name); TagFolder(subfolderInfo, PostDownloadStatusType.ParseError); } else { //Unknown Error Importing (Possibly a lesser quality than episode currently on disk) Logger.Trace("Unable to import series (Unknown): {0}", subfolderInfo.Name); TagFolder(subfolderInfo, PostDownloadStatusType.Unknown); } } }
public virtual EpisodeFile MoveEpisodeFile(EpisodeFile episodeFile, bool newDownload = false) { if (episodeFile == null) { throw new ArgumentNullException("episodeFile"); } var series = _seriesProvider.GetSeries(episodeFile.SeriesId); var episodes = _episodeProvider.GetEpisodesByFileId(episodeFile.EpisodeFileId); string newFileName = _mediaFileProvider.GetNewFilename(episodes, series, episodeFile.Quality, episodeFile.Proper, episodeFile); var newFile = _mediaFileProvider.CalculateFilePath(series, episodes.First().SeasonNumber, newFileName, Path.GetExtension(episodeFile.Path)); //Only rename if existing and new filenames don't match if (DiskProvider.PathEquals(episodeFile.Path, newFile.FullName)) { Logger.Debug("Skipping file rename, source and destination are the same: {0}", episodeFile.Path); return(null); } if (!_diskProvider.FileExists(episodeFile.Path)) { Logger.Error("Episode file path does not exist, {0}", episodeFile.Path); return(null); } _diskProvider.CreateDirectory(newFile.DirectoryName); Logger.Debug("Moving [{0}] > [{1}]", episodeFile.Path, newFile.FullName); _diskProvider.MoveFile(episodeFile.Path, newFile.FullName); //Wrapped in Try/Catch to prevent this from causing issues with remote NAS boxes, the move worked, which is more important. try { _diskProvider.InheritFolderPermissions(newFile.FullName); } catch (UnauthorizedAccessException ex) { Logger.Debug("Unable to apply folder permissions to: ", newFile.FullName); Logger.TraceException(ex.Message, ex); } episodeFile.Path = newFile.FullName; _mediaFileProvider.Update(episodeFile); var parseResult = Parser.ParsePath(episodeFile.Path); parseResult.Series = series; parseResult.Quality = new QualityModel { Quality = episodeFile.Quality, Proper = episodeFile.Proper }; parseResult.Episodes = episodes; var message = _downloadProvider.GetDownloadTitle(parseResult); if (newDownload) { _externalNotificationProvider.OnDownload(message, series); foreach (var episode in episodes) { _signalRProvider.UpdateEpisodeStatus(episode.EpisodeId, EpisodeStatusType.Ready, parseResult.Quality); } } else { _externalNotificationProvider.OnRename(message, series); } return(episodeFile); }