using System; using System.Collections.Generic; using System.Text; using MovieTube.Client.Scraper; using System.Net; using System.IO; using System.Windows.Forms; using System.Diagnostics; namespace MovieTube.Viewer { public class DownloaderService : IScraperServiceCallback { private WebClient client = new WebClient(); private IDownloadProgress dpClient; private DownloadInfo di; private bool stop; public void Download(DownloadInfo di, IDownloadProgress dpClient) { stop = false; this.dpClient = dpClient; this.di = di; if (di.Link.ScrapState == LinkScrapState.FullyLoaded) OnScrapVideoDetailsCompleted(di.Link); else new ScraperService().ScrapVideosDetailsAsync(this, di.Link); } public void Stop() { lock (this.client) { try { this.stop = true; this.client.CancelAsync(); } catch { } } } public void OnScrapVideoDetailsCompleted(MovieLink link) { di.FilePath = CreateFilename(link); DoDownload(link, di.FilePath); } private string CreateFilename(MovieLink link) { string fileName = link.Parent.Name + "_" + Path.GetFileName(new Uri(link.PlayUrl).AbsolutePath); foreach (char c in System.IO.Path.GetInvalidFileNameChars()) fileName = fileName.Replace(c, '_'); var f = fileName; for(var i = 0 ; i < 1000; i++) { f = Path.Combine(AppSettings.MovieDownloadFolder, f); if (File.Exists(f)) { var f1 = Path.GetFileNameWithoutExtension(fileName); var f2 = Path.GetExtension(fileName); f = String.Format("{0}({1}){2}", f1, i, f2); continue; } } return f; } public void OnScrapError(MovieLink link, string message) { } private void DoDownload(MovieLink movieLink, string filePath) { lock (client) { if (this.stop) return; client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(client_DownloadFileCompleted); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); client.DownloadFileAsync(new Uri(movieLink.PlayUrl), filePath); } } void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { this.dpClient.OnProgress(this.di, e); } void client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { this.dpClient.OnCompletion(this.di, e); } } }