mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 23:42:23 -04:00
improved media support
- tell deck the prefix based on program settings - update media URL based on public link - migrate media when moving between styles
This commit is contained in:
parent
b18bd51694
commit
1d37924b54
3 changed files with 94 additions and 0 deletions
|
@ -51,6 +51,7 @@ class Config(dict):
|
||||||
'deckBrowserRefreshPeriod': 3600,
|
'deckBrowserRefreshPeriod': 3600,
|
||||||
'deleteMedia': False,
|
'deleteMedia': False,
|
||||||
'documentDir': u"",
|
'documentDir': u"",
|
||||||
|
'dropboxPublicFolder': u"",
|
||||||
'editFontFamily': 'Arial',
|
'editFontFamily': 'Arial',
|
||||||
'editFontSize': 12,
|
'editFontSize': 12,
|
||||||
'editLineSize': 20,
|
'editLineSize': 20,
|
||||||
|
|
|
@ -745,6 +745,8 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
|
||||||
return 0
|
return 0
|
||||||
if uprecent:
|
if uprecent:
|
||||||
self.updateRecentFiles(self.deck.path)
|
self.updateRecentFiles(self.deck.path)
|
||||||
|
if interactive:
|
||||||
|
self.setupMedia(self.deck)
|
||||||
if (sync and self.config['syncOnLoad']
|
if (sync and self.config['syncOnLoad']
|
||||||
and self.deck.syncName):
|
and self.deck.syncName):
|
||||||
if self.syncDeck(interactive=False):
|
if self.syncDeck(interactive=False):
|
||||||
|
@ -2863,6 +2865,95 @@ This deck already exists on your computer. Overwrite the local copy?"""),
|
||||||
self.setEnabled(True)
|
self.setEnabled(True)
|
||||||
self.updatingBusy = False
|
self.updatingBusy = False
|
||||||
|
|
||||||
|
# Media locations
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
def setupMedia(self, deck):
|
||||||
|
prefix = self.config['mediaLocation']
|
||||||
|
prev = deck.getVar("mediaLocation")
|
||||||
|
# set the media prefix
|
||||||
|
if not prefix:
|
||||||
|
next = ""
|
||||||
|
elif prefix == "dropbox":
|
||||||
|
if sys.platform.startswith("win32"):
|
||||||
|
s = QSettings(QSettings.UserScope, "Microsoft", "Windows")
|
||||||
|
s.beginGroup("CurrentVersion/Explorer/Shell Folders")
|
||||||
|
p = os.path.join(unicode(s.value("Personal").toString()),
|
||||||
|
"My Dropbox")
|
||||||
|
else:
|
||||||
|
p = os.path.expanduser("~/Dropbox")
|
||||||
|
next = os.path.join(p, "Public", "Anki")
|
||||||
|
else:
|
||||||
|
next = prefix
|
||||||
|
# check if the media has moved
|
||||||
|
migrateFrom = None
|
||||||
|
if prev != next:
|
||||||
|
# find the old location
|
||||||
|
deck.mediaPrefix = prev
|
||||||
|
dir = deck.mediaDir()
|
||||||
|
if dir and os.listdir(dir):
|
||||||
|
# it contains files; we'll need to migrate
|
||||||
|
migrateFrom = dir
|
||||||
|
# setup new folder
|
||||||
|
deck.mediaPrefix = next
|
||||||
|
if migrateFrom:
|
||||||
|
# force creation of new folder
|
||||||
|
dir = deck.mediaDir(create=True)
|
||||||
|
# migrate old files
|
||||||
|
self.migrateMedia(migrateFrom, dir)
|
||||||
|
else:
|
||||||
|
# chdir if dir exists
|
||||||
|
dir = deck.mediaDir()
|
||||||
|
# update location
|
||||||
|
deck.setVar("mediaLocation", next)
|
||||||
|
if prefix == "dropbox":
|
||||||
|
self.setupDropbox(deck)
|
||||||
|
|
||||||
|
def migrateMedia(self, from_, to):
|
||||||
|
files = os.listdir(from_)
|
||||||
|
skipped = False
|
||||||
|
for f in files:
|
||||||
|
src = os.path.join(from_, f)
|
||||||
|
dst = os.path.join(to, f)
|
||||||
|
if not os.path.isfile(src):
|
||||||
|
skipped = True
|
||||||
|
continue
|
||||||
|
if not os.path.exists(dst):
|
||||||
|
shutil.copy2(src, dst)
|
||||||
|
if not skipped:
|
||||||
|
# everything copied, we can remove old folder
|
||||||
|
shutil.rmtree(from_, ignore_errors=True)
|
||||||
|
|
||||||
|
def setupDropbox(self, deck):
|
||||||
|
if not self.config['dropboxPublicFolder']:
|
||||||
|
# put a file in the folder
|
||||||
|
open(os.path.join(
|
||||||
|
deck.mediaPrefix, "right-click-me.txt"), "w").write("")
|
||||||
|
# tell user what to do
|
||||||
|
ui.utils.showInfo(_("""\
|
||||||
|
A file called right-click-me.txt has been placed in DropBox's public folder. \
|
||||||
|
After clicking OK, this folder will appear. Please right click on the file, \
|
||||||
|
choose DropBox>Copy Public Link, and paste the link into Anki."""))
|
||||||
|
# open folder and text prompt
|
||||||
|
self.onOpenPluginFolder(deck.mediaPrefix)
|
||||||
|
txt = ui.utils.getText(_("Paste path here:"), parent=self)
|
||||||
|
if txt[0]:
|
||||||
|
fail = False
|
||||||
|
if not txt[0].lower().startswith("http"):
|
||||||
|
fail = True
|
||||||
|
if not txt[0].lower().endswith("right-click-me.txt"):
|
||||||
|
fail = True
|
||||||
|
if fail:
|
||||||
|
ui.utils.showInfo(_("""\
|
||||||
|
That doesn't appear to be a public link. You'll be asked again when the deck\
|
||||||
|
is next loaded."""))
|
||||||
|
else:
|
||||||
|
self.config['dropboxPublicFolder'] = os.path.dirname(txt[0])
|
||||||
|
if self.config['dropboxPublicFolder']:
|
||||||
|
# update media urls
|
||||||
|
deck.s.statement("update models set features = :url",
|
||||||
|
url=self.config['dropboxPublicFolder'])
|
||||||
|
|
||||||
# Advanced features
|
# Advanced features
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
|
|
@ -189,6 +189,8 @@ class Preferences(QDialog):
|
||||||
p = ""
|
p = ""
|
||||||
elif new == 1:
|
elif new == 1:
|
||||||
p = "dropbox"
|
p = "dropbox"
|
||||||
|
# reset public folder location
|
||||||
|
self.config['dropboxPublicFolder'] = ""
|
||||||
else:
|
else:
|
||||||
p = unicode(self.dialog.mediaPath.text())
|
p = unicode(self.dialog.mediaPath.text())
|
||||||
self.config['mediaLocation'] = p
|
self.config['mediaLocation'] = p
|
||||||
|
|
Loading…
Reference in a new issue