Skip to content

Commit 204a810

Browse files
author
0rga-n1ce
committed
Mirror Rework
* Reworked the whole mirror system * Mirrors are now seperated into search and download mirrors * A new download mirror has been added
1 parent b3755a1 commit 204a810

5 files changed

Lines changed: 168 additions & 65 deletions

File tree

LibHandler/LibHandler.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ public static List<Book> GetBooks(string request)
5555
/// Returns the current mirror.
5656
/// </summary>
5757
/// <returns></returns>
58-
public static Mirror GetCurrentMirror()
59-
=> MirrorHandler.MainMirror;
58+
public static Mirror GetCurrentMirror(MirrorType type)
59+
=> MirrorHandler.GetMainMirror(type);
6060

6161
/// <summary>
6262
/// Sets the current mirror.
6363
/// </summary>
6464
/// <param name="mirror"></param>
6565
public static void SetCurrentMirror(Mirror mirror)
66-
=> MirrorHandler.MainMirror = mirror;
66+
=> MirrorHandler.SetMainMirror(mirror);
6767

6868
/// <summary>
6969
/// Generates the search request url
@@ -73,7 +73,7 @@ public static void SetCurrentMirror(Mirror mirror)
7373
/// <param name="results">Amount of results (25, 50, 100)</param>
7474
/// <returns></returns>
7575
public static string GetRequestFormat(SearchField field, string value, int results) =>
76-
$"https://libgen.rs/search.php?req={value}&res={results}&column={field.ToString().ToLower()}";
76+
$"{MirrorHandler.GetMainMirror(MirrorType.SearchMirror).FullUrl}/search.php?req={value}&res={results}&column={field.ToString().ToLower()}";
7777

7878
}
7979

LibHandler/Models/Mirror.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace LibHandler.Models
4+
{
5+
public class Mirror
6+
{
7+
public string Url { get; set; }
8+
public string FullUrl { get; set; }
9+
[JsonConverter(typeof(JsonStringEnumConverter))]
10+
public MirrorType MirrorType { get; set; }
11+
public string Path { get; set; }
12+
public long LastResponseTime { get; set; }
13+
14+
public Mirror()
15+
{
16+
Url = String.Empty;
17+
FullUrl = String.Empty;
18+
MirrorType = MirrorType.None;
19+
Path = String.Empty;
20+
LastResponseTime = 10000;
21+
}
22+
}
23+
24+
public enum MirrorType
25+
{
26+
SearchMirror,
27+
DownloadMirror,
28+
None
29+
}
30+
31+
}

LibHandler/Resources/mirrors.json

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,28 @@
22
{
33
"Url": "libgen.is",
44
"FullUrl": "https://libgen.is",
5-
"DownloadUrl": "http://library.lol/"
5+
"MirrorType": "SearchMirror"
66
},
77
{
88
"Url": "libgen.rs",
99
"FullUrl": "https://libgen.rs",
10-
"DownloadUrl": "http://library.lol/"
10+
"MirrorType": "SearchMirror"
1111
},
1212
{
1313
"Url": "libgen.st",
1414
"FullUrl": "https://libgen.st",
15-
"DownloadUrl": "http://library.lol/"
15+
"MirrorType": "SearchMirror"
16+
},
17+
{
18+
"Url": "library.lol",
19+
"FullUrl": "http://library.lol",
20+
"MirrorType": "DownloadMirror",
21+
"Path": "/main/"
22+
},
23+
{
24+
"Url": "libgen.rocks",
25+
"FullUrl": "https://libgen.rocks",
26+
"MirrorType": "DownloadMirror",
27+
"Path": "/ads.php?md5="
1628
}
1729
]

LibHandler/Util/BaseApiHandler.cs

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
using HtmlAgilityPack;
22
using System.Net.Http.Headers;
3+
using LibHandler.Models;
34

