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; }
    }
}