Reputation: 14980
I am trying to implement a program that will download video files from youtube. I have written this small windows console app that has two files.
Downloader.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using VideoLibrary;
using System.IO;
namespace AsyncAwait
{
public class Downloader
{
public Task DownloadFilesAsync()
{
// In the Real World, we would actually do something...
// For this example, we're just going to print file 0, file 1.
//this will execute the function in a strictly sequential manner.
//await DownloadFile0();
//await DownloadFile1();
//var task1 = DownloadFile0();
//var task2 = DownloadFile1();
//return Task.WhenAll(task1, task2);
//var tasks = new Func<Task>[]
//{
// () => DownloadFile(1),
// () => DownloadFile(2),
// () => DownloadFile(3),
// () => DownloadFile(4),
// () => DownloadFile(5)
//};
//return Task.WhenAll(tasks.Select(task => task()).ToArray());
var tasks2 = new Func<Task>[]
{
() => DownloadYoutubeVideo("https://www.youtube.com/watch?v=OGxgnH8y2NM"),
() => DownloadYoutubeVideo("https://www.youtube.com/watch?v=FNQxxpM1yOs"),
};
return Task.WhenAll(tasks2.Select(task => task()).ToArray());
}
private void SaveVideoToDisk(string link)
{
var youTube = YouTube.Default; // starting point for YouTube actions
var video = youTube.GetVideo(link); // gets a Video object with info about the video
File.WriteAllBytes(@"C:\" + video.FullName, video.GetBytes());
}
public async Task DownloadYoutubeVideo(string link)
{
await Task.Run(() => SaveVideoToDisk(link));
}
public async Task DownloadFile(int TaskNumber)
{
int count = 0;
while (count < 100)
{
Console.WriteLine("Downloading File {0,2} ----> {1,3}%", TaskNumber, count);
await Task.Delay(100);
count++;
}
await Task.Delay(100);
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AsyncAwait
{
class Program
{
static void Main(string[] args)
{
Downloader d = new Downloader();
d.DownloadFilesAsync().Wait();
Console.WriteLine("finished");
}
}
}
I am getting the following error here.
Unhandled Exception: System.AggregateException: One or more errors occurred. ---> System.UnauthorizedAccessException: Access to the path 'C:\Practical Machine Learning Tutorial with Python Intro p.1 - YouTube.mp4' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.File.InternalWriteAllBytes(String path, Byte[] bytes, Boolean checkHost)
at System.IO.File.WriteAllBytes(String path, Byte[] bytes)
at AsyncAwait.Downloader.SaveVideoToDisk(String link) in C:\Software\csharppen\AsyncAwait\AsyncAwait\Downloader.cs:line 50
at AsyncAwait.Downloader.<>c__DisplayClass2_0.<DownloadYoutubeVideo>b__0() in C:\Software\csharppen\AsyncAwait\AsyncAwait\Downloader.cs:line 55
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at AsyncAwait.Downloader.<DownloadYoutubeVideo>d__2.MoveNext() in C:\Software\csharppen\AsyncAwait\AsyncAwait\Downloader.cs:line 55
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at AsyncAwait.Program.Main(String[] args) in C:\Software\csharppen\AsyncAwait\AsyncAwait\Program.cs:line 14
why is this error happening. I am using libvideo to download youtube videos
Upvotes: 0
Views: 366
Reputation: 156
Did you create this directory?
'C:\Practical Machine Learning Tutorial with Python Intro p.1 - YouTube.mp4'
The framework is trying access this path
Upvotes: 1