· 6 years ago · Mar 09, 2020, 11:50 PM
1#!/usr/bin/env python
2
3import re
4import argparse
5import tempfile
6import os
7import requests
8import atexit
9import urllib
10from jinja2 import Template
11
12#VARS
13omdb_api_key = ""
14tmdb_api_key = ""
15aimg_api_key = ""
16info_dir = "/home/.../Documents/torrents/AHD_info/"
17xml_dir = "/home/.../Documents/torrents/AHD_xml/"
18template = Template(open("/home/.../.config/AHD/HiFi-Movie.txt").read())
19XML = Template(open("/home/.../.config/AHD/XML-Movie.txt").read())
20
21
22
23
24
25def getArgs():
26 parser = argparse.ArgumentParser()
27 parser.add_argument('--imdb', '-i', type=str, required=True,
28 help='imdb ID')
29 parser.add_argument('--bluray', '-b', type=str,
30 help='bluray site')
31 parser.add_argument('--studio', '-s', type=str,
32 help='studio and country')
33 parser.add_argument('--edition', '-e', type=str,
34 help='edition to use in filename')
35 parser.add_argument('--poster', '-p', type=str,
36 help='custom poster to be used')
37 parser.add_argument('--video', '-v', type=str,
38 help='video codec')
39 parser.add_argument('--audio', '-a', type=str,
40 help='audio codec')
41 parser.add_argument('--channels', '-c', type=str,
42 help='audio channels')
43 return parser.parse_args()
44
45
46class MovieInfo(object):
47 def __init__(self, title, year, imdbID, tmdbID, tomatoURL, posterURL, genre, plot, director, actors, imdbRating,
48 imdbVotes):
49 self.title = title
50 self.year = year
51 self.imdbID = imdbID
52 self.tmdbID = tmdbID
53 self.tomatoURL = tomatoURL
54 self.posterURL = posterURL
55 self.genre = genre
56 self.plot = plot
57 self.director = director
58 self.actors = actors
59 self.imdbRating = imdbRating
60 self.imdbVotes = imdbVotes
61
62 def changePoster(self, posterURL):
63 self.posterURL = posterURL
64
65
66def parseMovieInfo(imdbID):
67 omdb_request = requests.get(
68 'http://www.omdbapi.com/?i=' + imdbID + '&tomatoes=true&apikey=' + omdb_api_key)
69 omdb_data = omdb_request.json()
70 tmdb_request = requests.get(
71 'https://api.themoviedb.org/3/movie/' + imdbID +
72 '?api_key=' + tmdb_api_key + '&language=en-US')
73 tmdb_data = tmdb_request.json()
74 #print(tmdb_data)
75
76 imdbID = omdb_data['imdbID']
77 title = omdb_data['Title']
78 year = omdb_data['Year']
79 director = omdb_data['Director']
80 actors = omdb_data['Actors']
81 plot = omdb_data['Plot']
82 tomatoURL = omdb_data['tomatoURL']
83 genre = omdb_data['Genre']
84 imdbRating = omdb_data['imdbRating']
85 imdbVotes = omdb_data['imdbVotes']
86 try:
87 tmdbID = tmdb_data['id']
88 except KeyError:
89 print('ERORR\nEnter Manually')
90 tmdbID = input('Enter tmdbID: ')
91 try:
92 posterURL = 'https://image.tmdb.org/t/p/original' + tmdb_data['poster_path']
93 except KeyError:
94 print('ERORR\nEnter Manually')
95 posterURL = input('Enter posterURL: ')
96
97 Movie = MovieInfo(title, year, imdbID, tmdbID, tomatoURL, posterURL, genre, plot, director, actors, imdbRating,
98 imdbVotes)
99
100 return Movie
101
102
103def createNames(title, year, video, audio, channels, edition=None):
104 if video == 'HEVC':
105 resolution = '2160p'
106 video = 'HEVC.HDR'
107 source_type = 'UHD BluRay'
108 else:
109 resolution = '1080p'
110 source_type = 'BluRay'
111
112 if edition is None:
113 thread = title + ' (' + str(year) + ') - ' + source_type + ' ' + 'Remux - HiFi'
114 filename = '{}.{}.{}.Remux.{}.{}.{}.{}-HiFi'.format(title, year, source_type, resolution, video, audio, channels).replace(' ', '.')
115 else:
116 thread = title + ' (' + str(year) + ') - ' + edition + ' - ' + source_type + ' ' + 'Remux - HiFi'
117 filename = '{}.{}.{}.{}.Remux.{}.{}.{}.{}-HiFi'.format(title, year, edition, source_type, resolution, video, audio, channels).replace(' ', '.')
118
119 return thread, filename
120
121
122def createInfo(Movie, BluRay, studio, filename):
123 s = template.render(Poster=Movie.posterURL, imdbID=Movie.imdbID, Bluray=BluRay, Discuss='DISCUSS',
124 Release_Name=filename, Plot=Movie.plot,
125 Source='SOURCE', Studio=studio, Genre=Movie.genre, Director=Movie.director, imdbRating=Movie.imdbRating, imdbVotes=Movie.imdbVotes, Status='Downloading',
126 BDInfo='BDINFO', eac3to='LOG', Screenshots='SCREENS')
127
128 return s
129
130
131def createXMl(Movie):
132 s = XML.render(imdbID=Movie.imdbID, tmdbID=Movie.tmdbID)
133 return s
134
135def writeInfo(title, outputDir, text, ext):
136 file = os.path.basename(title).replace('1080p.', '').replace('.mkv', '')
137 path = os.path.join(outputDir, file + '.' + ext)
138 info = open(path, "w")
139 info.write(text)
140 info.close()
141 return path
142
143def absoluteFilePaths(directory):
144 """ Get full file paths within a specific directory
145 Keyword arguments:
146 directory -- directory path containing files
147 """
148 files = []
149 for dirpath,_,filenames in os.walk(directory):
150 for f in sorted(filenames):
151 files.append(os.path.abspath(os.path.join(dirpath, f)))
152 return files
153
154
155def removeDir(directory):
156 """ Removes a directory including all files in that directory
157 Keyword arguments:
158 directory -- directory path containing files
159 """
160 files = absoluteFilePaths(directory)
161 for f in files:
162 os.remove(f)
163 os.rmdir(directory)
164
165
166def readFiles(files, key = 'image[]'):
167 """ Open files for Requests payload
168 Keyword arguments:
169 files -- list of files (full paths)
170 key -- Requests payload form field name
171 """
172 result = []
173 for f in files:
174 result.append((key, (os.path.basename(f), open(f, 'rb'))))
175 return result
176
177
178def uploadPoster(key, files):
179 """ Upload screenshots to AIMG
180 Keyword arguments:
181 key -- AIMG API key
182 title -- Gallery title
183 files - list of images (full paths)
184 """
185 payload = {
186 'apikey': key,
187 'galleryid': '',
188 'gallerytitle': '***Posters***'
189 }
190 s = requests.Session()
191 req = requests.Request(
192 'POST',
193 'https://img.awesome-hd.me/api/upload',
194 data=payload,
195 files=readFiles(files)
196 )
197 prepped = req.prepare()
198 resp = s.send(prepped)
199 if resp.status_code != 200:
200 raise ValueError('Error code from AIMG: ' + str(resp.status_code))
201 return resp.json()
202
203
204def downloadPoster(posterURL):
205 tempdir = tempfile.mkdtemp()
206 atexit.register(removeDir, tempdir)
207 urllib.request.urlretrieve(posterURL, os.path.join(tempdir, 'poster.jpg'))
208 return absoluteFilePaths(tempdir)
209
210
211args = getArgs()
212
213MovieData = parseMovieInfo(args.imdb)
214print('Parsed Movie Data')
215
216
217if args.poster:
218 MovieData.changePoster(args.poster)
219
220poster = downloadPoster(MovieData.posterURL)
221print('Downloaded Poster')
222
223posterUpload = uploadPoster(aimg_api_key, poster)
224posterbb = str()
225if 'files' in posterUpload:
226 for f in posterUpload['files']:
227 posterbb += f['bbcode']
228else:
229 raise ValueError('Error uploading files.')
230print("Uploaded Poster")
231MovieData.changePoster(posterbb[5:78].replace('viewer', 'i'))
232
233movieThread, movieReleaseName = createNames(MovieData.title, MovieData.year, args.video, args.audio, args.channels, args.edition)
234
235info = createInfo(MovieData, args.bluray, args.studio, movieReleaseName)
236
237xmlData = createXMl(MovieData)
238
239xmlPath = writeInfo(movieThread, xml_dir, xmlData, 'xml')
240
241infoPath = writeInfo(movieThread, info_dir, info, 'txt')
242
243print('Wrote info: {}'.format(infoPath))
244print('Wrote xml: {}'.format(xmlPath))