private List<string> GetDecoders(string ffmpegPath) { string output = string.Empty; try { output = GetFFMpegOutput(ffmpegPath, "-decoders"); } catch { } var found = new List<string>(); var required = new[] { "h264_qsv", "mpeg2_qsv", "vc1_qsv" }; foreach (var codec in required) { var srch = " " + codec + " "; if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) == -1) { _logger.Warn("ffmpeg is missing decoder " + codec); } else { found.Add(codec); } } return found; }
private List<string> GetEncoders(string ffmpegPath) { string output = null; try { output = GetFFMpegOutput(ffmpegPath, "-encoders"); } catch { } var found = new List<string>(); var required = new[] { "libx264", "libx265", "mpeg4", "msmpeg4", "libvpx", //"libvpx-vp9", "aac", "ac3", "libmp3lame", "libvorbis", "srt" }; foreach (var codec in required) { var srch = " " + codec + " "; if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) == -1) { _logger.Warn("ffmpeg is missing encoder " + codec); } else { found.Add(codec); } } return found; }
private async Task<SubtitleResponse> GetSubtitlesInternal(string id, SubtitleOptions options, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(id)) { throw new ArgumentNullException("id"); } if (_dailyDownloadCount >= MaxDownloadsPerDay && !options.IsOpenSubtitleVipAccount) { throw new InvalidOperationException("Open Subtitle's daily download limit has been exceeded. Please try again tomorrow."); } var idParts = id.Split(new[] { '-' }, 3); var format = idParts[0]; var language = idParts[1]; var ossId = idParts[2]; var downloadsList = new[] { int.Parse(ossId, _usCulture) }; await Login(cancellationToken).ConfigureAwait(false); var resultDownLoad = await OpenSubtitles.DownloadSubtitlesAsync(downloadsList, cancellationToken).ConfigureAwait(false); if (!(resultDownLoad is MethodResponseSubtitleDownload)) { throw new ApplicationException("Invalid response type"); } var results = ((MethodResponseSubtitleDownload)resultDownLoad).Results; if (results.Count == 0) { var msg = string.Format("Subtitle with Id {0} was not found. Name: {1}. Status: {2}. Message: {3}", ossId, resultDownLoad.Name ?? string.Empty, resultDownLoad.Message ?? string.Empty, resultDownLoad.Status ?? string.Empty); throw new ResourceNotFoundException(msg); } var data = Convert.FromBase64String(results.First().Data); return new SubtitleResponse { Format = format, Language = language, Stream = new MemoryStream(Utilities.Decompress(new MemoryStream(data))) }; }
private string GetInputPathArgument(EncodingJob job) { var protocol = job.InputProtocol; var inputPath = new[] { job.MediaPath }; if (job.IsInputVideo) { if (!(job.VideoType == VideoType.Iso && job.IsoMount == null)) { inputPath = MediaEncoderHelpers.GetInputArgument(FileSystem, job.MediaPath, job.InputProtocol, job.IsoMount, job.PlayableStreamFileNames); } } return MediaEncoder.GetInputArgument(inputPath, protocol); }
private async Task<SubtitleResponse> GetSubtitlesInternal(string id, SubtitleOptions options, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(id)) { throw new ArgumentNullException("id"); } var idParts = id.Split(new[] { '-' }, 3); var format = idParts[0]; var language = idParts[1]; var ossId = idParts[2]; var downloadsList = new[] { int.Parse(ossId, _usCulture) }; await Login(cancellationToken).ConfigureAwait(false); if ((DateTime.UtcNow - _lastRateLimitException).TotalHours < 1) { throw new ApplicationException("OpenSubtitles rate limit reached"); } var resultDownLoad = await OpenSubtitles.DownloadSubtitlesAsync(downloadsList, cancellationToken).ConfigureAwait(false); if ((resultDownLoad.Status ?? string.Empty).IndexOf("407", StringComparison.OrdinalIgnoreCase) != -1) { _lastRateLimitException = DateTime.UtcNow; throw new ApplicationException("OpenSubtitles rate limit reached"); } if (!(resultDownLoad is MethodResponseSubtitleDownload)) { throw new ApplicationException("Invalid response type"); } var results = ((MethodResponseSubtitleDownload)resultDownLoad).Results; _lastRateLimitException = DateTime.MinValue; if (results.Count == 0) { var msg = string.Format("Subtitle with Id {0} was not found. Name: {1}. Status: {2}. Message: {3}", ossId, resultDownLoad.Name ?? string.Empty, resultDownLoad.Status ?? string.Empty, resultDownLoad.Message ?? string.Empty); throw new ResourceNotFoundException(msg); } var data = Convert.FromBase64String(results.First().Data); return new SubtitleResponse { Format = format, Language = language, Stream = new MemoryStream(Utilities.Decompress(new MemoryStream(data))) }; }
private async Task<Tuple<Stream, string>> GetSubtitleStream(string itemId, string mediaSourceId, int subtitleStreamIndex, CancellationToken cancellationToken) { var mediaSources = await _mediaSourceManager.GetPlayackMediaSources(itemId, null, false, new[] { MediaType.Audio, MediaType.Video }, cancellationToken).ConfigureAwait(false); var mediaSource = mediaSources .First(i => string.Equals(i.Id, mediaSourceId)); var subtitleStream = mediaSource.MediaStreams .First(i => i.Type == MediaStreamType.Subtitle && i.Index == subtitleStreamIndex); var inputFiles = new[] { mediaSource.Path }; if (mediaSource.VideoType.HasValue) { if (mediaSource.VideoType.Value == VideoType.BluRay || mediaSource.VideoType.Value == VideoType.Dvd) { var mediaSourceItem = (Video)_libraryManager.GetItemById(new Guid(mediaSourceId)); inputFiles = mediaSourceItem.GetPlayableStreamFiles().ToArray(); } } var fileInfo = await GetReadableFile(mediaSource.Path, inputFiles, mediaSource.Protocol, subtitleStream, cancellationToken).ConfigureAwait(false); var stream = await GetSubtitleStream(fileInfo.Item1, fileInfo.Item2, fileInfo.Item4, cancellationToken).ConfigureAwait(false); return new Tuple<Stream, string>(stream, fileInfo.Item3); }
private string GetInputPathArgument(EncodingJob state) { var protocol = state.InputProtocol; var mediaPath = state.MediaPath ?? string.Empty; var inputPath = new[] { mediaPath }; if (state.IsInputVideo) { if (!(state.VideoType == VideoType.Iso && state.IsoMount == null)) { inputPath = MediaEncoderHelpers.GetInputArgument(FileSystem, mediaPath, state.InputProtocol, state.IsoMount, state.PlayableStreamFileNames); } } return MediaEncoder.GetInputArgument(inputPath, protocol); }
private void ValidateCodecsFromOutput(string output) { var required = new[] { "libx264", "mpeg4", "msmpeg4", "libvpx", //"libvpx-vp9", "aac", "ac3", "libmp3lame", "libvorbis", "srt" }; foreach (var encoder in required) { var srch = " " + encoder + " "; if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) == -1) { _logger.Error("ffmpeg is missing encoder " + encoder); //throw new ArgumentException("ffmpeg is missing encoder " + encoder); } } }