Make the script more robust, pylint fixes
Signed-off-by: Bogomil Vasilev <smirky@smirky.net>
This commit is contained in:
@@ -8,12 +8,11 @@
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
import sys
|
||||
from http.client import IncompleteRead
|
||||
import time
|
||||
import threading
|
||||
from pathlib import Path
|
||||
from http.client import IncompleteRead
|
||||
import progressbar
|
||||
from imdb import IMDb
|
||||
|
||||
@@ -52,7 +51,6 @@ class MovieList:
|
||||
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
|
||||
@@ -65,32 +63,48 @@ class MovieList:
|
||||
with open(os.devnull, 'wb') as sys.stdout:
|
||||
while True:
|
||||
try:
|
||||
query = imdb.search_movie(arg)
|
||||
query = imdb.search_movie(f'{arg["title"]} {arg["year"]}')
|
||||
break
|
||||
except IncompleteRead:
|
||||
pass
|
||||
sys.stdout = save_stdout
|
||||
|
||||
movie = query[0]
|
||||
imdb.update(movie)
|
||||
movie['ID'] = query[0].movieID
|
||||
movie = None
|
||||
for entry in query:
|
||||
has_minimum_keys = True
|
||||
for key in ['kind', 'year', 'title']:
|
||||
if key not in entry.keys():
|
||||
has_minimum_keys = False
|
||||
if not has_minimum_keys:
|
||||
continue
|
||||
# Try to eliminate episode results
|
||||
if [i for i in entry.keys() if 'episode' in i.lower()] or \
|
||||
'episode' in entry['title'].lower():
|
||||
continue
|
||||
if entry['kind'].lower() == arg['kind'].lower():
|
||||
movie = entry
|
||||
break
|
||||
if not movie:
|
||||
movie = {
|
||||
'title': arg['title'],
|
||||
'kind': arg['kind'],
|
||||
'year': arg['year'],
|
||||
'dummy': None
|
||||
}
|
||||
|
||||
if 'genres' not in movie.keys():
|
||||
movie['genres'] = ['N/A']
|
||||
if 'rating' not in movie.keys():
|
||||
movie['rating'] = 'N/A'
|
||||
|
||||
url = f'http://www.imdb.com/title/tt{movie["ID"]}'
|
||||
title = movie['title']
|
||||
year = movie['year']
|
||||
rating = movie['rating']
|
||||
genres = ', '.join(movie['genres'])
|
||||
status = self.status_list[index]
|
||||
html_title_td = movie['title'] if 'dummy' in movie.keys() else \
|
||||
f'<a href="https://www.imdb.com/title/tt{movie.movieID}" target="_blank">{movie["title"]}</a>'
|
||||
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>'
|
||||
f'<td align="center">{status}</td></tr>'
|
||||
f'<td><p hidden>{movie["title"]}</p>{html_title_td}</td>'
|
||||
f'<td>{movie["year"]}</td><td align="center">{movie["rating"]}</td>'
|
||||
f'<td>{", ".join(movie["genres"])}</td>'
|
||||
f'<td align="center">{arg["status"]}</td></tr>'
|
||||
)
|
||||
|
||||
def gen(self):
|
||||
@@ -103,28 +117,34 @@ class MovieList:
|
||||
sys.stderr.write(f'error: input does not exist - {self.src}\n')
|
||||
return False
|
||||
|
||||
self.movie_list = {}
|
||||
# Open the movie list & split the columns
|
||||
with open(self.src, 'r') as fp_handle:
|
||||
tmp_names = tmp_status = fp_handle.read()
|
||||
tmp_names = re.sub(r'\).*', ')', tmp_names)
|
||||
tmp_status = re.sub(r'\]|.*\[', '', tmp_status)
|
||||
self.movie_list = tmp_names.splitlines()
|
||||
self.status_list = tmp_status.splitlines()
|
||||
with open(self.src, 'r', encoding='utf-8') as fp_handle:
|
||||
mlist_raw = fp_handle.read()
|
||||
for raw_line in mlist_raw.splitlines():
|
||||
self.movie_list.update({
|
||||
len(self.movie_list): {
|
||||
'title': raw_line.split('(', 1)[0].strip(),
|
||||
'kind': raw_line[raw_line.find('<')+1:raw_line.rfind('>')+1].strip('<>') or 'movie',
|
||||
'year': raw_line[raw_line.find('(')+1:raw_line.find(')')],
|
||||
'status': raw_line[raw_line.find('[')+1:raw_line.find(']')],
|
||||
}
|
||||
})
|
||||
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):
|
||||
match = [line for line in self.prev_html if re.sub(r' \(.*\)', '', val) in line]
|
||||
for idx, movie in self.movie_list.items():
|
||||
match = [html_row for html_row in self.prev_html if movie['title'] in html_row]
|
||||
if match:
|
||||
# Update movies as DONE in case of change
|
||||
match = match[0].replace('*', self.status_list[idx])
|
||||
match = match[0].replace('*', movie['status'])
|
||||
# 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:]}'
|
||||
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))
|
||||
thread = threading.Thread(target=self._worker, args=(movie, idx))
|
||||
self.threads.append(thread)
|
||||
thread.start()
|
||||
pbar.update(idx+1)
|
||||
@@ -149,8 +169,10 @@ class MovieList:
|
||||
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')
|
||||
""" Import a previous HTML table """
|
||||
if self.dst.exists():
|
||||
with open(self.dst, 'rb') as fp_handle:
|
||||
self.prev_html = fp_handle.read().decode('utf8').split('\n')
|
||||
|
||||
|
||||
def main():
|
||||
@@ -158,7 +180,7 @@ def main():
|
||||
src = dst = None
|
||||
if len(sys.argv) > 3:
|
||||
sys.stderr.write(f'error: max 2 variables, {len(sys.argv)-1} given!\n')
|
||||
exit(1)
|
||||
sys.exit(1)
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
src = sys.argv[1]
|
||||
|
||||
Reference in New Issue
Block a user