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:
Damien Elmes 2010-12-09 15:33:29 +09:00
parent b18bd51694
commit 1d37924b54
3 changed files with 94 additions and 0 deletions

View file

@ -51,6 +51,7 @@ class Config(dict):
'deckBrowserRefreshPeriod': 3600,
'deleteMedia': False,
'documentDir': u"",
'dropboxPublicFolder': u"",
'editFontFamily': 'Arial',
'editFontSize': 12,
'editLineSize': 20,

View file

@ -745,6 +745,8 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
return 0
if uprecent:
self.updateRecentFiles(self.deck.path)
if interactive:
self.setupMedia(self.deck)
if (sync and self.config['syncOnLoad']
and self.deck.syncName):
if self.syncDeck(interactive=False):
@ -2863,6 +2865,95 @@ This deck already exists on your computer. Overwrite the local copy?"""),
self.setEnabled(True)
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
##########################################################################

View file

@ -189,6 +189,8 @@ class Preferences(QDialog):
p = ""
elif new == 1:
p = "dropbox"
# reset public folder location
self.config['dropboxPublicFolder'] = ""
else:
p = unicode(self.dialog.mediaPath.text())
self.config['mediaLocation'] = p