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)