-
Notifications
You must be signed in to change notification settings - Fork 0
/
newznab.py
108 lines (101 loc) · 3.3 KB
/
newznab.py
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
import requests
from config import newznaburl, newznabkey, Preferred, Excluded
from tmdb import get_movie, get_tv
def sizeof_fmt(num, suffix="B"):
num = int(num)
for unit in ("", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"):
if abs(num) < 1024.0:
return f"{num:3.1f} {unit}{suffix}"
num /= 1024.0
return f"{num:.1f}Yi{suffix}"
def get_movie_releases(movieid):
global newznaburl
if newznaburl.endswith('/'):
newznaburl = newznaburl[:-1]
if not newznaburl.endswith('/api'):
newznaburl = newznaburl + '/api'
movieid = get_movie(movieid)['imdb_id']
response = requests.get(url=f'{newznaburl}/?t=movie&apikey={newznabkey}&extended=1&imdbid={movieid}&o=json')
releases = []
releasesBest = []
for item in response.json()['channel']['item']:
if prefered(item['title']) and not excluded(item['title']):
releasesBest.append({
'title': item['title'],
'size': int(item['enclosure']['@attributes']['length']),
'link': item['link'],
'id' : item['guid']
})
elif not excluded(item['title']):
releases.append({
'title': item['title'],
'size':int(item['enclosure']['@attributes']['length']),
'link': item['link'],
'id' : item['guid']
})
releasesBest.sort(key=lambda x: x['size'])
releases.sort(key=lambda x: x['size'])
releasesBest.extend(releases)
releasesBest = releasesBest[:30]
for release in releasesBest:
release['size'] = sizeof_fmt(release['size'])
return releasesBest
def get_tv_releases(tvid):
global newznaburl
if newznaburl.endswith('/'):
newznaburl = newznaburl[:-1]
if not newznaburl.endswith('/api'):
newznaburl = newznaburl + '/api'
tvid = get_tv(tvid)['external_ids']['imdb_id']
print(tvid)
response = requests.get(url=f'{newznaburl}/?t=tvsearch&apikey={newznabkey}&extended=1&imdbid={tvid}&o=json')
releases = []
releasesBest = []
for item in response.json()['channel']['item']:
if prefered(item['title']) and not excluded(item['title']):
releasesBest.append({
'title': item['title'],
'size': int(item['enclosure']['@attributes']['length']),
'link': item['link'],
'id' : item['guid']
})
elif not excluded(item['title']):
releases.append({
'title': item['title'],
'size':int(item['enclosure']['@attributes']['length']),
'link': item['link'],
'id' : item['guid']
})
releasesBest.sort(key=lambda x: x['size'])
releases.sort(key=lambda x: x['size'])
releasesBest.extend(releases)
releasesBest = releasesBest[:30]
for release in releasesBest:
release['size'] = sizeof_fmt(release['size'])
return releasesBest
def prefered(name:str) -> bool:
words = name.lower().replace('.', ' ').split()
for word in words:
if word in Preferred:
return True
def excluded(name:str) -> bool:
words = name.lower().replace('.', ' ').split()
for word in words:
if word in Excluded:
return True
def search(query:str):
global newznaburl
if newznaburl.endswith('/'):
newznaburl = newznaburl[:-1]
if not newznaburl.endswith('/api'):
newznaburl = newznaburl + '/api'
response = requests.get(url=f'{newznaburl}/?t=search&apikey={newznabkey}&extended=1&q={query}&o=json')
results = []
for item in response.json()['channel']['item']:
results.append({
'title': item['title'],
'size': int(item['enclosure']['@attributes']['length']),
'link': item['link'],
'id' : item['guid']
})
return results