2018-11-23 16:53:09 +01:00

202 lines
8.2 KiB
Python

import ScreenCloud
import time
from PythonQt.QtCore import QFile, QSettings
from PythonQt.QtGui import QDesktopServices, QMessageBox
from PythonQt.QtUiTools import QUiLoader
from multiprocessing import Pool, Process
from seafapi import *
from settings import SeafScreencloudSettings
from processors import DummyProcessor, DefaultProcessor, EncryptedProcessor
###############################
## This is a temporary fix, should be removed when a newer python version is used ##
import logging
logging.captureWarnings(True)
###############################
class SeafileUploader():
def __init__(self):
self.set = SeafScreencloudSettings()
self.libs = None
self.uil = QUiLoader()
self.loadSettings()
self.pool = Pool(2)
def showSettingsUI(self, parentWidget):
self.parentWidget = parentWidget
# self.set.processor.configure(parentWidget)
self.settingsDialog = self.uil.load(
QFile(workingDir + "/settings.ui"), parentWidget)
self.settingsDialog.group_account.widget_loggedIn.loginButton.connect(
"clicked()", self.startAuthenticationProcess)
#self.settingsDialog.group_name.input_name.connect("textChanged(QString)", self.nameFormatEdited)
self.settingsDialog.group_location.widget_location.pathEdit.connect(
"textChanged(QString)", self.locationUpdate)
self.settingsDialog.group_location.widget_location.libraryEditDrop.connect(
"currentIndexChanged(QString)", self.locationUpdate)
self.settingsDialog.connect("accepted()", self.saveSettings)
self.loadSettings()
self.updateUi()
self.settingsDialog.open()
def populateLibrarySelector(self):
drop = self.settingsDialog.group_location.widget_location.libraryEditDrop
drop.clear()
drop.setEnabled(False)
select = 0
if self.set.client() and self.set.client().ping():
self.libs = self.set.client().libraries()
i = 0
for lib in self.libs:
if self.set.library is not None and (lib.id == self.set.library.id or lib.name == self.set.library.name):
select = i
print("set %s" % lib.name)
drop.addItem(lib.name)
i = i+1
drop.setCurrentIndex(select)
drop.setEnabled(True)
def updateUi(self):
self.settingsDialog.group_account.widget_loggedIn.usernameEdit.setText(
self.set.token.username if not (self.set.token is None) else "")
self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.setText(
self.set.url or "https://seaf.shimun.net")
self.settingsDialog.group_account.widget_loggedIn.loginButton.setText(
"Logout" if self.set.token is not None else "Login")
#
if self.set.token is None and len(self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text) > 0:
self.settingsDialog.group_account.widget_loggedIn.passwordEdit.setText(
"X" * 8)
for elm in [self.settingsDialog.group_account.widget_loggedIn.usernameEdit, self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit, self.settingsDialog.group_account.widget_loggedIn.passwordEdit]:
elm.setEnabled(self.set.token is None)
self.settingsDialog.group_location.setEnabled(
self.set.token is not None)
self.settingsDialog.group_location.widget_location.pathEdit.setText(
self.set.library_path or "/")
self.settingsDialog.linkCopyCheck.setChecked(self.copyLink)
self.populateLibrarySelector()
self.settingsDialog.adjustSize()
def loadSettings(self):
settings = QSettings()
settings.beginGroup("uploaders")
settings.beginGroup("seafile")
self.set.load(settings)
self.copyLink = settings.value("copy-link", "true") in ['true', True]
self.nameFormat = settings.value(
"name-format", "Screenshot %Y-%m-%d %H_%M_%S")
self.upload_scheme = settings.value("upload-scheme", "regular")
settings.endGroup()
settings.endGroup()
def saveSettings(self):
settings = QSettings()
settings.beginGroup("uploaders")
settings.beginGroup("seafile")
self.set.save(settings)
try:
self.copyLink = self.settingsDialog.linkCopyCheck.checked
except:
pass
settings.setValue("copy-link", self.copyLink)
settings.setValue("name-format", self.nameFormat)
settings.endGroup()
settings.endGroup()
def isConfigured(self):
return self.set.library and self.set.processor.is_configured()
def getFilename(self):
self.loadSettings()
return ScreenCloud.formatFilename(self.nameFormat)
def upload(self, screenshot, name):
self.loadSettings()
# Make sure we have a up to date token
if not self.set.library:
ScreenCloud.setError("Not configured properly")
return False
# Save to a temporary file
timestamp = time.time()
def tempfile(name):
try:
return QDesktopServices.storageLocation(QDesktopServices.TempLocation) + "/" + name
except AttributeError:
from PythonQt.QtCore import QStandardPaths # fix for Qt5
return QStandardPaths.writableLocation(QStandardPaths.TempLocation) + "/" + name
tmpFilename = tempfile(ScreenCloud.formatFilename(str(timestamp)))
screenshot.save(QFile(tmpFilename), ScreenCloud.getScreenshotFormat())
# Upload!
link = None
# if True:
try:
link = self.set.processor.upload(tmpFilename, self.getFilename())
if self.copyLink:
ScreenCloud.setUrl(link)
except Exception as e:
ScreenCloud.setError("Failed to upload to seafile. Using: %s\n\n%s" % (
self.set.processor.name(), e.message))
return False
return True
def startAuthenticationProcess(self):
self.saveSettings()
self.loadSettings()
if self.set.token is not None:
self.logOut()
return
if self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.text \
and self.settingsDialog.group_account.widget_loggedIn.usernameEdit.text \
and self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text:
self.set.url = self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.text
if True:
# try:
self.login(self.settingsDialog.group_account.widget_loggedIn.usernameEdit.text,
self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text)
self.saveSettings()
self.loadSettings()
self.populateLibrarySelector()
# except Exception as e:
#QMessageBox.critical(self.settingsDialog, "Failed to login", "Verify your server url and credentials" + e.message)
self.saveSettings()
self.updateUi()
def locationUpdate(self):
drop = self.settingsDialog.group_location.widget_location.libraryEditDrop
selected_lib = drop.currentText
if not drop.isEnabled():
return # not populated
self.set.library_path = self.settingsDialog.group_location.widget_location.pathEdit.text
print(self.set.library_path, selected_lib)
if self.libs is None:
return
for lib in self.libs:
if lib.name == selected_lib:
self.set.library = lib
print("%s user selected" % selected_lib)
def login(self, user, password):
cli = SeafileClient(self.set.url, user, password)
self.set.token = cli.obtain_token()
def logOut(self):
settings = QSettings()
settings.beginGroup("uploaders")
settings.beginGroup("seafile")
settings.remove("auth-token")
self.set.token = None
settings.endGroup()
settings.endGroup()
self.loadSettings()
self.updateUi()
def nameFormatEdited(self, nameFormat):
self.settingsDialog.group_name.label_example.setText(
ScreenCloud.formatFilename(nameFormat, False))