add some more scripts

Signed-off-by: Bogomil Vasilev <smirky@smirky.net>
This commit is contained in:
2022-02-11 14:36:10 +02:00
parent 570014c240
commit 37e29989fe
8 changed files with 455 additions and 21 deletions

View File

@@ -20,7 +20,8 @@ from imdb import IMDb
class MovieList:
""" Class to generate a movie list HTML table """
def __init__(self, src=None):
def __init__(self, src=None, dst=None):
self.prev_html = []
self.html = """<html>
<head>
<title>My Movie List</title>
@@ -49,9 +50,12 @@ class MovieList:
</thead>
<tbody>"""
self.src = src
self.dst = Path(dst) if dst else Path(os.path.dirname(sys.argv[0])) / 'index.html'
self.movie_list = []
self.status_list = []
self.threads = []
self.read_prev_output()
self.html_table = None
def _worker(self, arg, index):
# Scan IMDb for a given movie and append it to the html
@@ -81,8 +85,8 @@ class MovieList:
rating = movie['rating']
genres = ', '.join(movie['genres'])
status = self.status_list[index]
self.html += (
f'\n\t<tr><td>{index + 1}</td>'
self.html_table[index] = (
f'\n{" "*8}<tr><td>{index + 1}</td>'
f'<td><p hidden>{title}</p><a href="{url}" target="_blank">{title}</a></td>'
f'<td>{year}</td><td align="center">{rating}</td>'
f'<td>{genres}</td>'
@@ -106,37 +110,48 @@ class MovieList:
tmp_status = re.sub(r'\]|.*\[', '', tmp_status)
self.movie_list = tmp_names.splitlines()
self.status_list = tmp_status.splitlines()
self.html_table = [None] * len(self.movie_list)
# Progress bar. Enough said
pbar = progressbar.ProgressBar(max_value=len(self.movie_list))
for idx, val in enumerate(self.movie_list):
thread = threading.Thread(target=self._worker, args=(val, idx,))
self.threads.append(thread)
thread.start()
pbar.update(idx+1)
time.sleep(0.2)
if len(self.threads) % 16 == 0:
time.sleep(6)
match = [line for line in self.prev_html if re.sub(r' \(.*\)', '', val) in line]
if match:
# Update movies as DONE in case of change
match = match[0].replace('*', self.status_list[idx])
# Directly insert the current HTML line from the older output
self.html_table[idx] = f'\n{" "*8}<tr><td>{idx + 1}</td>{match[match.find("</td>") + 5:]}'
pbar.update(idx + 1)
else:
thread = threading.Thread(target=self._worker, args=(val, idx))
self.threads.append(thread)
thread.start()
pbar.update(idx+1)
time.sleep(0.2)
if len(self.threads) % 16 == 0:
time.sleep(6)
for thread in self.threads:
thread.join()
self.html += ''.join(self.html_table)
return True
def write(self, dst=None):
""" Write the HTML list to index.html """
if not dst:
dst = Path(os.path.dirname(sys.argv[0])) / 'index.html'
else:
dst = Path(dst)
out_path = dst if dst else self.dst
# Just a fancy scrollbar for the html
scroll = '<script type="text/javascript" src="scroll-indicator.js"></script>'
self.html += ('\n\t</tbody>\n</table>\n' +
'\nGenerated on: ' + time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()) +
' by ' + sys.argv[0] + scroll + '</body>\n</html>')
with open(dst, 'wb') as fp_handle:
with open(out_path, 'wb') as fp_handle:
fp_handle.write(self.html.encode('utf8'))
def read_prev_output(self):
with open(self.dst, 'rb') as fp_handle:
self.prev_html = fp_handle.read().decode('utf8').split('\n')
def main():
""" Default run """
@@ -150,7 +165,7 @@ def main():
if len(sys.argv) == 3:
dst = sys.argv[2]
mlist = MovieList(src=src)
mlist = MovieList(src=src, dst=dst)
if mlist.gen():
mlist.write(dst=dst)