202 lines
8.2 KiB
Python
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))
|