private bool ChangeFileDate(string filePath, DateTime date) { DateTime oldDateTime; if (DateTime.TryParse(_diskProvider.FileGetLastWrite(filePath).ToLongDateString(), out oldDateTime)) { if (!DateTime.Equals(date, oldDateTime)) { try { _diskProvider.FileSetLastWriteTime(filePath, date); _logger.Debug("Date of file [{0}] changed from '{1}' to '{2}'", filePath, oldDateTime, date); return(true); } catch (Exception ex) { _logger.Warn(ex, "Unable to set date of file [" + filePath + "]"); } } } return(false); }
private bool ChangeFileDateToLocalAirDate(string filePath, string fileDate, string fileTime) { DateTime airDate; if (DateTime.TryParse(fileDate + ' ' + fileTime, out airDate)) { // avoiding false +ve checks and set date skewing by not using UTC (Windows) DateTime oldDateTime = _diskProvider.FileGetLastWrite(filePath); if (!DateTime.Equals(airDate, oldDateTime)) { try { _diskProvider.FileSetLastWriteTime(filePath, airDate); _logger.Debug("Date of file [{0}] changed from '{1}' to '{2}'", filePath, oldDateTime, airDate); return(true); } catch (Exception ex) { _logger.WarnException("Unable to set date of file [" + filePath + "]", ex); } } } else { _logger.Debug("Could not create valid date to change file [{0}]", filePath); } return(false); }
public Decision IsSatisfiedBy(LocalEpisode localEpisode) { if (localEpisode.ExistingFile) { _logger.Debug("{0} is in series folder, skipping unpacking check", localEpisode.Path); return(Decision.Accept()); } foreach (var workingFolder in _configService.DownloadClientWorkingFolders.Split('|')) { DirectoryInfo parent = Directory.GetParent(localEpisode.Path); while (parent != null) { if (parent.Name.StartsWith(workingFolder)) { if (OsInfo.IsNotWindows) { _logger.Debug("{0} is still being unpacked", localEpisode.Path); return(Decision.Reject("File is still being unpacked")); } if (_diskProvider.FileGetLastWrite(localEpisode.Path) > DateTime.UtcNow.AddMinutes(-5)) { _logger.Debug("{0} appears to be unpacking still", localEpisode.Path); return(Decision.Reject("File is still being unpacked")); } } parent = parent.Parent; } } return(Decision.Accept()); }
public void Cleanup() { if (string.IsNullOrWhiteSpace(_configService.RecycleBin)) { _logger.Info("Recycle Bin has not been configured, cannot cleanup."); return; } _logger.Info("Removing items older than 7 days from the recycling bin"); foreach (var folder in _diskProvider.GetDirectories(_configService.RecycleBin)) { if (_diskProvider.FolderGetLastWrite(folder).AddDays(7) > DateTime.UtcNow) { _logger.Debug("Folder hasn't expired yet, skipping: {0}", folder); continue; } _diskProvider.DeleteFolder(folder, true); } foreach (var file in _diskProvider.GetFiles(_configService.RecycleBin, SearchOption.TopDirectoryOnly)) { if (_diskProvider.FileGetLastWrite(file).AddDays(7) > DateTime.UtcNow) { _logger.Debug("File hasn't expired yet, skipping: {0}", file); continue; } _diskProvider.DeleteFile(file); } _logger.Debug("Recycling Bin has been cleaned up."); }
public void Cleanup() { if (string.IsNullOrWhiteSpace(_configService.RecycleBin)) { _logger.Info("Recycle Bin has not been configured, cannot cleanup."); return; } var cleanupDays = _configService.RecycleBinCleanupDays; if (cleanupDays == 0) { _logger.Info("Automatic cleanup of Recycle Bin is disabled"); return; } _logger.Info("Removing items older than {0} days from the recycling bin", cleanupDays); foreach (var file in _diskProvider.GetFiles(_configService.RecycleBin, SearchOption.AllDirectories)) { if (_diskProvider.FileGetLastWrite(file).AddDays(cleanupDays) > DateTime.UtcNow) { _logger.Debug("File hasn't expired yet, skipping: {0}", file); continue; } _diskProvider.DeleteFile(file); } _diskProvider.RemoveEmptySubfolders(_configService.RecycleBin); _logger.Debug("Recycling Bin has been cleaned up."); }
public void ConvertToLocalUrls(int seriesId, IEnumerable <MediaCover> covers) { if (seriesId == 0) { // Series isn't in Sonarr yet, map via a proxy to circument referrer issues foreach (var mediaCover in covers) { mediaCover.RemoteUrl = mediaCover.Url; mediaCover.Url = _mediaCoverProxy.RegisterUrl(mediaCover.RemoteUrl); } } else { foreach (var mediaCover in covers) { var filePath = GetCoverPath(seriesId, mediaCover.CoverType); mediaCover.RemoteUrl = mediaCover.Url; mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + seriesId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg"; if (_diskProvider.FileExists(filePath)) { var lastWrite = _diskProvider.FileGetLastWrite(filePath); mediaCover.Url += "?lastWrite=" + lastWrite.Ticks; } } } }
public List <Backup> GetBackups() { var backups = new List <Backup>(); foreach (var backupType in Enum.GetValues(typeof(BackupType)).Cast <BackupType>()) { var folder = GetBackupFolder(backupType); if (_diskProvider.FolderExists(folder)) { backups.AddRange(GetBackupFiles(folder).Select(b => new Backup { Path = Path.GetFileName(b), Type = backupType, Time = _diskProvider.FileGetLastWrite(b) })); } } return(backups); }
private bool ChangeFileDateToLocalAirDate(string filePath, string fileDate, string fileTime) { DateTime airDate; if (DateTime.TryParse(fileDate + ' ' + fileTime, out airDate)) { // avoiding false +ve checks and set date skewing by not using UTC (Windows) DateTime oldDateTime = _diskProvider.FileGetLastWrite(filePath); if (OsInfo.IsNotWindows && airDate < EpochTime) { _logger.Debug("Setting date of file to 1970-01-01 as actual airdate is before that time and will not be set properly"); airDate = EpochTime; } if (!DateTime.Equals(airDate, oldDateTime)) { try { _diskProvider.FileSetLastWriteTime(filePath, airDate); _logger.Debug("Date of file [{0}] changed from '{1}' to '{2}'", filePath, oldDateTime, airDate); return(true); } catch (Exception ex) { _logger.Warn(ex, "Unable to set date of file [" + filePath + "]"); } } } else { _logger.Debug("Could not create valid date to change file [{0}]", filePath); } return(false); }
private bool ChangeFileDate(TrackFile trackFile, Artist artist, List <Track> tracks) { var trackFilePath = trackFile.Path; switch (_configService.FileDate) { case FileDateType.AlbumReleaseDate: { var album = _albumService.GetAlbum(trackFile.AlbumId); if (!album.ReleaseDate.HasValue) { _logger.Debug("Could not create valid date to change file [{0}]", trackFilePath); return(false); } var relDate = album.ReleaseDate.Value; // avoiding false +ve checks and set date skewing by not using UTC (Windows) DateTime oldDateTime = _diskProvider.FileGetLastWrite(trackFilePath); if (OsInfo.IsNotWindows && relDate < EpochTime) { _logger.Debug("Setting date of file to 1970-01-01 as actual airdate is before that time and will not be set properly"); relDate = EpochTime; } if (!DateTime.Equals(relDate, oldDateTime)) { try { _diskProvider.FileSetLastWriteTime(trackFilePath, relDate); _logger.Debug("Date of file [{0}] changed from '{1}' to '{2}'", trackFilePath, oldDateTime, relDate); return(true); } catch (Exception ex) { _logger.Warn(ex, "Unable to set date of file [" + trackFilePath + "]"); } } return(false); } } return(false); }
public void ConvertToLocalUrls(int seriesId, IEnumerable <MediaCover> covers) { foreach (var mediaCover in covers) { var filePath = GetCoverPath(seriesId, mediaCover.CoverType); mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + seriesId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg"; if (_diskProvider.FileExists(filePath)) { var lastWrite = _diskProvider.FileGetLastWrite(filePath); mediaCover.Url += "?lastWrite=" + lastWrite.Ticks; } } }
private string GetHash(string file) { var data = new StringBuilder(); data.Append(file); try { data.Append(_diskProvider.FileGetLastWrite(file).ToBinary()); data.Append(_diskProvider.GetFileSize(file)); } catch (Exception ex) { _logger.Trace(ex, "Ignored hashing error during scan for {0}", file); } return(HashConverter.GetHash(data.ToString()).ToHexString()); }
public void ConvertToLocalUrls(int entityId, MediaCoverEntity coverEntity, IEnumerable <MediaCover> covers) { foreach (var mediaCover in covers) { var filePath = GetCoverPath(entityId, coverEntity, mediaCover.CoverType, mediaCover.Extension, null); if (coverEntity == MediaCoverEntity.Book) { mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/Books/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + mediaCover.Extension; } else { mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + mediaCover.Extension; } if (_diskProvider.FileExists(filePath)) { var lastWrite = _diskProvider.FileGetLastWrite(filePath); mediaCover.Url += "?lastWrite=" + lastWrite.Ticks; } } }
private List <LogFileResource> GetLogFilesResponse() { var result = new List <LogFileResource>(); var files = GetLogFiles().ToList(); for (int i = 0; i < files.Count; i++) { var file = files[i]; var filename = Path.GetFileName(file); result.Add(new LogFileResource { Id = i + 1, Filename = filename, LastWriteTime = _diskProvider.FileGetLastWrite(file), ContentsUrl = string.Format("{0}/api/v1/{1}/{2}", _configFileProvider.UrlBase, Resource, filename), DownloadUrl = string.Format("{0}/{1}/{2}", _configFileProvider.UrlBase, DownloadUrlRoot, filename) }); } return(result.OrderByDescending(l => l.LastWriteTime).ToList()); }
public bool AlreadyExists(DateTime?serverModifiedDate, long?serverContentLength, string localPath) { if (!_diskProvider.FileExists(localPath)) { return(false); } if (serverContentLength.HasValue && serverContentLength.Value > 0) { var fileSize = _diskProvider.GetFileSize(localPath); return(fileSize == serverContentLength); } if (serverModifiedDate.HasValue) { DateTime?lastModifiedLocal = _diskProvider.FileGetLastWrite(localPath); return(lastModifiedLocal.Value.ToUniversalTime() == serverModifiedDate.Value.ToUniversalTime()); } return(false); }
private IEnumerable <WatchFolderItem> GetDownloadItems(string watchFolder, Dictionary <string, WatchFolderItem> lastWatchItems, TimeSpan waitPeriod) { // get a fresh naming config each time, in case the user has made changes foreach (var folder in _diskProvider.GetDirectories(watchFolder)) { var title = FileNameBuilder.CleanFileName(Path.GetFileName(folder)); var newWatchItem = new WatchFolderItem { DownloadId = Path.GetFileName(folder) + "_" + _diskProvider.FolderGetCreationTime(folder).Ticks, Title = title, OutputPath = new OsPath(folder), Status = DownloadItemStatus.Completed, RemainingTime = TimeSpan.Zero }; var oldWatchItem = lastWatchItems.GetValueOrDefault(newWatchItem.DownloadId); if (PreCheckWatchItemExpiry(newWatchItem, oldWatchItem)) { var files = _diskProvider.GetFiles(folder, SearchOption.AllDirectories); newWatchItem.TotalSize = files.Select(_diskProvider.GetFileSize).Sum(); newWatchItem.Hash = GetHash(folder, files); if (files.Any(_diskProvider.IsFileLocked)) { newWatchItem.Status = DownloadItemStatus.Downloading; newWatchItem.RemainingTime = null; } UpdateWatchItemExpiry(newWatchItem, oldWatchItem, waitPeriod); } yield return(newWatchItem); } foreach (var videoFile in _diskScanService.GetVideoFiles(watchFolder, false)) { var title = FileNameBuilder.CleanFileName(Path.GetFileName(videoFile)); var newWatchItem = new WatchFolderItem { DownloadId = Path.GetFileName(videoFile) + "_" + _diskProvider.FileGetLastWrite(videoFile).Ticks, Title = title, OutputPath = new OsPath(videoFile), Status = DownloadItemStatus.Completed, RemainingTime = TimeSpan.Zero }; var oldWatchItem = lastWatchItems.GetValueOrDefault(newWatchItem.DownloadId); if (PreCheckWatchItemExpiry(newWatchItem, oldWatchItem)) { newWatchItem.TotalSize = _diskProvider.GetFileSize(videoFile); newWatchItem.Hash = GetHash(videoFile); if (_diskProvider.IsFileLocked(videoFile)) { newWatchItem.Status = DownloadItemStatus.Downloading; } UpdateWatchItemExpiry(newWatchItem, oldWatchItem, waitPeriod); } yield return(newWatchItem); } }