processor settings sor

This commit is contained in:
shim_ 2018-05-06 18:43:13 +02:00
parent ee5db19d8e
commit fb89f1946b
2 changed files with 265 additions and 164 deletions

335
main.py
View File

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

86
modules/processors.py Normal file
View File

@ -0,0 +1,86 @@
import time
from encryptedscreenshot import EncryptedScreenshot, Signer
import getpass, os
from PythonQt.QtGui import QInputDialog
from PythonQt.QtCore import QSettings
from seafapi import *
class Processor:
def configure(self,parent):
pass
def is_configured(self):
return True
def upload(self,file):
pass
class DefaultProcessor(Processor):
def __init__(self,seaf_lib,lib_path):
self.seaf_lib = seaf_lib
self.lib_path = lib_path
def upload(self,file,name):
return self.seaf_lib.upload(file,name,self.lib_path).share()
class EncryptedProcessor(Processor):
def __init__(self,seaf_lib,lib_path):
self.seaf_lib = seaf_lib
self.lib_path = lib_path
self.load_settings()
self.host = ""
def load_settings(self):
settings = QSettings()
settings.beginGroup("uploaders")
settings.beginGroup("seafile")
settings.beginGroup("encscreen")
self.host = settings.value("url", "")
settings.endGroup()
settings.endGroup()
settings.endGroup()
def save_settings(self):
settings = QSettings()
settings.beginGroup("uploaders")
settings.beginGroup("seafile")
settings.beginGroup("encscreen")
settings.setValue("url", self.host)
settings.endGroup()
settings.endGroup()
settings.endGroup()
def is_configured(self):
return self.host is not None and self.host != ""
def configure(self,parent):
self.host = QInputDialog.getText(parent, 'Encscreen Server Setup', 'Enter server url (ex. https://servertld/s#%id%key):', text="https://screens.shimun.net/s#%id%key")
self.save_settings()
def upload(self,file,name):
enrypted = EncryptedScreenshot({
"owner": unicode(getpass.getuser()),
"format": unicode(str(file).split('.')[-1]),
"title": unicode(name),
"timestamp": int(time.time() * 1000),
"size": os.stat(file).st_size
},signer=Signer.default())
tmpHandle = open(file + "c", 'wb')
tmpHandle.write(enrypted.assemble(file))
tmpHandle.close()
seaf_file = self.seaf_lib.upload(file + "c",name + ".enc",self.lib_path)
if not seaf_file:
return
seaf_link = seaf_file.share()
if seaf_link:
id = str(seaf_link).split('/')[-2]
return self.host.replace('%id', id).replace('%key',"%s" % enrypted.password)
else:
return False