public async Task <bool> ProcessEntry(string url, string processId, PerformContext context) { var connection = new HubConnectionBuilder() .WithUrl($"{_appSettings.RealtimeUrl}/publicupdates") .Build(); await connection.StartAsync(); var fileName = $"{processId}.mp3"; var outputFile = Path.Combine(Path.GetTempPath(), fileName); var processResult = await _urlProcessService.DownloadAudioV2(processId, url, outputFile, (e) => { connection.InvokeAsync("SendMessage", processId, "processing", e); return(true); }); if (!processResult || !File.Exists(outputFile)) { return(false); } var info = await _downloader.GetInfo(url, string.Empty); var localImageFile = await HttpUtils.DownloadFile("https://cdn.podnoms.com/static/images/pn-back.jpg"); _tagger.CreateTags( outputFile, localImageFile, _downloader.RawProperties?.Title ?? "Downloaded by PodNoms", "Downloaded by PodNoms", "Downloaded By PodNoms", "Downloaded By PodNoms", "Downloaded By PodNoms"); var cdnFilename = $"processed/{fileName}"; var uploadResult = await _fileUploader.UploadFile( outputFile, "public", cdnFilename, "audio/mpeg", async (p, t) => { var progress = new ProcessingProgress(new TransferProgress { Percentage = p, TotalSize = t.ToString() }) { Progress = "Caching", ProcessingStatus = ProcessingStatus.Uploading.ToString() }; await connection.InvokeAsync("SendMessage", processId, "processing", progress); } ); var message = new ProcessingProgress(null) { Payload = Flurl.Url.Combine(_storageSettings.CdnUrl, "public", cdnFilename), Progress = "Processed", ProcessingStatus = ProcessingStatus.Processed.ToString() }; await connection.InvokeAsync("SendMessage", processId, "processing", message); return(true); }
// [MaximumConcurrentExecutions(1)] // [DisableConcurrentExecution(timeoutInSeconds: 60 * 60 * 2)] public async Task <bool> Execute(ParsedItemResult item, Guid playlistId, PerformContext context) { _setContext(context); if (item is null || string.IsNullOrEmpty(item.VideoType)) { return(false); } Log($"Starting process item:\n\t{item.Id}\n\t{item.Title}\n\thttps://www.youtube.com/watch?v={item.Id}"); var playlist = await _playlistRepository.GetAsync(playlistId); var url = item.VideoType.ToLower().Equals("youtube") ? $"https://www.youtube.com/watch?v={item.Id}" : item.VideoType.Equals("mixcloud") ? $"https://mixcloud.com/{item.Id}" : string.Empty; if (string.IsNullOrEmpty(url)) { LogError($"Unknown video type for ParsedItem: {item.Id} - {playlist.Id}"); } else { Log($"Getting info"); var info = await _audioDownloader.GetInfo(url, playlist.Podcast.AppUserId); if (info != RemoteUrlType.Invalid) { Log($"URL is valid"); var podcast = await _podcastRepository.GetAsync(playlist.PodcastId); var uid = Guid.NewGuid(); Log($"Downloading audio"); var localFile = Path.Combine(Path.GetTempPath(), $"{System.Guid.NewGuid()}.mp3"); try { var entry = new PodcastEntry { SourceUrl = url, ProcessingStatus = ProcessingStatus.Uploading, Playlist = playlist, Podcast = podcast }; await _processor.GetInformation(entry, podcast.AppUserId); podcast.PodcastEntries.Add(entry); await _unitOfWork.CompleteAsync(); var result = await _preProcessor.PreProcessEntry(podcast.AppUser, entry); return(result == EntryProcessResult.Succeeded); } catch (AudioDownloadException e) { //TODO: we should mark this as failed //so we don't continuously process it LogError(e.Message); } } else { LogError($"Processing playlist item {item.Id} failed"); return(false); } } return(true); }