From 0b95c9fe2e3f97ffe1c558758d967a94bce403b4 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Wed, 7 Feb 2018 17:59:08 -0800 Subject: [PATCH] Add Imgur poster deletion --- data/interfaces/default/info.html | 11 +++++---- plexpy/__init__.py | 11 ++++++++- plexpy/datafactory.py | 14 +++++++++--- plexpy/helpers.py | 38 ++++++++++++++++++++++++------- plexpy/notification_handler.py | 7 ++++-- plexpy/webserve.py | 3 ++- 6 files changed, 64 insertions(+), 20 deletions(-) diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index e1b6e350..6d2bb5fd 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -397,7 +397,7 @@ DOCUMENTATION :: END % endif @@ -706,13 +706,14 @@ DOCUMENTATION :: END }); $('#delete-imgur-poster').on('click', function () { - var msg = 'Are you sure you want to reset the Imgur poster for ${data["poster_title"]}?'; - var url = 'delete_poster_url'; - var data = { rating_key: $(this).data('id') } + var msg = 'Are you sure you want to delete the Imgur poster for ${data["poster_title"]}?

' + + 'All previous links to this image will no longer work.'; + var url = 'delete_imgur_poster'; + var data = { rating_key: $(this).data('id') }; var callback = function () { $('.imgur-poster-tooltip').popover('destroy'); $('#delete-imgur-poster').closest('span').remove(); - } + }; confirmAjaxCall(url, msg, data, false, callback); }); diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 3005597d..0b0b8c25 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -607,7 +607,7 @@ def dbcheck(): # poster_urls table :: This table keeps record of the notification poster urls c_db.execute( 'CREATE TABLE IF NOT EXISTS poster_urls (id INTEGER PRIMARY KEY AUTOINCREMENT, ' - 'rating_key INTEGER, poster_title TEXT, poster_url TEXT)' + 'rating_key INTEGER, poster_title TEXT, poster_url TEXT, delete_hash TEXT)' ) # recently_added table :: This table keeps record of recently added items @@ -1572,6 +1572,15 @@ def dbcheck(): 'ALTER TABLE user_login ADD COLUMN success INTEGER DEFAULT 1' ) + # Upgrade poster_urls table from earlier versions + try: + c_db.execute('SELECT delete_hash FROM poster_urls') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table poster_urls.") + c_db.execute( + 'ALTER TABLE poster_urls ADD COLUMN delete_hash TEXT' + ) + # Add "Local" user to database as default unauthenticated user. result = c_db.execute('SELECT id FROM users WHERE username = "Local"') if not result.fetchone(): diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index a4abbda9..a2c612a3 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -1128,14 +1128,15 @@ class DataFactory(object): return poster_info - def set_poster_url(self, rating_key='', poster_title='', poster_url=''): + def set_poster_url(self, rating_key='', poster_title='', poster_url='', delete_hash=''): monitor_db = database.MonitorDatabase() if str(rating_key).isdigit(): keys = {'rating_key': int(rating_key)} values = {'poster_title': poster_title, - 'poster_url': poster_url} + 'poster_url': poster_url, + 'delete_hash': delete_hash} monitor_db.upsert(table_name='poster_urls', key_dict=keys, value_dict=values) @@ -1143,7 +1144,14 @@ class DataFactory(object): monitor_db = database.MonitorDatabase() if rating_key: - logger.info(u"Tautulli DataFactory :: Deleting poster_url for rating_key %s from the database." % rating_key) + poster_info = monitor_db.select_single('SELECT poster_title, delete_hash ' + 'FROM poster_urls WHERE rating_key = ?', + [rating_key]) + if poster_info['delete_hash']: + helpers.delete_from_imgur(poster_info['delete_hash'], poster_info['poster_title']) + + logger.info(u"Tautulli DataFactory :: Deleting poster_url for '%s' (rating_key %s) from the database." + % (poster_info['poster_title'], rating_key)) result = monitor_db.action('DELETE FROM poster_urls WHERE rating_key = ?', [rating_key]) return True if result else False diff --git a/plexpy/helpers.py b/plexpy/helpers.py index af761e05..1e5ca7f1 100644 --- a/plexpy/helpers.py +++ b/plexpy/helpers.py @@ -680,21 +680,21 @@ def anon_url(*url): """ return '' if None in url else '%s%s' % (plexpy.CONFIG.ANON_REDIRECT, ''.join(str(s) for s in url)) -def uploadToImgur(imgPath, imgTitle=''): +def upload_to_imgur(imgPath, imgTitle=''): """ Uploads an image to Imgur """ client_id = plexpy.CONFIG.IMGUR_CLIENT_ID - img_url = '' + img_url = delete_hash = '' if not client_id: logger.error(u"Tautulli Helpers :: Cannot upload poster to Imgur. No Imgur client id specified in the settings.") - return img_url + return img_url, delete_hash try: with open(imgPath, 'rb') as imgFile: img = imgFile.read() except IOError as e: logger.error(u"Tautulli Helpers :: Unable to read image file for Imgur: %s" % e) - return img_url + return img_url, delete_hash headers = {'Authorization': 'Client-ID %s' % client_id} data = {'type': 'base64', @@ -703,13 +703,15 @@ def uploadToImgur(imgPath, imgTitle=''): data['title'] = imgTitle.encode('utf-8') data['name'] = imgTitle.encode('utf-8') + '.jpg' - response, err_msg, req_msg = request.request_response2('https://api.imgur.com/3/image', 'POST', headers=headers, data=data) + response, err_msg, req_msg = request.request_response2('https://api.imgur.com/3/image', 'POST', + headers=headers, data=data) if response and not err_msg: t = '\'' + imgTitle + '\' ' if imgTitle else '' logger.debug(u"Tautulli Helpers :: Image {}uploaded to Imgur.".format(t)) - img_url = response.json().get('data').get('link', '').replace('http://', 'https://') - + imgur_response_data = response.json().get('data') + img_url = imgur_response_data.get('link', '').replace('http://', 'https://') + delete_hash = imgur_response_data.get('deletehash', '') else: if err_msg: logger.error(u"Tautulli Helpers :: Unable to upload image to Imgur: {}".format(err_msg)) @@ -719,7 +721,27 @@ def uploadToImgur(imgPath, imgTitle=''): if req_msg: logger.debug(u"Tautulli Helpers :: Request response: {}".format(req_msg)) - return img_url + return img_url, delete_hash + +def delete_from_imgur(delete_hash, imgTitle=''): + """ Deletes an image from Imgur """ + client_id = plexpy.CONFIG.IMGUR_CLIENT_ID + + headers = {'Authorization': 'Client-ID %s' % client_id} + + response, err_msg, req_msg = request.request_response2('https://api.imgur.com/3/image/%s' % delete_hash, 'DELETE', + headers=headers) + + if response and not err_msg: + t = '\'' + imgTitle + '\' ' if imgTitle else '' + logger.debug(u"Tautulli Helpers :: Image {}deleted from Imgur.".format(t)) + return True + else: + if err_msg: + logger.error(u"Tautulli Helpers :: Unable to delete image from Imgur: {}".format(err_msg)) + else: + logger.error(u"Tautulli Helpers :: Unable to delete image from Imgur.") + return False def cache_image(url, image=None): """ diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index d8acbce4..cd06fa07 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -1039,14 +1039,17 @@ def get_poster_info(poster_thumb, poster_key, poster_title): raise Exception(u'PMS image request failed') # Upload poster_thumb to Imgur and get link - poster_url = helpers.uploadToImgur(poster_file, poster_title) + poster_url, delete_hash = helpers.upload_to_imgur(poster_file, poster_title) if poster_url: # Create poster info poster_info = {'poster_title': poster_title, 'poster_url': poster_url} # Save the poster url in the database - data_factory.set_poster_url(rating_key=poster_key, poster_title=poster_title, poster_url=poster_url) + data_factory.set_poster_url(rating_key=poster_key, + poster_title=poster_title, + poster_url=poster_url, + delete_hash=delete_hash) # Delete the cached poster os.remove(poster_file) diff --git a/plexpy/webserve.py b/plexpy/webserve.py index c7e1b93c..15562f8a 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -3882,7 +3882,8 @@ class WebInterface(object): @cherrypy.expose @cherrypy.tools.json_out() @requireAuth(member_of("admin")) - def delete_poster_url(self, rating_key='', **kwargs): + @addtoapi() + def delete_imgur_poster(self, rating_key='', **kwargs): data_factory = datafactory.DataFactory() result = data_factory.delete_poster_url(rating_key=rating_key)