mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
simplify media.py
- drop mediaPrefix & the mediaURL-based downloading - always create the media folder - remove move() in preparation for a single collection approach
This commit is contained in:
parent
cf8288a5e0
commit
7e1df75cc2
4 changed files with 9 additions and 121 deletions
|
@ -79,8 +79,7 @@ def _buildImg(deck, latex, fname, model):
|
|||
texfile = file(namedtmp("tmp.tex"), "w")
|
||||
texfile.write(latex)
|
||||
texfile.close()
|
||||
# make sure we have a valid mediaDir
|
||||
mdir = deck.media.dir(create=True)
|
||||
mdir = deck.media.dir()
|
||||
oldcwd = os.getcwd()
|
||||
png = namedtmp("tmp.png")
|
||||
try:
|
||||
|
|
112
anki/media.py
112
anki/media.py
|
@ -9,8 +9,6 @@ from anki.lang import _
|
|||
|
||||
class MediaManager(object):
|
||||
|
||||
# can be altered at the class level for dropbox, etc
|
||||
mediaPrefix = ""
|
||||
# other code depends on this order, so don't reorder
|
||||
regexps = ("(?i)(\[sound:([^]]+)\])",
|
||||
"(?i)(<img[^>]+src=[\"']?([^\"'>]+)[\"']?[^>]*>)")
|
||||
|
@ -18,52 +16,22 @@ class MediaManager(object):
|
|||
def __init__(self, deck):
|
||||
self.deck = deck
|
||||
self._dir = None
|
||||
self._updateDir()
|
||||
|
||||
def dir(self, create=False):
|
||||
"Call with create=None to retrieve dir without creating."
|
||||
if self._dir:
|
||||
return self._dir
|
||||
elif create == None:
|
||||
return self._updateDir(create)
|
||||
elif create:
|
||||
self._updateDir(True)
|
||||
def dir(self):
|
||||
if not self._dir:
|
||||
self._dir = re.sub("(?i)\.(anki)$", ".media", self.deck.path)
|
||||
if not os.path.exists(self._dir):
|
||||
os.makedirs(self._dir)
|
||||
os.chdir(self._dir)
|
||||
return self._dir
|
||||
|
||||
def _updateDir(self, create=False):
|
||||
if self.mediaPrefix:
|
||||
dir = os.path.join(
|
||||
self.mediaPrefix, os.path.basename(self.deck.path))
|
||||
else:
|
||||
dir = self.deck.path
|
||||
dir = re.sub("(?i)\.(anki)$", ".media", dir)
|
||||
if create == None:
|
||||
# don't create, but return dir
|
||||
return dir
|
||||
if not os.path.exists(dir):
|
||||
if not create:
|
||||
return
|
||||
# will raise error if we can't create
|
||||
os.makedirs(dir)
|
||||
# change to the current dir
|
||||
os.chdir(dir)
|
||||
self._dir = dir
|
||||
|
||||
def move(self, old):
|
||||
if not old:
|
||||
return
|
||||
self._dir = None
|
||||
new = self.dir(create=None)
|
||||
shutil.copytree(old, new)
|
||||
shutil.rmtree(old)
|
||||
|
||||
# Adding media
|
||||
##########################################################################
|
||||
|
||||
def addFile(self, opath):
|
||||
"""Copy PATH to MEDIADIR, and return new filename.
|
||||
If the same name exists, compare checksums."""
|
||||
mdir = self.dir(create=True)
|
||||
mdir = self.dir()
|
||||
# remove any dangerous characters
|
||||
base = re.sub(r"[][<>:/\\&]", "", os.path.basename(opath))
|
||||
dst = os.path.join(mdir, base)
|
||||
|
@ -177,69 +145,3 @@ If the same name exists, compare checksums."""
|
|||
for f in self.mediaFiles(p[type]):
|
||||
files.add(f)
|
||||
return files
|
||||
|
||||
# Download missing
|
||||
##########################################################################
|
||||
|
||||
def downloadMissing(self):
|
||||
raise Exception()
|
||||
urlbase = self.deck.getVar("mediaURL")
|
||||
if not urlbase:
|
||||
return None
|
||||
mdir = self.deck.dir(create=True)
|
||||
missing = 0
|
||||
grabbed = 0
|
||||
for c, (f, sum) in enumerate(self.deck.db.all(
|
||||
"select file, csum from media")):
|
||||
path = os.path.join(mdir, f)
|
||||
if not os.path.exists(path):
|
||||
try:
|
||||
rpath = urlbase + f
|
||||
url = urllib2.urlopen(rpath)
|
||||
open(f, "wb").write(url.read())
|
||||
grabbed += 1
|
||||
except:
|
||||
if sum:
|
||||
# the file is supposed to exist
|
||||
return (False, rpath)
|
||||
else:
|
||||
# ignore and keep going
|
||||
missing += 1
|
||||
#self.deck.updateProgress(label=_("File %d...") % (grabbed+missing))
|
||||
return (True, grabbed, missing)
|
||||
|
||||
# Convert remote links to local ones
|
||||
##########################################################################
|
||||
|
||||
def downloadRemote(self):
|
||||
raise Exception()
|
||||
mdir = self.deck.dir(create=True)
|
||||
refs = {}
|
||||
for (question, answer) in self.deck.db.all(
|
||||
"select question, answer from cards"):
|
||||
for txt in (question, answer):
|
||||
for f in mediaFiles(txt, remote=True):
|
||||
refs[f] = True
|
||||
|
||||
failed = []
|
||||
passed = []
|
||||
for c, link in enumerate(refs.keys()):
|
||||
try:
|
||||
path = namedtmp(os.path.basename(link))
|
||||
url = urllib2.urlopen(link)
|
||||
open(path, "wb").write(url.read())
|
||||
newpath = copyToMedia(self.deck, path)
|
||||
passed.append([link, newpath])
|
||||
except:
|
||||
failed.append(link)
|
||||
#self.deck.updateProgress(label=_("Download %d...") % c)
|
||||
for (url, name) in passed:
|
||||
self.deck.db.execute(
|
||||
"update fields set value = replace(value, :url, :name)",
|
||||
url=url, name=name)
|
||||
#self.deck.updateProgress(label=_("Updating references..."))
|
||||
#self.deck.updateProgress(label=_("Updating cards..."))
|
||||
# rebuild entire q/a cache
|
||||
for m in self.deck.models:
|
||||
self.deck.updateCardsFromModel(m, dirty=True)
|
||||
return (passed, failed)
|
||||
|
|
|
@ -7,8 +7,6 @@ from anki.hooks import addHook
|
|||
|
||||
def test_latex():
|
||||
d = getEmptyDeck()
|
||||
# no media directory to start
|
||||
assert not d.media.dir()
|
||||
# change latex cmd to simulate broken build
|
||||
import anki.latex
|
||||
anki.latex.latexCmd[0] = "nolatex"
|
||||
|
@ -16,8 +14,6 @@ def test_latex():
|
|||
f = d.newFact()
|
||||
f['Front'] = u"[latex]hello[/latex]"
|
||||
d.addFact(f)
|
||||
# adding will have created the media
|
||||
assert d.media.dir()
|
||||
# but since latex couldn't run, it will be empty
|
||||
assert len(os.listdir(d.media.dir())) == 0
|
||||
# check the error message
|
||||
|
|
|
@ -41,7 +41,7 @@ def test_strings():
|
|||
def test_deckIntegration():
|
||||
d = getEmptyDeck()
|
||||
# create a media dir
|
||||
d.media.dir(create=True)
|
||||
d.media.dir()
|
||||
# put a file into it
|
||||
file = unicode(os.path.join(testDir, "support/fake.png"))
|
||||
d.media.addFile(file)
|
||||
|
@ -59,12 +59,3 @@ def test_deckIntegration():
|
|||
ret = d.media.check()
|
||||
assert ret[0] == ["fake2.png"]
|
||||
assert ret[1] == ["foo.jpg"]
|
||||
|
||||
def test_rename():
|
||||
d = getEmptyDeck()
|
||||
# put a file into it
|
||||
file = unicode(os.path.join(testDir, "support/fake.png"))
|
||||
d.media.addFile(file)
|
||||
new = d.path.replace(".anki", "2.anki")
|
||||
d.rename(new)
|
||||
|
||||
|
|
Loading…
Reference in a new issue