Add delete from Cloudinary

This commit is contained in:
JonnyWong16 2018-04-29 17:49:53 -07:00
parent 9f6422cc8d
commit 87b1118e98
5 changed files with 99 additions and 47 deletions

View file

@ -400,14 +400,14 @@ DOCUMENTATION :: END
% if data.get('poster_url'):
<div class="btn-group">
% if data['media_type'] == 'artist' or data['media_type'] == 'album' or data['media_type'] == 'track':
<span class="imgur-poster-tooltip" data-toggle="popover" data-img="${data['poster_url']}" data-height="80" data-width="80" style="display: inline-flex;">
<span class="hosted-poster-tooltip" data-toggle="popover" data-img="${data['poster_url']}" data-height="80" data-width="80" style="display: inline-flex;">
% else:
<span class="imgur-poster-tooltip" data-toggle="popover" data-img="${data['poster_url']}" data-height="120" data-width="80" style="display: inline-flex;">
<span class="hosted-poster-tooltip" data-toggle="popover" data-img="${data['poster_url']}" data-height="120" data-width="80" style="display: inline-flex;">
% 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-hosted-poster"
data-id="${data['parent_rating_key'] if data['media_type'] in ('episode', 'track') else data['rating_key']}"
data-title="${data["poster_title"]}">
<i class="fa fa-picture-o"></i> Delete Imgur Poster
<i class="fa fa-picture-o"></i> Delete ${data['img_service']} Poster
</button>
</span>
</div>
@ -705,7 +705,7 @@ DOCUMENTATION :: END
</script>
% if data.get('poster_url'):
<script>
$('.imgur-poster-tooltip').popover({
$('.hosted-poster-tooltip').popover({
html: true,
container: 'body',
trigger: 'hover',
@ -716,14 +716,14 @@ DOCUMENTATION :: END
}
});
$('#delete-imgur-poster').on('click', function () {
var msg = 'Are you sure you want to delete the Imgur poster for <strong>' + $(this).data('title') + '</strong>?<br><br>' +
$('#delete-hosted-poster').on('click', function () {
var msg = 'Are you sure you want to delete the ${data['img_service']} poster for <strong>' + $(this).data('title') + '</strong>?<br><br>' +
'All previous links to this image will no longer work.';
var url = 'delete_imgur_poster';
var url = 'delete_hosted_images';
var data = { rating_key: $(this).data('id') };
var callback = function () {
$('.imgur-poster-tooltip').popover('destroy');
$('#delete-imgur-poster').closest('.btn-group').remove();
$('.hosted-poster-tooltip').popover('destroy');
$('#delete-hosted-poster').closest('.btn-group').remove();
};
confirmAjaxCall(url, msg, data, false, callback);
});

View file

@ -1215,10 +1215,14 @@ class DataFactory(object):
monitor_db.upsert(table, key_dict=keys, value_dict=values)
def delete_imgur_info(self, rating_key=None):
def delete_img_info(self, rating_key=None, service=None):
monitor_db = database.MonitorDatabase()
if rating_key:
service = service or helpers.get_img_service()
if service == 'imgur':
# Delete from Imgur
query = 'SELECT imgur_title, delete_hash, fallback FROM imgur_lookup ' \
'JOIN image_hash_lookup ON imgur_lookup.img_hash = image_hash_lookup.img_hash ' \
'WHERE rating_key = ? '
@ -1237,9 +1241,27 @@ class DataFactory(object):
'IN (SELECT img_hash FROM image_hash_lookup WHERE rating_key = ?)',
[rating_key])
return True if result else False
elif service == 'cloudinary':
# Delete from Cloudinary
helpers.delete_from_cloudinary(rating_key=rating_key)
def get_poster_info(self, rating_key='', metadata=None):
logger.info(u"Tautulli DataFactory :: Deleting Cloudinary info for rating_key %s from the database."
% rating_key)
result = monitor_db.action('DELETE FROM cloudinary_lookup WHERE img_hash '
'IN (SELECT img_hash FROM image_hash_lookup WHERE rating_key = ?)',
[rating_key])
else:
logger.error(u"Tautulli DataFactory :: Unable to delete hosted images: invalid service '%s' provided."
% service)
return service
else:
logger.error(u"Tautulli DataFactory :: Unable to delete hosted images: rating_key not provided.")
return False
def get_poster_info(self, rating_key='', metadata=None, service=None):
poster_key = ''
if str(rating_key).isdigit():
poster_key = rating_key
@ -1254,10 +1276,17 @@ class DataFactory(object):
poster_info = {}
if poster_key:
img_info = self.get_img_info(rating_key=poster_key, order_by='height', fallback='poster', service='imgur')
service = service or helpers.get_img_service()
if service:
img_info = self.get_img_info(rating_key=poster_key,
order_by='height',
fallback='poster',
service=service)
if img_info:
poster_info = {'poster_title': img_info[0]['img_title'],
'poster_url': img_info[0]['img_url']}
'poster_url': img_info[0]['img_url'],
'img_service': service.capitalize()}
return poster_info

View file

@ -15,6 +15,7 @@
import base64
import cloudinary
from cloudinary.api import delete_resources_by_tag
from cloudinary.uploader import upload
import datetime
from functools import wraps
@ -706,6 +707,17 @@ def anon_url(*url):
return '' if None in url else '%s%s' % (plexpy.CONFIG.ANON_REDIRECT, ''.join(str(s) for s in url))
def get_img_service(include_self=False):
if plexpy.CONFIG.NOTIFY_UPLOAD_POSTERS == 1:
return 'imgur'
elif plexpy.CONFIG.NOTIFY_UPLOAD_POSTERS == 2 and include_self:
return 'self-hosted'
elif plexpy.CONFIG.NOTIFY_UPLOAD_POSTERS == 3:
return 'cloudinary'
else:
return None
def upload_to_imgur(img_data, img_title='', rating_key='', fallback=''):
""" Uploads an image to Imgur """
client_id = plexpy.CONFIG.IMGUR_CLIENT_ID
@ -787,6 +799,20 @@ def upload_to_cloudinary(img_data, img_title='', rating_key='', fallback=''):
return img_url
def delete_from_cloudinary(rating_key):
""" Deletes an image from Cloudinary """
cloudinary.config(
cloud_name=plexpy.CONFIG.CLOUDINARY_CLOUD_NAME,
api_key=plexpy.CONFIG.CLOUDINARY_API_KEY,
api_secret=plexpy.CONFIG.CLOUDINARY_API_SECRET
)
delete_resources_by_tag(str(rating_key))
logger.debug(u"Tautulli Helpers :: Deleted images from Cloudinary with rating_key {}.".format(rating_key))
return True
def cache_image(url, image=None):
"""
Saves an image to the cache directory.

View file

@ -632,11 +632,12 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, m
else:
poster_thumb = ''
if plexpy.CONFIG.NOTIFY_UPLOAD_POSTERS in (1, 3):
img_service = helpers.get_img_service(include_self=True)
if img_service not in (None, 'self-hosted'):
img_info = get_img_info(img=poster_thumb, rating_key=poster_key, title=poster_title, fallback='poster')
poster_info = {'poster_title': img_info['img_title'], 'poster_url': img_info['img_url']}
notify_params.update(poster_info)
elif plexpy.CONFIG.NOTIFY_UPLOAD_POSTERS == 2 and plexpy.CONFIG.HTTP_BASE_URL:
elif img_service == 'self-hosted' and plexpy.CONFIG.HTTP_BASE_URL:
img_hash = set_hash_image_info(img=poster_thumb, fallback='poster')
poster_info = {'poster_title': poster_title,
'poster_url': plexpy.CONFIG.HTTP_BASE_URL + plexpy.HTTP_ROOT + 'image/' + img_hash}
@ -1102,12 +1103,7 @@ def get_img_info(img=None, rating_key=None, title='', width=600, height=1000,
'blur': blur,
'fallback': fallback}
if plexpy.CONFIG.NOTIFY_UPLOAD_POSTERS == 1:
service = 'imgur'
elif plexpy.CONFIG.NOTIFY_UPLOAD_POSTERS == 3:
service = 'cloudinary'
else:
service = None
service = helpers.get_img_service()
# Try to retrieve poster info from the database
data_factory = datafactory.DataFactory()

View file

@ -4161,30 +4161,31 @@ class WebInterface(object):
@cherrypy.tools.json_out()
@requireAuth(member_of("admin"))
@addtoapi()
def delete_imgur_poster(self, rating_key='', **kwargs):
""" Delete the Imgur poster.
def delete_hosted_images(self, rating_key='', service='', **kwargs):
""" Delete the images uploaded to image hosting services.
```
Required parameters:
rating_key (int): 1234
(Note: Must be the movie, show, season, artist, or album rating key)
Optional parameters:
None
service (str): imgur or cloudinary
(Note: Defaults to service in Image Hosting setting)
Returns:
json:
{"result": "success",
"message": "Deleted Imgur poster."}
"message": "Deleted hosted images from Imgur."}
```
"""
data_factory = datafactory.DataFactory()
result = data_factory.delete_imgur_info(rating_key=rating_key)
result = data_factory.delete_img_info(rating_key=rating_key, service=service)
if result:
return {'result': 'success', 'message': 'Deleted Imgur poster.'}
return {'result': 'success', 'message': 'Deleted hosted images from %s.' % result.capitalize()}
else:
return {'result': 'error', 'message': 'Failed to delete Imgur poster.'}
return {'result': 'error', 'message': 'Failed to delete hosted images.'}
@cherrypy.expose
@cherrypy.tools.json_out()