45
namespace LibHandler.Util
56
{
67
internal class BaseApiHandler
78
{
8-
readonly HttpClient httpClient;
9-
readonly HttpClient httpDownload;
9+
HttpClient httpClient = new HttpClient();
10+
HttpClient httpDownload = new HttpClient();
11+
1012
public BaseApiHandler()
1113
{
12-
httpClient = new HttpClient();
13-
httpClient.BaseAddress = new Uri(MirrorHandler.MainMirror.FullUrl);
14-
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
15-
16-
httpDownload = new HttpClient();
17-
httpDownload.BaseAddress = new Uri(MirrorHandler.MainMirror.DownloadUrl);
18-
httpDownload.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
14+
ReloadUrls();
1915
}
2016

2117
public async Task<List<string>> GetIDs(string request)
2218
{
19+
ReloadUrls();
20+
2321
HttpResponseMessage response = await httpClient.GetAsync(request);
2422
if (response.IsSuccessStatusCode)
2523
{
@@ -46,6 +44,8 @@ public async Task<List<string>> GetIDs(string request)
4644
}
4745
public async Task<string> GetJSONData(List<string> ids)
4846
{
47+
ReloadUrls();
48+
4949
string idString = string.Join(",", ids);
5050

5151
HttpResponseMessage response = await httpClient.GetAsync($"json.php?ids={idString}&fields=*");
@@ -62,26 +62,47 @@ public async Task<string> GetJSONData(List<string> ids)
6262
}
6363
public async Task<string> GetDownloadLink(string md5)
6464
{
65-
HttpResponseMessage response = await httpDownload.GetAsync($"main/{md5}");
65+
Mirror m = MirrorHandler.MainDownloadMirror;
66+
67+
ReloadUrls();
68+
69+
HttpResponseMessage response = await httpDownload.GetAsync(m.Path + md5);
70+
6671
if (response.IsSuccessStatusCode)
6772
{
6873
string res = await response.Content.ReadAsStringAsync();
6974
HtmlDocument html = new HtmlDocument();
7075
html.LoadHtml(res);
7176

72-
HtmlNode download = html.DocumentNode.SelectSingleNode($"//div[@id='download']");
73-
74-
string mainDownload = download.SelectSingleNode("h2/a").Attributes["href"].Value;
75-
return mainDownload;
77+
if (m.Url.Equals("library.lol"))
78+
{
79+
HtmlNode download = html.DocumentNode.SelectSingleNode($"//div[@id='download']");
80+
return download.SelectSingleNode("h2/a").Attributes["href"].Value;
81+
}
82+
else
83+
{
84+
HtmlNode download = html.DocumentNode.SelectSingleNode($"//td[@bgcolor='#A9F5BC']/a");
85+
return m.FullUrl + "/" + download.Attributes["href"].Value;
86+
}
7687
}
7788
else
7889
{
79-
Console.WriteLine(response.ReasonPhrase);
80-
return string.Empty;
81-
}
90+
return $"Error Getting Downloadlink.({response.Content})";
91+
}
8292
}
8393

84-
}
94+
public void ReloadUrls()
95+
{
96+
97+
httpClient = new HttpClient();
98+
httpClient.BaseAddress = new Uri(MirrorHandler.MainSearchMirror.FullUrl);
99+
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
85100

101+
httpDownload = new HttpClient();
102+
httpDownload.BaseAddress = new Uri(MirrorHandler.MainDownloadMirror.FullUrl);
103+
httpDownload.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));
104+
}
105+
106+
}
86107

87108
}

LibHandler/Util/MirrorHandler.cs

Lines changed: 79 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,114 @@
11
using System.Text.Json;
22
using System.Net.NetworkInformation;
33
using System.Reflection;
4+
using LibHandler.Models;
5+
using System.Net;
46

57
namespace LibHandler.Util
68
{
7-
public class Mirror
8-
{
9-
public string Url { get; set; }
10-
public string FullUrl { get; set; }
11-
public string DownloadUrl { get; set; }
12-
public long LastResponseTime { get; set; }
13-
14-
public Mirror()
15-
{
16-
Url = String.Empty;
17-
FullUrl = String.Empty;
18-
DownloadUrl = String.Empty;
19-
LastResponseTime = 10000;
20-
}
21-
}
22-
239
internal static class MirrorHandler
2410
{
25-
private static List<Mirror> Mirrors { get; set; }
26-
public static Mirror MainMirror { get; set; }
11+
private static List<Mirror> SearchMirrors { get; set; }
12+
private static List<Mirror> DownloadMirrors { get; set; }
13+
14+
public static Mirror MainSearchMirror { get; set; }
15+
public static Mirror MainDownloadMirror { get; set; }
2716

2817
static MirrorHandler()
2918
{
3019
StreamReader reader = new StreamReader(
3120
Assembly.GetExecutingAssembly()
3221
.GetManifestResourceStream(DataHandler.MIRROR_CONFIG_PATH) ?? Stream.Null);
3322

34-
//string config = File.ReadAllText(DataHandler.MIRROR_CONFIG_PATH);
3523
string config = reader.ReadToEnd();
36-
Mirrors = JsonSerializer.Deserialize<List<Mirror>>(config) ?? new List<Mirror>();
24+
List<Mirror> mirror = JsonSerializer.Deserialize<List<Mirror>>(config) ?? new List<Mirror>();
25+
26+
SearchMirrors = mirror.Where(m => m.MirrorType.Equals(MirrorType.SearchMirror)).ToList();
27+
DownloadMirrors = mirror.Where(m => m.MirrorType.Equals(MirrorType.DownloadMirror)).ToList();
3728

38-
MainMirror = new Mirror();
39-
MainMirror = GetMainMirror();
29+
SetMirrorsResponseTimes(SearchMirrors);
30+
SetMirrorsResponseTimes(DownloadMirrors);
31+
32+
MainSearchMirror = GetOptimalMirror(SearchMirrors);
33+
MainDownloadMirror = GetOptimalMirror(DownloadMirrors);
4034
}
4135

4236
public static void RemoveMirror(Mirror m)
43-
=> Mirrors.Remove(m);
44-
public static void RemoveMirror(int m)
45-
=> Mirrors.RemoveAt(m);
46-
public static void ReplaceMainMirror()
4737
{
48-
Mirrors.Remove(MainMirror);
49-
MainMirror = GetMainMirror(true);
38+
if (m.MirrorType == MirrorType.SearchMirror) SearchMirrors.Remove(m);
39+
else if (m.MirrorType == MirrorType.DownloadMirror) DownloadMirrors.Remove(m);
5040
}
5141

52-
public static Mirror GetMainMirror(bool refresh = false)
42+
public static void SetMainMirror(Mirror m)
5343
{
54-
if (MainMirror.Url != String.Empty && !refresh) return MainMirror;
55-
56-
Ping ping = new Ping();
44+
if (m.MirrorType.Equals(MirrorType.SearchMirror)) MainSearchMirror = m;
45+
else if (m.MirrorType.Equals(MirrorType.DownloadMirror)) MainDownloadMirror = m;
5746

58-
Mirror optimalMirror = new Mirror();
47+
}
48+
49+
public static void ReplaceMainMirror(MirrorType type)
50+
{
51+
switch (type)
52+
{
53+
case MirrorType.SearchMirror:
54+
SearchMirrors.Remove(MainSearchMirror);
55+
MainSearchMirror = GetOptimalMirror(SearchMirrors);
56+
break;
57+
case MirrorType.DownloadMirror:
58+
DownloadMirrors.Remove(MainDownloadMirror);
59+
MainDownloadMirror = GetOptimalMirror(DownloadMirrors);
60+
break;
61+
}
62+
}
5963

60-
for (int i = 0; i < Mirrors.Count; i++)
64+
public static Mirror GetMainMirror(MirrorType type)
65+
{
66+
Mirror m = type switch
6167
{
62-
PingReply reply = ping.Send(Mirrors[i].Url);
63-
if (reply.Status != IPStatus.Success) continue;
68+
MirrorType.SearchMirror => MainSearchMirror,
69+
MirrorType.DownloadMirror => MainDownloadMirror,
70+
_ => throw new ArgumentOutOfRangeException(nameof(type), "Please provide a valid MirrorType")
71+
};
72+
73+
return m;
74+
}
75+
76+
public static void SetMirrorsResponseTimes(List<Mirror> mirrors)
77+
{
78+
Ping ping = new Ping();
6479

65-
if (reply.RoundtripTime < optimalMirror.LastResponseTime)
80+
for (int i = 0; i < mirrors.Count; i++)
81+
{
82+
PingReply reply = ping.Send(mirrors[i].Url);
83+
Console.WriteLine(reply.Status);
84+
if (reply.Status != IPStatus.Success)
6685
{
67-
Mirrors[i].LastResponseTime = reply.RoundtripTime;
68-
optimalMirror = Mirrors[i];
86+
mirrors[i].LastResponseTime = TryIPPing(mirrors[i].Url);
87+
continue;
6988
}
89+
mirrors[i].LastResponseTime = reply.RoundtripTime;
90+
}
91+
}
92+
93+
public static long TryIPPing(string Url)
94+
{
95+
IPHostEntry host = Dns.GetHostEntry(Url);
96+
Ping p = new Ping();
97+
98+
foreach(IPAddress ip in host.AddressList)
99+
{
100+
PingReply rep = p.Send(ip);
101+
if (rep.Status == IPStatus.Success)
102+
return rep.RoundtripTime;
70103
}
71104

72-
return optimalMirror;
105+
return 10000;
106+
}
107+
108+
public static Mirror GetOptimalMirror(List<Mirror> mirrors)
109+
{
110+
long min = mirrors.Min(m => m.LastResponseTime);
111+
return mirrors.First(m => m.LastResponseTime == min);
73112
}
74113
}
75114
}

0 commit comments

Comments
 (0)