Use https://pypi.org/project/pychee library for uploading screenshots
parent
c332ce3086
commit
f214833afb
|
@ -12,6 +12,7 @@ import urllib.parse
|
||||||
import json
|
import json
|
||||||
import pyperclip
|
import pyperclip
|
||||||
from config import SCREENSHOT_CONFIG
|
from config import SCREENSHOT_CONFIG
|
||||||
|
from pychee import pychee
|
||||||
|
|
||||||
def usage(path):
|
def usage(path):
|
||||||
print('A tiny wrapper around maim to take screenshots and save or upload them (+ copy link in clipboard).\n')
|
print('A tiny wrapper around maim to take screenshots and save or upload them (+ copy link in clipboard).\n')
|
||||||
|
@ -74,65 +75,22 @@ def save_img(path, img, img_format):
|
||||||
return filepath
|
return filepath
|
||||||
|
|
||||||
def login():
|
def login():
|
||||||
data = {'username': SCREENSHOT_CONFIG['user'], 'password': SCREENSHOT_CONFIG['password'], 'function': 'Session::login'}
|
client = pychee.LycheeClient(SCREENSHOT_CONFIG['base_url'])
|
||||||
|
client.login(SCREENSHOT_CONFIG['user'], SCREENSHOT_CONFIG['password'])
|
||||||
|
return client
|
||||||
|
|
||||||
# Get initial cookies
|
def get_album_id(client, name):
|
||||||
s = requests.Session()
|
albums = client.get_albums()
|
||||||
r = s.post(SCREENSHOT_CONFIG['base_url'] + '/api/Session::init')
|
|
||||||
|
|
||||||
# Set the CSRF token for the whole session
|
|
||||||
s.headers.update({
|
|
||||||
'X-XSRF-TOKEN': urllib.parse.unquote(r.cookies['XSRF-TOKEN'])
|
|
||||||
})
|
|
||||||
|
|
||||||
r = s.post(SCREENSHOT_CONFIG['base_url'] + '/api/Session::login', data=data)
|
|
||||||
|
|
||||||
if 'false' in r.text:
|
|
||||||
raise RuntimeError(f"Cannot login to Lychee! [{r.status_code}] {r.text}")
|
|
||||||
|
|
||||||
return s
|
|
||||||
|
|
||||||
def get_album_id(session, name):
|
|
||||||
r = session.post(SCREENSHOT_CONFIG['base_url'] + '/api/Albums::get')
|
|
||||||
if r.headers['content-type'] != 'application/json':
|
|
||||||
raise RuntimeError("API call didn't return a JSON object!")
|
|
||||||
|
|
||||||
albums = r.json()
|
|
||||||
print(albums)
|
|
||||||
for album in albums['albums']:
|
for album in albums['albums']:
|
||||||
if album['title'] == name:
|
if album['title'] == name:
|
||||||
return album['id']
|
return album['id']
|
||||||
raise RuntimeError("No album " + name + " found!")
|
raise RuntimeError("No album " + name + " found!")
|
||||||
|
|
||||||
def upload_image(session, album_id, binary_img, img_format):
|
def upload_image(client, album_id, binary_img, img_format):
|
||||||
img_mime = 'image/'
|
return client.add_photo(binary_img, str(uuid.uuid4()) + '.' + img_format, album_id)
|
||||||
if img_format == 'jpg':
|
|
||||||
img_mime += 'jpeg'
|
|
||||||
elif img_format == 'png':
|
|
||||||
img_mime += 'png'
|
|
||||||
else:
|
|
||||||
raise ValueError("Invalid image format {0}!".format(img_format))
|
|
||||||
data = {'albumID': album_id}
|
|
||||||
files = {'0': (str(uuid.uuid4()) + "." + img_format, binary_img, img_mime)}
|
|
||||||
r = requests.Request('POST', SCREENSHOT_CONFIG['base_url'] + '/api/Photo::add', data=data, files=files)
|
|
||||||
dump = session.prepare_request(r)
|
|
||||||
r = session.post(SCREENSHOT_CONFIG['base_url'] + '/api/Photo::add', data=data, files=files)
|
|
||||||
print(r.text)
|
|
||||||
if "false" in r.text:
|
|
||||||
raise RuntimeError("Unknown error while uploading picture")
|
|
||||||
|
|
||||||
return r.text
|
def get_image_direct_link(client, image_id):
|
||||||
|
return SCREENSHOT_CONFIG['base_url'] + '/' + client.get_photo(image_id)['url']
|
||||||
def get_image_direct_link(session, album_id, image_id):
|
|
||||||
data = {'albumID': album_id, 'photoID': image_id}
|
|
||||||
r = session.post(SCREENSHOT_CONFIG['base_url'] + "/api/Photo::get", data=data)
|
|
||||||
if r.text == "false":
|
|
||||||
raise ValueError("Image does not exist")
|
|
||||||
if r.headers['content-type'] != 'application/json':
|
|
||||||
raise RuntimeError("API call didn't return a JSON object")
|
|
||||||
|
|
||||||
image_info = r.json()
|
|
||||||
return SCREENSHOT_CONFIG['base_url'] + '/' + image_info['url']
|
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
upload, save, path = read_args(argv)
|
upload, save, path = read_args(argv)
|
||||||
|
@ -151,7 +109,7 @@ def main(argv):
|
||||||
s = login()
|
s = login()
|
||||||
album_id = get_album_id(s, SCREENSHOT_CONFIG['album_name'])
|
album_id = get_album_id(s, SCREENSHOT_CONFIG['album_name'])
|
||||||
image_id = upload_image(s, album_id, img, img_format)
|
image_id = upload_image(s, album_id, img, img_format)
|
||||||
image_link = get_image_direct_link(s, album_id, image_id)
|
image_link = get_image_direct_link(s, image_id)
|
||||||
pyperclip.copy(image_link)
|
pyperclip.copy(image_link)
|
||||||
subprocess.run(['notify-send', '-u', 'low', '-i', 'Info', '-a', 'Screenchost', 'Screenshot uploaded', 'Link copied to clipboard!'])
|
subprocess.run(['notify-send', '-u', 'low', '-i', 'Info', '-a', 'Screenchost', 'Screenshot uploaded', 'Link copied to clipboard!'])
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
|
|
Loading…
Reference in New Issue