Allow to add media to notes by file path or base64 encoded data (#230)

* Allow to add media to notes by file path or base64 encoded data

* Adjust Media Actions documentation

* Adjust Note Actions documentation
This commit is contained in:
David Sauerwein 2021-02-20 19:04:25 +01:00 committed by GitHub
parent 4d2ab991c2
commit 7ef10e92da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 23 deletions

View File

@ -20,7 +20,7 @@
*Sample result*: *Sample result*:
```json ```json
{ {
"result": null, "result": "_hello.txt",
"error": null "error": null
} }
``` ```
@ -45,7 +45,7 @@
*Sample result*: *Sample result*:
```json ```json
{ {
"result": null, "result": "_hello.txt",
"error": null "error": null
} }
``` ```
@ -65,7 +65,7 @@
*Sample result*: *Sample result*:
```json ```json
{ {
"result": null, "result": "_hello.txt",
"error": null "error": null
} }
``` ```

View File

@ -7,9 +7,10 @@
AnkiConnect can download audio, video, and picture files and embed them in newly created notes. The corresponding `audio`, `video`, and `picture` note members are AnkiConnect can download audio, video, and picture files and embed them in newly created notes. The corresponding `audio`, `video`, and `picture` note members are
optional and can be omitted. If you choose to include any of them, they should contain a single object or an array of objects optional and can be omitted. If you choose to include any of them, they should contain a single object or an array of objects
with mandatory `url` and `filename` fields. The `skipHash` field can be optionally provided to skip the inclusion of with the mandatory `filename` field and one of `data`, `path` or `url`. Refer to the documentation of `storeMediaFile` for an explanation of these fields.
downloaded files with an MD5 hash that matches the provided value. This is useful for avoiding the saving of error The `skipHash` field can be optionally provided to skip the inclusion of files with an MD5 hash that matches the provided value.
pages and stub files. The `fields` member is a list of fields that should play audio or video, or show a picture when the card is displayed in This is useful for avoiding the saving of error pages and stub files.
The `fields` member is a list of fields that should play audio or video, or show a picture when the card is displayed in
Anki. The `allowDuplicate` member inside `options` group can be set to true to enable adding duplicate cards. Anki. The `allowDuplicate` member inside `options` group can be set to true to enable adding duplicate cards.
Normally duplicate cards can not be added and trigger exception. Normally duplicate cards can not be added and trigger exception.

View File

@ -484,22 +484,32 @@ class AnkiConnect:
@util.api() @util.api()
def storeMediaFile(self, filename, data=None, path=None, url=None): def storeMediaFile(self, filename, data=None, path=None, url=None, skipHash=None):
if data: if data:
self.deleteMediaFile(filename) self.deleteMediaFile(filename)
self.media().writeData(filename, base64.b64decode(data)) mediaData = base64.b64decode(data)
elif path: elif path:
self.deleteMediaFile(filename) self.deleteMediaFile(filename)
with open(path, 'rb') as f: with open(path, 'rb') as f:
data = f.read() mediaData = f.read()
self.media().writeData(filename, data)
elif url: elif url:
self.deleteMediaFile(filename) self.deleteMediaFile(filename)
downloadedData = util.download(url) mediaData = util.download(url)
self.media().writeData(filename, downloadedData)
else: else:
raise Exception('You must either provide a "data" or a "url" field.') raise Exception('You must either provide a "data" or a "url" field.')
if skipHash is None:
skip = False
else:
m = hashlib.md5()
m.update(data)
skip = skipHash == m.hexdigest()
if skip:
return None
return self.media().writeData(filename, mediaData)
@util.api() @util.api()
def retrieveMediaFile(self, filename): def retrieveMediaFile(self, filename):
filename = os.path.basename(filename) filename = os.path.basename(filename)
@ -558,17 +568,13 @@ class AnkiConnect:
for media in mediaList: for media in mediaList:
if media is not None and len(media['fields']) > 0: if media is not None and len(media['fields']) > 0:
try: try:
data = util.download(media['url']) mediaFilename = self.storeMediaFile(media['filename'],
skipHash = media.get('skipHash') data=media.get('data'),
if skipHash is None: path=media.get('path'),
skip = False url=media.get('url'),
else: skipHash=media.get('skipHash'))
m = hashlib.md5()
m.update(data)
skip = skipHash == m.hexdigest()
if not skip: if mediaFilename is not None:
mediaFilename = self.media().writeData(media['filename'], data)
for field in media['fields']: for field in media['fields']:
if field in ankiNote: if field in ankiNote:
if mediaType is util.MediaType.Picture: if mediaType is util.MediaType.Picture: