From 94354bb7d9962cb2fa9a3323124b391adc6d051b Mon Sep 17 00:00:00 2001 From: echel0n Date: Thu, 17 Apr 2014 03:53:15 -0700 Subject: [PATCH] Re-coded autoProcessMovie to now retrieve the imdbID via a API call to IMDB if we can't find one to be used in narrowing our release search results down plus we use the download_id if present to help narrow the results even more. The results returned are a dictionary of releases instead of just variables so that after a call to CP renamer we can call our function to get the new release results and run a comnparison and get the changed key/val and check status along with other variables that may have changed. This new code will allow for manually downloading movies that normally could not be snatched from CP it self due to provider results not containing them, simply placing the newly downloaded files into the post-process folder and running our scripts manually will allow CP to manually post-process and add the movie to its database properly now. --- nzbtomedia/autoProcess/autoProcessMovie.py | 224 +++++++++------------ nzbtomedia/nzbToMediaUtil.py | 10 +- tests/general.py | 17 +- 3 files changed, 108 insertions(+), 143 deletions(-) diff --git a/nzbtomedia/autoProcess/autoProcessMovie.py b/nzbtomedia/autoProcess/autoProcessMovie.py index ada22923..f17aace4 100644 --- a/nzbtomedia/autoProcess/autoProcessMovie.py +++ b/nzbtomedia/autoProcess/autoProcessMovie.py @@ -1,118 +1,102 @@ import os import re import time -import datetime import urllib -import shutil -import sys -import platform import nzbtomedia from lib import requests from nzbtomedia.Transcoder import Transcoder from nzbtomedia.nzbToMediaSceneExceptions import process_all_exceptions from nzbtomedia.nzbToMediaUtil import convert_to_ascii, delete, create_torrent_class from nzbtomedia import logger -from nzbtomedia.transmissionrpc.client import Client as TransmissionClient class autoProcessMovie: - def find_release_info(self, baseURL, download_id, dirName, nzbName, clientAgent): - imdbid = None - release_id = None - media_id = None - release_status = None - downloader = None + def find_imdbid(self, dirName, nzbName): + # find imdbid in dirName + m = re.search('(tt\d{7})', dirName) + if m: + imdbid = m.group(1) + logger.postprocess("Found movie id %s in directory", imdbid) + return imdbid - while(True): - # find imdbid in nzbName - m = re.search('(tt\d{7})', nzbName) - if m: - imdbid = m.group(1) - logger.postprocess("Found imdbid %s in name", imdbid) - break + # find imdbid in nzbName + m = re.search('(tt\d{7})', nzbName) + if m: + imdbid = m.group(1) + logger.postprocess("Found imdbid %s in name", imdbid) + return imdbid - # find imdbid in dirName - m = re.search('(tt\d{7})', dirName) - if m: - imdbid = m.group(1) - logger.postprocess("Found movie id %s in directory", imdbid) - break - break + m = re.search("^(.+)\W(\d{4})", os.path.basename(dirName)) + if m: + title = m.group(1) + year = m.group(2) - url = baseURL + "/media.list/?release_status=snatched" + url = "http://www.omdbapi.com" + logger.debug("Opening URL: %s", url) + + try: + r = requests.get(url, params={'y':year, 't':title}) + except requests.ConnectionError: + logger.error("Unable to open URL") + return + + results = r.json() + if hasattr(results, 'imdbID'): + return results['imdbID'] + + def get_releases(self, baseURL, download_id, dirName, nzbName): + releases = {} + params = {} + + imdbid = self.find_imdbid(dirName, nzbName) + + # determin cmd and params to send to CouchPotato to get our results + section = 'movies' + cmd = "/media.list" + params['status'] = 'active' + if imdbid: + section = 'media' + cmd = "/media.get" + params['id'] = imdbid + if download_id: + params['release_status'] = 'snatched,downloaded' + + url = baseURL + cmd logger.debug("Opening URL: %s", url) try: - r = requests.get(url) + r = requests.get(url, params=params) except requests.ConnectionError: logger.error("Unable to open URL") return results = r.json() - def search_results(results, clientAgent): - last_edit = {} - try: - for movie in results['movies']: - if imdbid: - if imdbid != movie['identifiers']['imdb']: - continue - - for i, release in enumerate(movie['releases']): - if release['status'] != 'snatched': - continue - - if download_id: - if release['download_info']['id'] == download_id: - return release - - # store releases by datetime just incase we need to use this info - last_edit.update({datetime.datetime.fromtimestamp(release['last_edit']):release}) - except:pass - - if last_edit: - last_edit = sorted(last_edit.items()) - if clientAgent != 'manual': - for item in last_edit: - release = item[1] - if release['download_info']['downloader'] == clientAgent: - return release - - release = last_edit[0][1] - return release - - matched_release = search_results(results, clientAgent) - - if matched_release: - try: - release_id = matched_release['_id'] - media_id = matched_release['media_id'] - release_status = matched_release['status'] - download_id = matched_release['download_info']['id'] - downloader = matched_release['download_info']['downloader'] - except:pass - - return media_id, download_id, release_id, imdbid, release_status, downloader - - def get_status(self, baseURL, media_id, release_id): - logger.debug("Attempting to get current status for movie:%s", media_id) - - url = baseURL + "/media.get" - logger.debug("Opening URL: %s", url) - try: - r = requests.get(url, params={'id':media_id}) - except requests.ConnectionError: - logger.error("Unable to open URL") - return + movies = results[section] + if not isinstance(movies, list): + movies = [movies] - try: - result = r.json() - for release in result["media"]['releases']: - if release['_id'] == release_id: - return release["status"] + for movie in movies: + for release in movie['releases']: + if download_id and download_id != release['download_info']['id']: + continue + + releases[release['_id']] = release except:pass + return releases + + def releases_diff(self, dict_a, dict_b): + return dict([ + (key, dict_b.get(key, dict_a.get(key))) + for key in set(dict_a.keys() + dict_b.keys()) + if ( + (key in dict_a and (not key in dict_b or dict_a[key] != dict_b[key])) or + (key in dict_b and (not key in dict_a or dict_a[key] != dict_b[key])) + ) + ]) + def process(self, dirName, nzbName=None, status=0, clientAgent = "manual", download_id = "", inputCategory=None): if dirName is None: logger.error("No directory was given!") @@ -164,16 +148,10 @@ class autoProcessMovie: baseURL = protocol + host + ":" + port + web_root + "/api/" + apikey - media_id, download_id, release_id, imdbid, release_status, downloader = self.find_release_info(baseURL, download_id, dirName, nzbName, clientAgent) + releases = self.get_releases(baseURL, download_id, dirName, nzbName) - if release_status: - if release_status != "snatched": - logger.warning("%s is marked with a status of %s on CouchPotato, skipping ...", nzbName, release_status) - return 0 - elif imdbid and not (download_id or media_id or release_id): - logger.error("Could only find a imdbID for %s, sending folder name to be post-processed by CouchPotato ...", nzbName) - else: - logger.error("Could not find a release status for %s on CouchPotato, skipping ...", nzbName) + if not releases: + logger.error("Could not find any releases marked as WANTED on CouchPotato to compare changes against %s, skipping ...", nzbName) return 1 process_all_exceptions(nzbName.lower(), dirName) @@ -194,7 +172,7 @@ class autoProcessMovie: params = {} if download_id: - params['downloader'] = downloader + params['downloader'] = clientAgent params['download_id'] = download_id params['media_folder'] = urllib.quote(dirName) @@ -206,6 +184,8 @@ class autoProcessMovie: logger.debug("Opening URL: %s", url) + logger.postprocess("Attempting to perform a %s scan on CouchPotato for %s", method, nzbName) + try: r = requests.get(url, params=params) except requests.ConnectionError: @@ -213,13 +193,10 @@ class autoProcessMovie: return 1 # failure result = r.json() - - logger.postprocess("CouchPotatoServer returned %s", result) - if result['success']: - logger.postprocess("%s scan started on CouchPotatoServer for %s", method, nzbName) + logger.postprocess("SUCCESS: %s scan started on CouchPotatoServer for %s", method, nzbName) else: - logger.error("%s scan has NOT started on CouchPotatoServer for %s. Exiting", method, nzbName) + logger.error("FAILED: %s scan has NOT started on CouchPotato for %s. Exiting ...", method, nzbName) return 1 # failure else: @@ -230,18 +207,20 @@ class autoProcessMovie: delete(dirName) if not download_id: - logger.warning("Cound not find a movie in the database for release %s", nzbName) - logger.warning("Please manually ignore this release and refresh the wanted movie") - logger.error("Exiting autoProcessMovie script") + logger.warning("Could not find a movie in the database for release %s", nzbName) + logger.warning("Please manually ignore this release and refresh the wanted movie from CouchPotato, Exiting ...") return 1 # failure + release_id = releases.keys()[0] + media_id = releases[release_id]['media_id'] + logger.postprocess("Ignoring current failed release %s ...", nzbName) url = baseURL + "/release.ignore" logger.debug("Opening URL: %s", url) try: - r = requests.get(url, params={'id':release_id}) + r = requests.get(url, params={'id': release_id}) except requests.ConnectionError: logger.error("Unable to open URL") return 1 # failure @@ -258,48 +237,27 @@ class autoProcessMovie: logger.debug("Opening URL: %s", url) try: - r = requests.get(url, params={'media_id':media_id}) + r = requests.get(url, params={'media_id': media_id}) except requests.ConnectionError: logger.error("Unable to open URL") return 1 # failure result = r.json() if result['success']: - logger.postprocess("CouchPotato successfully snatched the next highest release ...", nzbName) + logger.postprocess("CouchPotato successfully snatched the next highest release above %s ...", nzbName) return 0 else: logger.postprocess("CouchPotato was unable to find a higher release then %s to snatch ...", nzbName) return 1 - if not (download_id or media_id or release_id) and imdbid: - url = baseURL + "/media.get" - logger.debug("Opening URL: %s", url) - - # we will now check to see if CPS has finished renaming before returning to TorrentToMedia and unpausing. - timeout = time.time() + 60 * int(wait_for) - while (time.time() < timeout): # only wait 2 (default) minutes, then return. - try: - r = requests.get(url, params={'id':imdbid}) - except requests.ConnectionError: - logger.error("Unable to open URL") - return 1 # failure - - result = r.json() - if result['media']['status'] == 'ignored': - logger.postprocess("CouchPotato successfully added %s to it's database ...", nzbName) - return 0 - - logger.postprocess("CouchPotato was unable to add %s to its database ...", nzbName) - return 1 - elif not (download_id or media_id or release_id): - return 1 - # we will now check to see if CPS has finished renaming before returning to TorrentToMedia and unpausing. timeout = time.time() + 60 * int(wait_for) while (time.time() < timeout): # only wait 2 (default) minutes, then return. - current_status = self.get_status(baseURL, media_id, release_id) - if current_status is not None and current_status != release_status: # Something has changed. CPS must have processed this movie. - logger.postprocess("SUCCESS: This release is now marked as status [%s] in CouchPotatoServer", current_status.upper()) + releases_current = self.get_releases(baseURL, download_id, dirName, nzbName) + releasesDiff = self.releases_diff(releases, releases_current) + if releasesDiff: # Something has changed. CPS must have processed this movie. + release_status = releasesDiff[releasesDiff.keys()[0]]['status'] + logger.postprocess("SUCCESS: Release %s marked as [%s] on CouchPotato", nzbName, release_status) return 0 # success # pause and let CouchPotatoServer catch its breath diff --git a/nzbtomedia/nzbToMediaUtil.py b/nzbtomedia/nzbToMediaUtil.py index f6cbe628..37fd4412 100644 --- a/nzbtomedia/nzbToMediaUtil.py +++ b/nzbtomedia/nzbToMediaUtil.py @@ -408,19 +408,15 @@ def get_dirnames(section, subsections=None): if watch_dir: dirNames.extend([os.path.join(watch_dir, o) for o in os.listdir(watch_dir) if os.path.isdir(os.path.join(watch_dir, o))]) - if not dirNames: - logger.warning("%s:%s has no directories identified to scan inside %s", section, subsection, watch_dir) if outputDirectory: dirNames.extend([os.path.join(outputDirectory, o) for o in os.listdir(outputDirectory) if os.path.isdir(os.path.join(outputDirectory, o))]) - if not dirNames: - logger.warning("%s:%s has no directories identified to scan inside %s", section, subsection, outputDirectory) - if watch_dir is None and outputDirectory is None: - logger.warning("%s:%s has no watch_dir or outputDirectory setup to be Scanned, go fix you autoProcessMedia.cfg file.", section, subsection) + if not dirNames: + logger.warning("%s:%s has no directories identified for post-processing", section, subsection) - return dirNames + return list(set(dirNames)) def delete(dirName): logger.info("Deleting failed files and folder %s", dirName) diff --git a/tests/general.py b/tests/general.py index 68c7e034..3da64ac3 100644 --- a/tests/general.py +++ b/tests/general.py @@ -3,9 +3,20 @@ import datetime from nzbtomedia.versionCheck import CheckVersion from nzbtomedia import logger -test = datetime.datetime.fromtimestamp(1397502323) -test = {"movies": [{"status": "active", "info": {"rating": {"imdb": [8.5, 359815]}, "titles": ["Toy Story 3", "Toy Story 3 - La grande fuga", "Toy Story 3: P\u0159\u00edb\u011bh hra\u010dek", "\u53cd\u6597\u5947\u51753", "Toy Story III", "\u73a9\u5177\u7e3d\u52d5\u54e13", "Toy Story 3 - 3D", "Toy Story - J\u00e1t\u00e9kh\u00e1bor\u00fa 3.", "Histoire de jouets 3", "2010 Toy Story 3"], "imdb": "tt0435761", "year": 2010, "images": {"poster_original": ["https://image.tmdb.org/t/p/original/tOwAAVeL1p3ls9dhOBo45ElodU3.jpg"], "poster": ["https://image.tmdb.org/t/p/w154/tOwAAVeL1p3ls9dhOBo45ElodU3.jpg", "http://ia.media-imdb.com/images/M/MV5BMTgxOTY4Mjc0MF5BMl5BanBnXkFtZTcwNTA4MDQyMw@@._V1_.jpg", "http://ia.media-imdb.com/images/M/MV5BMTgxOTY4Mjc0MF5BMl5BanBnXkFtZTcwNTA4MDQyMw@@._V1_SX300.jpg"], "actors": {"Tim Allen": "https://image.tmdb.org/t/p/w185/rLvgGCNtNTW6AsH9Y9t2W7QTjNO.jpg", "Joan Cusack": "https://image.tmdb.org/t/p/w185/7tAUWX2wji7ySSdgf4lxuml4J9I.jpg", "John Morris": "https://image.tmdb.org/t/p/w185/vYGyvK4LzeaUCoNSHtsuqJUY15M.jpg", "Michael Keaton": "https://image.tmdb.org/t/p/w185/jSG7yQxSsGzz1TbDjq0811W5LK4.jpg", "Bonnie Hunt": "https://image.tmdb.org/t/p/w185/lwEvPd4SXprCLBnPzXUaH5pm33w.jpg", "Estelle Harris": "https://image.tmdb.org/t/p/w185/equDBtZgBkO7e8QKpNokDz9EbY9.jpg", "Don Rickles": "https://image.tmdb.org/t/p/w185/h5BcaDMPRVLHLDzbQavec4xfSdt.jpg", "Ned Beatty": "https://image.tmdb.org/t/p/w185/aO5MtnqcZHpsVYz1nINdjqgEJUl.jpg", "Tom Hanks": "https://image.tmdb.org/t/p/w185/xxPMucou2wRDxLrud8i2D4dsywh.jpg", "John Ratzenberger": "https://image.tmdb.org/t/p/w185/q2dCFnEDWnQMwrkE6773MSL5FRU.jpg", "Emily Hahn": "https://image.tmdb.org/t/p/w185/cjCwq4bzHuYMba1kDfEkKCeEOeb.jpg", "Teddy Newton": "https://image.tmdb.org/t/p/w185/mftwTs5lza95kOyAZsrfNaqSFtv.jpg", "Laurie Metcalf": "https://image.tmdb.org/t/p/w185/nMuaJWmZyaCMmdsGlYIOV5JGabL.jpg", "Jodi Benson": "https://image.tmdb.org/t/p/w185/9tOpKgu6cBBL29LxEC21fOVVVPW.jpg", "Blake Clark": "https://image.tmdb.org/t/p/w185/mSWo6JZevNICzOsa9Xub62xW0mu.jpg", "Wallace Shawn": "https://image.tmdb.org/t/p/w185/oGE6JqPP2xH4tNORKNqxbNPYi7u.jpg", "Whoopi Goldberg": "https://image.tmdb.org/t/p/w185/n3lF8w4X4rDa4J2LMDIxMEcuUeH.jpg"}, "backdrop_original": ["https://image.tmdb.org/t/p/original/rpvDBeVazJyBV5SxtnQWIgL5SIb.jpg"], "backdrop": ["https://image.tmdb.org/t/p/w1280/rpvDBeVazJyBV5SxtnQWIgL5SIb.jpg"]}, "plot": "Woody, Buzz, and the rest of Andy's toys haven't been played with in years. With Andy about to go to college, the gang find themselves accidentally left at a nefarious day care center. The toys must band together to escape and return home to Andy.", "actor_roles": {"Tim Allen": "Buzz Lightyear (voice)", "Joan Cusack": "Jessie the Yodeling Cowgirl (voice)", "John Morris": "Andy (voice)", "Michael Keaton": "Ken (voice)", "Bonnie Hunt": "Purple-haired doll (voice)", "Don Rickles": "Mr. Potato Head (voice)", "Ned Beatty": "Lotso (voice)", "Jodi Benson": "Barbie (voice)", "Tom Hanks": "Woody (voice)", "John Ratzenberger": "Hamm (voice)", "Emily Hahn": "Bonnie (voice)", "Teddy Newton": "Chatter Telephone (voice)", "Laurie Metcalf": "Andy's Mom (voice)", "Estelle Harris": "Mrs. Potato Head (voice)", "Blake Clark": "Slinky Dog (voice)", "Wallace Shawn": "Rex (voice)", "Whoopi Goldberg": "Stretch the Octopus (voice)"}, "tagline": "No toy gets left behind.", "writers": ["John Lasseter (story)", "Andrew Stanton (story)", "Lee Unkrich (story)", "Michael Arndt (screenplay)"], "actors": ["Tom Hanks", "Tim Allen", "Joan Cusack", "Ned Beatty"], "type": "movie", "tmdb_id": 10193, "genres": ["Animation", "Comedy", "Family", "Adventure", "Fantasy"], "collection": "Toy Story (Collection)", "via_imdb": True, "released": "2010-06-17", "via_tmdb": True, "release_date": {"dvd": 1288656000, "expires": 1397553312, "theater": 1276819200, "bluray": True}, "original_title": "Toy Story 3", "directors": ["Lee Unkrich"], "mpaa": "G", "runtime": 103}, "_t": "media", "releases": [{"status": "snatched", "info": {"size": 815.01, "seeders": 0, "protocol": "torrent_magnet", "description": "\nToy Story 3 Hindi \r\n\r\n\t\t\n", "url": "magnet:?xt=urn:btih:840ff3ca2cc7b4388974822c0b7812c3ac4e7d29&dn=Toy+Story+%5B2010%5D+hindi&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.istole.it%3A6969&tr=udp%3A%2F%2Ftracker.ccc.de%3A80&tr=udp%3A%2F%2Fopen.demonii.com%3A1337", "age": 0, "id": "6877572", "leechers": 1, "score": 90, "provider": "ThePirateBay", "seed_time": 0, "provider_extra": "", "detail_url": "https://thepiratebay.se/torrent/6877572/Toy_Story_[2010]_hindi", "type": "movie", "seed_ratio": 0.0, "name": "Toy Story [2010] hindi"}, "download_info": {"status_support": True, "id": "840ff3ca2cc7b4388974822c0b7812c3ac4e7d29", "downloader": "Transmission"}, "_id": "e31e75caf23540feb4a8ac4b29790d08", "media_id": "6e77297bc0ef48a88593ede305a78480", "_rev": "000580de", "_t": "release", "is_3d": False, "last_edit": 1397418678, "identifier": "ee4cc5b1a742bfa423c0543129d0b860", "quality": "r5"}, {"status": "snatched", "info": {"protocol": "nzb", "description": "", "name": "[rytos6]-[#altbin@EFNet]-[Full]-[]-[01/59] - \"RYTOS6.nfo\" yEnc (1/1)", "url": "https://www.binsearch.info/fcgi/nzb.fcgi?q=70791602", "age": 838, "seed_ratio": "", "score": 42, "provider": "BinSearch", "seed_time": "", "provider_extra": "", "detail_url": "https://www.binsearch.info/?b=RYTOS6&g=alt.binaries.movies.divx&p=power-post%40power-post.org+%28power-post%29&max=250", "type": "movie", "id": "70791602", "size": 795.68}, "download_info": {"status_support": True, "id": "SABnzbd_nzo_Mz2Diu", "downloader": "Sabnzbd"}, "_id": "0b167ec72f3448fab41c62e68aade169", "media_id": "6e77297bc0ef48a88593ede305a78480", "_rev": "0004d189", "_t": "release", "is_3d": False, "last_edit": 1397502323, "identifier": "7c80be041a59f9545c98e52789bb507a", "quality": "r5"}, {"status": "available", "info": {"protocol": "nzb", "description": "", "name": "[rytos5]-[#altbin@EFNet]-[Full]-[]-[01/59] - \"RYTOS5.nfo\" yEnc (1/1)", "url": "https://www.binsearch.info/fcgi/nzb.fcgi?q=70791601", "age": 838, "seed_ratio": "", "score": 42, "provider": "BinSearch", "seed_time": "", "provider_extra": "", "detail_url": "https://www.binsearch.info/?b=RYTOS5&g=alt.binaries.movies.divx&p=power-post%40power-post.org+%28power-post%29&max=250", "type": "movie", "id": "70791601", "size": 793.53}, "_id": "fd87d5a0ba8f492fbfd776aa41238451", "media_id": "6e77297bc0ef48a88593ede305a78480", "_rev": "0002369e", "_t": "release", "is_3d": False, "last_edit": 1397418678, "identifier": "337b27fcbc675fed33b1b6d6d1bd2df8", "quality": "r5"}], "title": "Toy Story 3", "_rev": "0003bba8", "profile_id": "3431e08c261246b39da241da412e8554", "_id": "6e77297bc0ef48a88593ede305a78480", "category_id": None, "type": "movie", "files": {"image_poster": ["/etc/opt/couchpotato/cache/51e4dd01f3b61406508bd259ed61704e.jpg"]}, "identifiers": {"imdb": "tt0435761"}}], "total": 1, "empty": False, "success": True} -print test +def dict_diff(dict_a, dict_b): + return dict([ + (key, dict_b.get(key, dict_a.get(key))) + for key in set(dict_a.keys()+dict_b.keys()) + if ( + (key in dict_a and (not key in dict_b or dict_a[key] != dict_b[key])) or + (key in dict_b and (not key in dict_a or dict_a[key] != dict_b[key])) + ) + ]) + +releases = {u'aa03e62650c24a09a5f034286674b951': {u'status': u'available', u'info': {u'seeders': 38, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED BRRip XviD AC3-RARBG', u'url': u'magnet:?xt=urn:btih:B0CCABF053CA6936F61A491812F8BBFCF96B6F9E&dn=the+art+of+the+steal+2013+limited+brrip+xvid+ac3+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 51, u'score': 457, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-brrip-xvid-ac3-rarbg-t9000422.html', u'type': u'movie', u'id': u'9000422', u'size': 1249.28}, u'identifier': u'629a130713bc1350cc858085ef40b187', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003322b', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'aa03e62650c24a09a5f034286674b951', u'quality': u'brrip'}, u'f9239f22604848d4b9215b94f6a005fb': {u'status': u'available', u'info': {u'seeders': 121, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED BRRip XviD MP3-RARBG', u'url': u'magnet:?xt=urn:btih:41CE100FD220B56ADB1F0F127553C61DFD9AB5CB&dn=the+art+of+the+steal+2013+limited+brrip+xvid+mp3+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 89, u'score': 1134, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-brrip-xvid-mp3-rarbg-t9000421.html', u'type': u'movie', u'id': u'9000421', u'size': 840.78}, u'download_info': {u'status_support': True, u'id': u'41ce100fd220b56adb1f0f127553c61dfd9ab5cb', u'downloader': u'Transmission'}, u'identifier': u'0ad26fca02ca07b8191876616fa2f42a', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0007329d', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721748, u'_id': u'f9239f22604848d4b9215b94f6a005fb', u'quality': u'brrip'}, u'00ee6c785ef248328f260e7eec8115c8': {u'status': u'available', u'info': {u'size': 959.74, u'protocol': u'nzb', u'description': u'', u'url': u'https://www.binsearch.info/fcgi/nzb.fcgi?q=123339072', u'age': 23, u'id': u'123339072', u'score': 5, u'provider': u'BinSearch', u'seed_time': u'', u'provider_extra': u'', u'detail_url': u'https://www.binsearch.info/?b=The.Art.of.the.Steal.2013.BDRip.XviD-NfS&g=alt.binaries.movies.divx&p=XviD%40world.net+%28XvidWorld%29&max=250', u'type': u'movie', u'seed_ratio': u'', u'name': u'The.Art.of.the.Steal.2013.BDRip.XviD-NfS.nfo [01/70] - "The.Art.of.the.Steal.2013.BDRip.XviD-NfS.nfo" yEnc (1/1)'}, u'identifier': u'e224251e41fe494e8f7b57620f2f9271', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'000298ae', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'00ee6c785ef248328f260e7eec8115c8', u'quality': u'brrip'}, u'a34ab12605a949738baf1c0c3a15695b': {u'status': u'available', u'info': {u'size': 793.12, u'protocol': u'nzb', u'description': u'', u'url': u'https://www.binsearch.info/fcgi/nzb.fcgi?q=117974223', u'age': 68, u'id': u'117974223', u'score': -2, u'provider': u'BinSearch', u'seed_time': u'', u'provider_extra': u'', u'detail_url': u'https://www.binsearch.info/?b=The.Art.of.the.Steal.2013.HDRip.XviD-AQOS&g=alt.binaries.boneless&p=none%40none.com+%28Bonehead%29&max=250', u'type': u'movie', u'seed_ratio': u'', u'name': u'The.Art.of.the.Steal.2013.HDRip.XviD-AQOS [01/26] - "The.Art.of.the.Steal.2013.HDRip.XviD-AQOS.nfo" yEnc (1/1)'}, u'identifier': u'4cd0abd13711a9fe63133756c0285410', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0002b7e1', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'a34ab12605a949738baf1c0c3a15695b', u'quality': u'brrip'}, u'72f44e880c3c4978aae939ad71402ce7': {u'status': u'available', u'info': {u'seeders': 34, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED 720p BRRip x264 AC3-UNDERCOVER', u'url': u'magnet:?xt=urn:btih:0719836DAF8E285C566797481AE8FE880719487B&dn=the+art+of+the+steal+2013+limited+720p+brrip+x264+ac3+undercover&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce', u'age': 1, u'seed_ratio': 0.0, u'leechers': 81, u'score': 541, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-720p-brrip-x264-ac3-undercover-t9000412.html', u'type': u'movie', u'id': u'9000412', u'size': 2232.32}, u'identifier': u'a44d376cc77288e8ccc375585af5af9b', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'000335d3', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'72f44e880c3c4978aae939ad71402ce7', u'quality': u'brrip'}, u'59010dc34122424d8a0ef5bee4fc2eb8': {u'status': u'available', u'info': {u'seeders': 114, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal (2013) 720p BRrip.x264 SUJAIDR', u'url': u'magnet:?xt=urn:btih:5CC3326C1115A8F4F94311F1924F28445F8D1952&dn=the+art+of+the+steal+2013+720p+brrip+x264+sujaidr&tr=http%3A%2F%2Ftracker.pimp4003.net%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 73, u'score': 1056, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-720p-brrip-x264-sujaidr-t9001162.html', u'type': u'movie', u'id': u'9001162', u'size': 785.3}, u'identifier': u'75e8270389300db233a49b1e802e5a3c', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'00033fc2', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'59010dc34122424d8a0ef5bee4fc2eb8', u'quality': u'brrip'}, u'bcdf7926211b4895a8730ac832aa1011': {u'status': u'available', u'info': {u'size': 778.57, u'protocol': u'nzb', u'description': u'', u'url': u'https://www.binsearch.info/fcgi/nzb.fcgi?q=117974508', u'age': 68, u'id': u'117974508', u'score': 17, u'provider': u'BinSearch', u'seed_time': u'', u'provider_extra': u'', u'detail_url': u'https://www.binsearch.info/?b=Art+of+the+Steal&g=alt.binaries.movies.xvid&p=here%40the.net+%28Par+Yer+Rars%29&max=250', u'type': u'movie', u'seed_ratio': u'', u'name': u'The Art of the Steal 2013 HDRip XviD-AQOS "Art of the Steal.nfo" (1/1)'}, u'identifier': u'3748b17c0040f313b42704b67a401427', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'00023179', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'bcdf7926211b4895a8730ac832aa1011', u'quality': u'brrip'}, u'9213cef04b384a2bbe8731ff82fe16ff': {u'status': u'available', u'info': {u'seeders': 86, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED 1080p BRRip h264 AAC-RARBG', u'url': u'magnet:?xt=urn:btih:154206E6390A03BBF01E61F013E1A52494A52DFA&dn=the+art+of+the+steal+2013+limited+1080p+brrip+h264+aac+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 143, u'score': 1092, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-1080p-brrip-h264-aac-rarbg-t9001241.html', u'type': u'movie', u'id': u'9001241', u'size': 1781.76}, u'identifier': u'9ab5cc07a4718ff5a4eff2a5c0a5b77c', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003ca03', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'9213cef04b384a2bbe8731ff82fe16ff', u'quality': u'brrip'}, u'9cc23887faf444f7b93a4bafb2647ac3': {u'status': u'available', u'info': {u'seeders': 38, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED 720p BRRip h264 AAC-RARBG', u'url': u'magnet:?xt=urn:btih:47B2EE9DC2245CA1AFCACD939CA603B9DBB18239&dn=the+art+of+the+steal+2013+limited+720p+brrip+h264+aac+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 40, u'score': 429, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-720p-brrip-h264-aac-rarbg-t9001238.html', u'type': u'movie', u'id': u'9001238', u'size': 1116.16}, u'identifier': u'e66074d518f9cbefbd04bc1342cbb32a', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'00030793', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'9cc23887faf444f7b93a4bafb2647ac3', u'quality': u'brrip'}, u'c18677b9357f4e60b328b42a6bba497a': {u'status': u'available', u'files': {u'nfo': [u'/mnt/vault/videos/Movies/Art of the Steal, The (2014)/The Art of the Steal.nfo'], u'movie': [u'/mnt/vault/videos/Movies/Art of the Steal, The (2014)/The Art of the Steal.mp4']}, u'identifier': u'tt2172985.None.720p', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'00045c30', u'_t': u'release', u'last_edit': 1397726258, u'_id': u'c18677b9357f4e60b328b42a6bba497a', u'quality': u'720p'}, u'c6379eb7b7144aa6ab333f06f5759947': {u'status': u'available', u'info': {u'seeders': 61, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The.Art.of.the.Steal.2013.LIMITED.BRRip.x264.AC3-MiLLENiUM', u'url': u'magnet:?xt=urn:btih:C3F24AD28CDC1F7A25AAD8B7D80BA9B5F1D7DAA8&dn=the+art+of+the+steal+2013+limited+brrip+x264+ac3+millenium&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 17, u'seed_ratio': 0.0, u'leechers': 64, u'score': 654, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-brrip-x264-ac3-millenium-t9002531.html', u'type': u'movie', u'id': u'9002531', u'size': 1013.09}, u'identifier': u'74373b65ea496c18bdecc6e3c7a5c110', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003027a', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'c6379eb7b7144aa6ab333f06f5759947', u'quality': u'brrip'}, u'2f88c95fb3b24a1d9aeff4686168ee9f': {u'status': u'available', u'info': {u'seeders': 38, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The.Art.of.the.Steal.2013.LIMITED.720p.BRRip.XviD.AC3-RARBG', u'url': u'magnet:?xt=urn:btih:A834FBF8A5E7E35DEAA544139148B40F4276332A&dn=the+art+of+the+steal+2013+limited+720p+brrip+xvid+ac3+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 68, u'score': 523, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-720p-brrip-xvid-ac3-rarbg-t9000418.html', u'type': u'movie', u'id': u'9000418', u'size': 2437.12}, u'identifier': u'9caa0dbdb805a8e58af8a69240c74b9e', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003dbfa', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'2f88c95fb3b24a1d9aeff4686168ee9f', u'quality': u'brrip'}} +releases_current = {u'aa03e62650c24a09a5f034286674b951': {u'status': u'available', u'info': {u'seeders': 38, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED BRRip XviD AC3-RARBG', u'url': u'magnet:?xt=urn:btih:B0CCABF053CA6936F61A491812F8BBFCF96B6F9E&dn=the+art+of+the+steal+2013+limited+brrip+xvid+ac3+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 51, u'score': 457, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-brrip-xvid-ac3-rarbg-t9000422.html', u'type': u'movie', u'id': u'9000422', u'size': 1249.28}, u'identifier': u'629a130713bc1350cc858085ef40b187', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003322b', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'aa03e62650c24a09a5f034286674b951', u'quality': u'brrip'}, u'f9239f22604848d4b9215b94f6a005fb': {u'status': u'available', u'info': {u'seeders': 121, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED BRRip XviD MP3-RARBG', u'url': u'magnet:?xt=urn:btih:41CE100FD220B56ADB1F0F127553C61DFD9AB5CB&dn=the+art+of+the+steal+2013+limited+brrip+xvid+mp3+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 89, u'score': 1134, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-brrip-xvid-mp3-rarbg-t9000421.html', u'type': u'movie', u'id': u'9000421', u'size': 840.78}, u'download_info': {u'status_support': True, u'id': u'41ce100fd220b56adb1f0f127553c61dfd9ab5cb', u'downloader': u'Transmission'}, u'identifier': u'0ad26fca02ca07b8191876616fa2f42a', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0007329d', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721748, u'_id': u'f9239f22604848d4b9215b94f6a005fb', u'quality': u'brrip'}, u'00ee6c785ef248328f260e7eec8115c8': {u'status': u'available', u'info': {u'size': 959.74, u'protocol': u'nzb', u'description': u'', u'url': u'https://www.binsearch.info/fcgi/nzb.fcgi?q=123339072', u'age': 23, u'id': u'123339072', u'score': 5, u'provider': u'BinSearch', u'seed_time': u'', u'provider_extra': u'', u'detail_url': u'https://www.binsearch.info/?b=The.Art.of.the.Steal.2013.BDRip.XviD-NfS&g=alt.binaries.movies.divx&p=XviD%40world.net+%28XvidWorld%29&max=250', u'type': u'movie', u'seed_ratio': u'', u'name': u'The.Art.of.the.Steal.2013.BDRip.XviD-NfS.nfo [01/70] - "The.Art.of.the.Steal.2013.BDRip.XviD-NfS.nfo" yEnc (1/1)'}, u'identifier': u'e224251e41fe494e8f7b57620f2f9271', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'000298ae', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'00ee6c785ef248328f260e7eec8115c8', u'quality': u'brrip'}, u'a34ab12605a949738baf1c0c3a15695b': {u'status': u'available', u'info': {u'size': 793.12, u'protocol': u'nzb', u'description': u'', u'url': u'https://www.binsearch.info/fcgi/nzb.fcgi?q=117974223', u'age': 68, u'id': u'117974223', u'score': -2, u'provider': u'BinSearch', u'seed_time': u'', u'provider_extra': u'', u'detail_url': u'https://www.binsearch.info/?b=The.Art.of.the.Steal.2013.HDRip.XviD-AQOS&g=alt.binaries.boneless&p=none%40none.com+%28Bonehead%29&max=250', u'type': u'movie', u'seed_ratio': u'', u'name': u'The.Art.of.the.Steal.2013.HDRip.XviD-AQOS [01/26] - "The.Art.of.the.Steal.2013.HDRip.XviD-AQOS.nfo" yEnc (1/1)'}, u'identifier': u'4cd0abd13711a9fe63133756c0285410', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0002b7e1', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'a34ab12605a949738baf1c0c3a15695b', u'quality': u'brrip'}, u'72f44e880c3c4978aae939ad71402ce7': {u'status': u'available', u'info': {u'seeders': 34, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED 720p BRRip x264 AC3-UNDERCOVER', u'url': u'magnet:?xt=urn:btih:0719836DAF8E285C566797481AE8FE880719487B&dn=the+art+of+the+steal+2013+limited+720p+brrip+x264+ac3+undercover&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce', u'age': 1, u'seed_ratio': 0.0, u'leechers': 81, u'score': 541, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-720p-brrip-x264-ac3-undercover-t9000412.html', u'type': u'movie', u'id': u'9000412', u'size': 2232.32}, u'identifier': u'a44d376cc77288e8ccc375585af5af9b', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'000335d3', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'72f44e880c3c4978aae939ad71402ce7', u'quality': u'brrip'}, u'59010dc34122424d8a0ef5bee4fc2eb8': {u'status': u'available', u'info': {u'seeders': 114, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal (2013) 720p BRrip.x264 SUJAIDR', u'url': u'magnet:?xt=urn:btih:5CC3326C1115A8F4F94311F1924F28445F8D1952&dn=the+art+of+the+steal+2013+720p+brrip+x264+sujaidr&tr=http%3A%2F%2Ftracker.pimp4003.net%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 73, u'score': 1056, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-720p-brrip-x264-sujaidr-t9001162.html', u'type': u'movie', u'id': u'9001162', u'size': 785.3}, u'identifier': u'75e8270389300db233a49b1e802e5a3c', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'00033fc2', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'59010dc34122424d8a0ef5bee4fc2eb8', u'quality': u'brrip'}, u'bcdf7926211b4895a8730ac832aa1011': {u'status': u'available', u'info': {u'size': 778.57, u'protocol': u'nzb', u'description': u'', u'url': u'https://www.binsearch.info/fcgi/nzb.fcgi?q=117974508', u'age': 68, u'id': u'117974508', u'score': 17, u'provider': u'BinSearch', u'seed_time': u'', u'provider_extra': u'', u'detail_url': u'https://www.binsearch.info/?b=Art+of+the+Steal&g=alt.binaries.movies.xvid&p=here%40the.net+%28Par+Yer+Rars%29&max=250', u'type': u'movie', u'seed_ratio': u'', u'name': u'The Art of the Steal 2013 HDRip XviD-AQOS "Art of the Steal.nfo" (1/1)'}, u'identifier': u'3748b17c0040f313b42704b67a401427', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'00023179', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'bcdf7926211b4895a8730ac832aa1011', u'quality': u'brrip'}, u'9213cef04b384a2bbe8731ff82fe16ff': {u'status': u'available', u'info': {u'seeders': 86, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED 1080p BRRip h264 AAC-RARBG', u'url': u'magnet:?xt=urn:btih:154206E6390A03BBF01E61F013E1A52494A52DFA&dn=the+art+of+the+steal+2013+limited+1080p+brrip+h264+aac+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 143, u'score': 1092, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-1080p-brrip-h264-aac-rarbg-t9001241.html', u'type': u'movie', u'id': u'9001241', u'size': 1781.76}, u'identifier': u'9ab5cc07a4718ff5a4eff2a5c0a5b77c', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003ca03', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'9213cef04b384a2bbe8731ff82fe16ff', u'quality': u'brrip'}, u'9cc23887faf444f7b93a4bafb2647ac3': {u'status': u'available', u'info': {u'seeders': 38, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The Art of the Steal 2013 LIMITED 720p BRRip h264 AAC-RARBG', u'url': u'magnet:?xt=urn:btih:47B2EE9DC2245CA1AFCACD939CA603B9DBB18239&dn=the+art+of+the+steal+2013+limited+720p+brrip+h264+aac+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 40, u'score': 429, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-720p-brrip-h264-aac-rarbg-t9001238.html', u'type': u'movie', u'id': u'9001238', u'size': 1116.16}, u'identifier': u'e66074d518f9cbefbd04bc1342cbb32a', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'00030793', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'9cc23887faf444f7b93a4bafb2647ac3', u'quality': u'brrip'}, u'c18677b9357f4e60b328b42a6bba497a': {u'status': u'done', u'files': {u'nfo': [u'/mnt/vault/videos/Movies/Art of the Steal, The (2014)/The Art of the Steal.nfo'], u'movie': [u'/mnt/vault/videos/Movies/Art of the Steal, The (2014)/The Art of the Steal.mp4']}, u'identifier': u'tt2172985.None.720p', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'000566ec', u'_t': u'release', u'last_edit': 1397726295, u'_id': u'c18677b9357f4e60b328b42a6bba497a', u'quality': u'720p'}, u'c6379eb7b7144aa6ab333f06f5759947': {u'status': u'available', u'info': {u'seeders': 61, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The.Art.of.the.Steal.2013.LIMITED.BRRip.x264.AC3-MiLLENiUM', u'url': u'magnet:?xt=urn:btih:C3F24AD28CDC1F7A25AAD8B7D80BA9B5F1D7DAA8&dn=the+art+of+the+steal+2013+limited+brrip+x264+ac3+millenium&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 17, u'seed_ratio': 0.0, u'leechers': 64, u'score': 654, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-brrip-x264-ac3-millenium-t9002531.html', u'type': u'movie', u'id': u'9002531', u'size': 1013.09}, u'identifier': u'74373b65ea496c18bdecc6e3c7a5c110', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003027a', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'c6379eb7b7144aa6ab333f06f5759947', u'quality': u'brrip'}, u'2f88c95fb3b24a1d9aeff4686168ee9f': {u'status': u'available', u'info': {u'seeders': 38, u'protocol': u'torrent_magnet', u'description': u'', u'name': u'The.Art.of.the.Steal.2013.LIMITED.720p.BRRip.XviD.AC3-RARBG', u'url': u'magnet:?xt=urn:btih:A834FBF8A5E7E35DEAA544139148B40F4276332A&dn=the+art+of+the+steal+2013+limited+720p+brrip+xvid+ac3+rarbg&tr=udp%3A%2F%2F12.rarbg.me%3A80%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337', u'age': 1, u'seed_ratio': 0.0, u'leechers': 68, u'score': 523, u'provider': u'KickAssTorrents', u'seed_time': 0, u'provider_extra': u'', u'detail_url': u'https://kickass.to/the-art-of-the-steal-2013-limited-720p-brrip-xvid-ac3-rarbg-t9000418.html', u'type': u'movie', u'id': u'9000418', u'size': 2437.12}, u'identifier': u'9caa0dbdb805a8e58af8a69240c74b9e', u'media_id': u'e16bb0f1d6484257a32b63d4b859555c', u'_rev': u'0003dbfa', u'_t': u'release', u'is_3d': False, u'last_edit': 1397721735, u'_id': u'2f88c95fb3b24a1d9aeff4686168ee9f', u'quality': u'brrip'}} +release = dict_diff(releases, releases_current) +test = release[release.keys()[0]]['status'] # Initialize the config nzbtomedia.initialize()