---------------------------------------- Rating DVDs with Python februar 08th, 2020 ---------------------------------------- Rating DVDs with python Recently, my kids were talking about buying some DVDs of their favourite movies. My son was still missing part IV to VI of Star Wars, and considered a boxed edition with all movies. Buying new stuff is evil, so I pointed my browser to our local craigslist (finn.no in Norway). A while later, I'd found what I consider the perfect deal: A huge box with almost 200 DVDs, including ALL movies that my kids wanted to buy. And all that for almost nothing (we speak the price of two(!) Star Wars boxed editions for all 198 DVDs). Most of the movies in the collection are Limited Editions or Directors Cuts or whatever you call all these fancy boxes. Hard to say no to this! So, how do you handle so many movies? Where to start? I jotted down a list of all movie titles in emacs. To prioritize and skip the worst movies (time is precious), I like to refer to IMDB ratings. Everything below 6.5 is a no-go. But how was I going to retrieve all those ratings? Searching for all movies on imdb.com would take hours. Python to the rescue. There is a neat module called imdbpy that is able to retrieve information about movies from IMDB. There is lots of information available, but I was only interested in the rating. But, I found out, that the canonical title was nice to have. After all, my list was just the result of me punching in all titles as best as I could. To make things a little bit worse, some of the DVDs had German titles, some Norwegian titles. IMDB tends to do an OK job with converting these titles to the original, but not always. So here is a small snippet of my list: ------ Charlie's Angels Cliffhanger Cloverfield Conair Corps Bride D-War Da Vinci-Koden Danes With Wolves Das Boot ------ The script itself consist of only some lines of python. Most of it is error-handling, in case IMDB was not able to retrieve the movie or missing information. Here is the code. It's not pretty. You have been warned! ------ from sys import stdin from imdb import IMDb def main(): lines = stdin.readlines() for i in range(len(lines)): lines[i] = lines[i].replace('\n','') ia = IMDb() for movie_name in lines: movies = ia.search_movie(movie_name) # No hit? Use the original name and continue if len(movies) == 0: print("|", movie_name, "| ? |") continue # Usually, the first match is what we're looking for: movie = movies[0] if movie: ia.update(movie, ['vote details']) dem = movie.get('demographics') if dem: print("|", movie['canonical title'], "|", movie.get('demographics')['imdb users']['rating'], "|") else: # No rating - seems like some movies have bad data print("|", movie_name, "| ? |") else: print("|", movie_name, "| ? |") if __name__ == '__main__': main() ------ Now, to convert my list into an org-mode-table, I just did the following: cat ~/Sync/org-files/movies.org | python3 movie-org.py > rated-movies.org Now it was just the matter of opening the resulting file in emacs and pressing TAB to align all colums nicely. Resulting in: ------ | Superman Returns | 6.0 | | As It Is in Heaven | 7.5 | | Terminator 2: Judgment Day | 8.5 | | Lincoln Rhyme: Hunt for the Bone Collector | 6.6 | | Borgias, The | 7.9 | | Cell, The | 6.3 | | Dark Knight, The | 9.0 | | Day After Tomorrow, The | 6.4 | ------ So here we go! A list of movies with ratings. That said, I'm not very fond of watching movies. I guess that's because I'm sitting in front of a screen all day at work. Also, watching movies is way to passive for me. Playing with my computer is not. Before I met my wife, I had hardly watched any movies at home, except some rentals that I watched together with friends. In fact, I watched my first DVD together with my wife in my late 20s. Anyway, this script was a nice little project! Oh, one more thing: I wrote a little script that exposes parts of the Internet Movie Database on Gopher. I call it the Gopher Movie Database. Here you go: (DIR) GMDb (DIR) Back to jan.bio ______________________________________________________________________________ Gophered by Gophernicus/3.0.1 on FreeBSD/amd64 12.3