mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-13 16:52:58 -07:00
Add delete from Cloudinary
This commit is contained in:
parent
9f6422cc8d
commit
87b1118e98
5 changed files with 99 additions and 47 deletions
|
@ -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);
|
||||
});
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue