File size: 4,967 Bytes
e26fba6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using MovieTube.Client.Scraper;
using System.Linq;
using System.ComponentModel;
using System.Net;
using System.Collections.Specialized;
namespace MovieTube.Viewer
{
class ScraperService
{
private static List<ScrapRequest> requests = new List<ScrapRequest>();
public string ScrapUrl(string url)
{
return VideoScraperBase.ScrapeUrl(url);
}
public void ScrapVideosDetailsAsync(IScraperServiceCallback callback, Movie movie)
{
foreach (var m in movie.Links)
{
if (m.ScrapState == LinkScrapState.Idle)
ScrapVideosDetailsAsync(callback, m);
}
}
public void ScrapVideosDetailsAsync(IScraperServiceCallback callback, MovieLink link)
{
if (link.ScrapState == LinkScrapState.FullyLoaded)
{
callback.OnScrapVideoDetailsCompleted(link);
return;
}
else if (link.ScrapState == LinkScrapState.VideoDoesNotExists)
{
callback.OnScrapError(link, "Video is removed");
return;
}
lock (requests)
{
var req = requests.FirstOrDefault(x => x.Link == link);
if (req == null)
requests.Add(new ScrapRequest(link, callback));
else if (!req.Clients.Any(x => x == callback))
req.Clients.Add(callback);
if (link.ScrapState == LinkScrapState.Scraping)
return;
}
link.ScrapState = LinkScrapState.Scraping;
ThreadPool.QueueUserWorkItem(delegate
{
try
{
link.PlayUrl = ScrapUrl(link.DowloadUrl);
link.ScrapState = LinkScrapState.FullyLoaded;
link.RetrievedTime = DateTime.Now;
Tracer.WriteLine(String.Format("Provider: {0} , Download Link: {1}, View Link: {2}", link.Provider.ID, link.PlayUrl, link.DowloadUrl));
var request = PopRequest(link);
foreach(var r in request.Clients)
r.OnScrapVideoDetailsCompleted(link);
}
catch (Exception ex)
{
var se = ex as ScraperException;
link.ScrapState = se != null && se.Type == ScraperResult.VideoDoesNotExist ? LinkScrapState.VideoDoesNotExists : LinkScrapState.Idle;
Tracer.WriteLine(String.Format("Error: Provider: {0} , View Link: {1}, Msg: {2}", link.Provider.ID,
link.DowloadUrl, ex.Message));
var request = PopRequest(link);
foreach (var r in request.Clients)
r.OnScrapError(link, ex.Message);
if (link.ScrapState == LinkScrapState.VideoDoesNotExists)
{
try
{
var data = new NameValueCollection();
data.Add("link", link.DowloadUrl);
UpdaterService.PostResource(UrlConstants.LinkRemovedUrl, data);
}
catch { }
}
}
});
}
private ScrapRequest PopRequest(MovieLink link)
{
lock (requests)
{
var r = requests.FirstOrDefault(x => x.Link == link);
requests.Remove(r);
return r;
}
}
}
public interface IScraperServiceCallback
{
void OnScrapVideoDetailsCompleted(MovieLink link);
void OnScrapError(MovieLink link, string message);
}
public interface IDownloadProgress
{
void OnProgress(DownloadInfo di, DownloadProgressChangedEventArgs e);
void OnCompletion(DownloadInfo di, AsyncCompletedEventArgs e);
}
public class DownloadInfo
{
private Guid id = Guid.NewGuid();
public Guid Id { get { return id; } }
public MovieLink Link { get; set; }
public string FilePath { get; set; }
public DownloaderService Service { get; set; }
}
class ScrapRequest
{
public ScrapRequest(MovieLink link, IScraperServiceCallback client)
{
Link = link;
Clients = new List<IScraperServiceCallback>();
Clients.Add(client);
}
public MovieLink Link { get; set; }
public List<IScraperServiceCallback> Clients { get; private set; }
}
}
|