# HG changeset patch # User Goffi # Date 1599335978 -7200 # Node ID d100d3a07dd76eb803accbb5ffb2f4166591f48f # Parent 2c3bc7284992ee2a37a89b1061c55bb80f21a85d browser (photos/album): change cover on "cover" button click: when "cover" button is clicked, image thumbnail is downloaded with ajax to get a blob, which is then uploaded via HTTP Upload and used as cover. diff -r 2c3bc7284992 -r d100d3a07dd7 libervia/pages/photos/album/_browser/__init__.py --- a/libervia/pages/photos/album/_browser/__init__.py Sat Sep 05 21:59:23 2020 +0200 +++ b/libervia/pages/photos/album/_browser/__init__.py Sat Sep 05 21:59:38 2020 +0200 @@ -1,11 +1,15 @@ -from browser import document, window, bind, html, DOMNode +from browser import document, window, bind, html, DOMNode, aio from javascript import JSON from bridge import Bridge +from aio_bridge import Bridge as AIOBridge from template import Template import dialog from slideshow import SlideShow from invitation import InvitationManager import alt_media_player +# we use tmp_aio because `blob` is not handled in Brython's aio +import tmp_aio + cache_path = window.cache_path files_service = window.files_service @@ -15,6 +19,7 @@ except AttributeError: pass bridge = Bridge() +aio_bridge = AIOBridge() alt_media_player.install_if_needed() @@ -167,6 +172,72 @@ cancel_cb=lambda evt, notif_elt: delete_cancel(evt, notif_elt, item_elt, item), ) +# cover + +async def cover_ok(evt, notif_elt, item_elt, item): + # we first need to get a blob of the image + img_elt = item_elt.select_one("img") + # the simplest way is to download it + r = await tmp_aio.ajax("GET", img_elt.src, "blob") + if r.status != 200: + dialog.notification.show( + f"can't retrieve cover: {r.status}: {r.statusText}", + level="error" + ) + return + img_blob = r.response + # now we'll upload it via HTTP Upload, we need a slow + img_name = img_elt.src.rsplit('/', 1)[-1] + img_size = img_blob.size + + slot = await aio_bridge.fileHTTPUploadGetSlot( + img_name, + img_size, + '', + files_service + ) + get_url, put_url, headers = slot + # we have the slot, we can upload image + r = await tmp_aio.ajax("PUT", put_url, "", img_blob) + if r.status != 201: + dialog.notification.show( + f"can't upload cover: {r.status}: {r.statusText}", + level="error" + ) + return + extra = {"thumb_url": get_url} + album_name = files_path.rsplit('/', 1)[-1] + await aio_bridge.interestsRegisterFileSharing( + files_service, + "photos", + "", + files_path, + album_name, + JSON.stringify(extra), + ) + dialog.notification.show("Album cover has been changed") + + +def cover_cancel(evt, notif_elt, item_elt, item): + notif_elt.remove() + item_elt.classList.remove("selected_for_action") + + +def on_cover(evt): + evt.stopPropagation() + target = evt.currentTarget + item_elt = DOMNode(target.elt.closest('.item')) + item_elt.classList.add("selected_for_action") + item = JSON.parse(item_elt.dataset.item) + dialog.Confirm( + f"use {item['name']!r} for this album cover?", + ok_label="use as cover", + ).show( + ok_cb=lambda evt, notif_elt: aio.run(cover_ok(evt, notif_elt, item_elt, item)), + cancel_cb=lambda evt, notif_elt: cover_cancel(evt, notif_elt, item_elt, item), + ) + + # slideshow @bind(".photo_thumb_click", "click") @@ -210,6 +281,8 @@ for elt in document.select('.action_delete'): elt.bind("click", on_delete) +for elt in document.select('.action_cover'): + elt.bind("click", on_cover) # manage