mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-10 07:22:37 -07:00
Add Imgur poster deletion
This commit is contained in:
parent
d693514ca9
commit
0b95c9fe2e
6 changed files with 64 additions and 20 deletions
|
@ -397,7 +397,7 @@ DOCUMENTATION :: END
|
||||||
% endif
|
% endif
|
||||||
<button class="btn btn-danger btn-edit" data-toggle="modal" aria-pressed="false" autocomplete="off" id="delete-imgur-poster"
|
<button class="btn btn-danger btn-edit" data-toggle="modal" aria-pressed="false" autocomplete="off" id="delete-imgur-poster"
|
||||||
data-id="${data['parent_rating_key'] if data['media_type'] in ('episode', 'track') else data['rating_key']}">
|
data-id="${data['parent_rating_key'] if data['media_type'] in ('episode', 'track') else data['rating_key']}">
|
||||||
<i class="fa fa-picture-o"></i> Reset Imgur Poster
|
<i class="fa fa-picture-o"></i> Delete Imgur Poster
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -706,13 +706,14 @@ DOCUMENTATION :: END
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#delete-imgur-poster').on('click', function () {
|
$('#delete-imgur-poster').on('click', function () {
|
||||||
var msg = 'Are you sure you want to reset the Imgur poster for <strong>${data["poster_title"]}</strong>?';
|
var msg = 'Are you sure you want to delete the Imgur poster for <strong>${data["poster_title"]}</strong>?<br><br>' +
|
||||||
var url = 'delete_poster_url';
|
'All previous links to this image will no longer work.';
|
||||||
var data = { rating_key: $(this).data('id') }
|
var url = 'delete_imgur_poster';
|
||||||
|
var data = { rating_key: $(this).data('id') };
|
||||||
var callback = function () {
|
var callback = function () {
|
||||||
$('.imgur-poster-tooltip').popover('destroy');
|
$('.imgur-poster-tooltip').popover('destroy');
|
||||||
$('#delete-imgur-poster').closest('span').remove();
|
$('#delete-imgur-poster').closest('span').remove();
|
||||||
}
|
};
|
||||||
confirmAjaxCall(url, msg, data, false, callback);
|
confirmAjaxCall(url, msg, data, false, callback);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -607,7 +607,7 @@ def dbcheck():
|
||||||
# poster_urls table :: This table keeps record of the notification poster urls
|
# poster_urls table :: This table keeps record of the notification poster urls
|
||||||
c_db.execute(
|
c_db.execute(
|
||||||
'CREATE TABLE IF NOT EXISTS poster_urls (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
'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
|
# 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'
|
'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.
|
# Add "Local" user to database as default unauthenticated user.
|
||||||
result = c_db.execute('SELECT id FROM users WHERE username = "Local"')
|
result = c_db.execute('SELECT id FROM users WHERE username = "Local"')
|
||||||
if not result.fetchone():
|
if not result.fetchone():
|
||||||
|
|
|
@ -1128,14 +1128,15 @@ class DataFactory(object):
|
||||||
|
|
||||||
return poster_info
|
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()
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
||||||
if str(rating_key).isdigit():
|
if str(rating_key).isdigit():
|
||||||
keys = {'rating_key': int(rating_key)}
|
keys = {'rating_key': int(rating_key)}
|
||||||
|
|
||||||
values = {'poster_title': poster_title,
|
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)
|
monitor_db.upsert(table_name='poster_urls', key_dict=keys, value_dict=values)
|
||||||
|
|
||||||
|
@ -1143,7 +1144,14 @@ class DataFactory(object):
|
||||||
monitor_db = database.MonitorDatabase()
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
||||||
if rating_key:
|
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])
|
result = monitor_db.action('DELETE FROM poster_urls WHERE rating_key = ?', [rating_key])
|
||||||
return True if result else False
|
return True if result else False
|
||||||
|
|
||||||
|
|
|
@ -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))
|
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 """
|
""" Uploads an image to Imgur """
|
||||||
client_id = plexpy.CONFIG.IMGUR_CLIENT_ID
|
client_id = plexpy.CONFIG.IMGUR_CLIENT_ID
|
||||||
img_url = ''
|
img_url = delete_hash = ''
|
||||||
|
|
||||||
if not client_id:
|
if not client_id:
|
||||||
logger.error(u"Tautulli Helpers :: Cannot upload poster to Imgur. No Imgur client id specified in the settings.")
|
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:
|
try:
|
||||||
with open(imgPath, 'rb') as imgFile:
|
with open(imgPath, 'rb') as imgFile:
|
||||||
img = imgFile.read()
|
img = imgFile.read()
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
logger.error(u"Tautulli Helpers :: Unable to read image file for Imgur: %s" % 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}
|
headers = {'Authorization': 'Client-ID %s' % client_id}
|
||||||
data = {'type': 'base64',
|
data = {'type': 'base64',
|
||||||
|
@ -703,13 +703,15 @@ def uploadToImgur(imgPath, imgTitle=''):
|
||||||
data['title'] = imgTitle.encode('utf-8')
|
data['title'] = imgTitle.encode('utf-8')
|
||||||
data['name'] = imgTitle.encode('utf-8') + '.jpg'
|
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:
|
if response and not err_msg:
|
||||||
t = '\'' + imgTitle + '\' ' if imgTitle else ''
|
t = '\'' + imgTitle + '\' ' if imgTitle else ''
|
||||||
logger.debug(u"Tautulli Helpers :: Image {}uploaded to Imgur.".format(t))
|
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:
|
else:
|
||||||
if err_msg:
|
if err_msg:
|
||||||
logger.error(u"Tautulli Helpers :: Unable to upload image to Imgur: {}".format(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:
|
if req_msg:
|
||||||
logger.debug(u"Tautulli Helpers :: Request response: {}".format(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):
|
def cache_image(url, image=None):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1039,14 +1039,17 @@ def get_poster_info(poster_thumb, poster_key, poster_title):
|
||||||
raise Exception(u'PMS image request failed')
|
raise Exception(u'PMS image request failed')
|
||||||
|
|
||||||
# Upload poster_thumb to Imgur and get link
|
# 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:
|
if poster_url:
|
||||||
# Create poster info
|
# Create poster info
|
||||||
poster_info = {'poster_title': poster_title, 'poster_url': poster_url}
|
poster_info = {'poster_title': poster_title, 'poster_url': poster_url}
|
||||||
|
|
||||||
# Save the poster url in the database
|
# 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
|
# Delete the cached poster
|
||||||
os.remove(poster_file)
|
os.remove(poster_file)
|
||||||
|
|
|
@ -3882,7 +3882,8 @@ class WebInterface(object):
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
@cherrypy.tools.json_out()
|
@cherrypy.tools.json_out()
|
||||||
@requireAuth(member_of("admin"))
|
@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()
|
data_factory = datafactory.DataFactory()
|
||||||
result = data_factory.delete_poster_url(rating_key=rating_key)
|
result = data_factory.delete_poster_url(rating_key=rating_key)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue