An alternative to Memrise2Anki [support thread]

A pack of updates is ready for the extension (up to v8.6):

  • Downloading large bulks of media files is made much more stable by tracking and limiting the number of concurrent downloads (in most part thanks to the efforts of 7shi). This also stops Chrome from eating all the resources at that phase, as well as cluttering the browser download history.

  • Many issues related to media files naming are fixed (url encodings, name conflicts between files from different levels, square brackets in the names of audio files and case differences in file extensions, that made Anki erroneously identify some files as unused or missing).

  • Repeated downloads no longer cause file duplication (renamed by Chrome as …(1), …(2) and so on). Results of unsuccessful downloads (failed due to connection issues) no longer need to be deleted and even recommended to be kept, as multiple partially failed downloads now combine and can yield a fully downloaded course.

  • The script is no longer sensitive to the format in which course URLs are presented (both in the address string and in queue.txt) and can parse practically anything, including the during-review formats reported by @noty

  • Spreadsheets now store course metadata that helps Anki correctly interpret the contents during import (data is accurately divided into columns by default, all columns have names and are properly labelled in the Field mapping section, Memrise level tags are automatically identified).

  • There is a stop button, that allows interrupting the download (both during the scanning phase and media download phase):
    image

    Note that stopping does not happen immediately, as the ongoing fetching requests need to be completed first (which is why it is advised to wait after pressing the button once instead of clicking it multiple times, as it might lead to errors). Stopping will change the appearance of the extension button – pressing it after that will allow restarting the download from the same page:
    image

    Keep in mind, that the new download will start from scratch (there is no way to resume from the previous state at the moment).

    When a download is fully completed, this will be indicated by the state of the extension button as well:
    image

  • In addition to the above, a number of old visual bugs related to progress bars are fixed, and the Extra fields are now properly escaped in the spreadsheets

Note, that since the separation of Memrise courses into two different domains (app.memrise and community-courses.memrise) which require independent logins, it is not possible to initiate downloads of the courses from one domain from an opened page from another domain. For this reason, courses from different domains should not be mixed together in the batch download queue. (there might be two separate queue files for each domain in future versions, but since, at least in my understanding, most people are only interested in the courses from community-courses domain anyway, the priority for this feature won’t be very high)

Is there a way to exclude videos and only download audio files ?

I’ve put out a new version that includes all the latest updates:

  1. The extension now has a proper menu to control downloads, handle course lists for batch downloading, and change the settings.
  2. Course scanning is performed with a limited number of threads, which should significantly reduce timeout errors in large batches, which previously led to missing levels in the downloaded course spreadsheets.
  3. Better and detailed progress indication, including console messages and text labels on the progress bars. Most common issues are also communicated more clearly, throwing alerts and logging warnings.

chrome_ZndERYXGe8

  1. The number of items (words) a course has is now appended at end of the .csv file name and inside the course description file for easier assessment of the downloaded resources.

    details

    Memrise only displays the total number of items in a course beforehand if the course has been started by the user, or it is not divided into separate levels.

    • If such a number is available it will be shown in brackets, e.g. ..._(123).csv. If you see that, you can be sure that all items (except the ignored ones!) from a course have been saved successfully (to verify that all media files have been successfully downloaded as well, you’ll need to compare the similar number at the end of the ..._media folder with the number of files inside it).

    • If the apriori number is not available, the displayed figure will be based on the total number of items in the levels the extension managed to scrap and prefixed with a tilda to indicate an estimation, e.g. ..._(~77).csv. To verify that all items have been downloaded, you’ll have to compare this number to some independent evaluation (the easiest way would still be to press the Get started now button on the course page and check the value calculated by Memrise itself).

    • If the number of items is available, but does not match the total number of downloaded items, both of them will be shown to indicate an incomplete download, e.g. ..._(42 of 58).csv. In such a case it’s worth checking the internet connection and repeating the download (no need to delete the files from the previous attempt or reload the page).

  2. @ole I’ve also added a setting to disable downloading videos per your request (the Video Files toggle is in the Advanced section).
    Note, that if you wish to exclude videos from a previously downloaded course without redownloading it, this would be easier done inside Anki itself by deleting the column/field (before/after import respectively) which containes the references to video files and then going to ToolsCheck MediaDelete Unused to remove unreferenced files from the collection (ToolsCheck Media (Again) → Empty Trash to delete them completely).

Unfortunately, I still can’t get audio to work despite updating the extension for chome.

I tried it again downloading a different course

course/6523202/french-with-lingoculture/

but the sound files still have a prefix with the course name and course code preventing anki from recognising the file.

Example:

When the audio files download they just have a number eg. 421522351_1701422028395.mp3

but in the cvs file they have a prefix e.g. sound:french-with-lingoculture_6523202c_421522351_1701422028395.mp3

so when anki wants to play an audio file it is looking for a file starting with the prefix which of course there isn’t one.

to get around this, i’ve had to use PowerRename to add the prefix into the mp3 files I download before I put them in the collectionsmedia folder for anki to pull from

but its a laborious workaround.

still this is an amazing add on, so thank you very much for it. I hope you can find the solution to this issue though.

in case it makes any difference: using anki on windows desktop current qt6 version with your most recent chrome extension. tried to also sync to my android app, but again sound doesnt play unless i rename the file as above.

1 Like

If you do not see the proper names for the audiofiles, like this:
image
then the problem is definitely not with Anki.
Can you confirm that the version of the extension is displayed as 9.0 in the extension manager for you (sometimes people have trouble with installing an update)?
image

Also, what is the version of your Chrome itself?


Just in case, the alternative workaround with auto replacing text in the .csv file you tried earlier might still be valid. The issues you were having are likely due to the escaping characters being erroneously caught in the replacement. But if you do it in a plain text editor (basic Notepad will do), this shouldn’t be an issue, if this makes it any better.

Another thing worth checking, maybe your Chrome download folder has a long path name? It can explain the missing part of the file names, as chrome will truncate those to fit under a certain limit for full file path names. Can you try changing the folder to something basic, like D:\Downloads\ and downloading a course again?

I changed the download folder to base of a drive, but it still only includes the last string of numbers for each mp3 file name

I am using the 9.0 version of the course dump extension

and chrome version is current - Version 126.0.6478.127 (Official Build) (64-bit)

i shall try it from a different PC during the week and see if it works.

1 Like

Still doesn’t work even from a different computer with chrome on a different network in a different town!

So I’m left with 2 solutions

  1. Either rename all the MP3s to add the prefix as i did above

  2. Open the text/cvs file and rename/replace all mp3 file names to remove the prefix, but because editting this file messed up the field mapping, in row 4 add a comma after each header e.g. “learnable” becomes “learnable,” then save and import to anki, changing field separator manually to comma (which is faded as an option when importing by default), and then indiviudally mapping the field mapping options which are now separated

Still its 2 workarounds for an issue that only I seem to be having lol

Meanwhile, I tested it on three other machines (in different countries) and still couldn’t reproduce the issue. The files always appear to have their full names.

What are your OS and system locale, and what extension settings do you use for the downloads?
If you are up to some testing on your side I can also make a test branch to log additional info for this issue. Maybe it will shed some light on the source of the problem.

Hello, thank you so much for this template. I started using Anki specifically because of it and it’s only my second day, so obviously the settings are still intimidating for me… I managed to set up almost everything, but I have one minor problem with AnkiDroid. In the desktop version, I imported my sets and filled in choices, and the buttons work there. But they don’t in the Android version, it still wants me to type in the answer even though the options are displayed as buttons and after I do so, the correct option is highlighted. I would like to be able to just tap to choose the answer. Could you please tell me where the problem can be? Did I do something wrong when importing and filling in choices or do I have to do something inside the app? I would really appreciate it, it’s the last thing I need to do in order to restore my long-term memrise experience that was the only method working for me…

1 Like

It seems you just missed this option:

(also, if you have any further questions about the card template, I would appreciate you leaving them in that thread since this one is dedicated to the Chrome extension)

Yes, it helped, thank you! I’m very sorry for mistaking the threads. Since the problem is solved, I’m fine with deleting these replies.

1 Like

No need to delete anything. Someone still might find it helpful. It’s just a minor thing to keep in mind for the future.

It took a while, but the readme is now updated to all the current versions of Anki, Chrome, and the extension itself:

There seems to be a character limit when you enable the ‘Extra fields’ setting.

If you have say a field for notes on one of your courses, when you open the csv file and check the notes column, it only displays notes for some of the entries. The entries where the note was relatively short are all present, but with the entries where the note was relatively long, the cell is blank. Not even truncated, but just blank.

The longest note I’ve managed to capture so far is 189 characters long. As far as I can tell anything much longer than that comes up blank.

Can you provide a specific example of a course where field content is missing?

1 Like

example: /community/course/6617985/test/

When I download that course (a test course I just threw together), the ‘Part of Speech’ column in the csv is blank for the first word ‘test’ (395 characters), but present for the second word ‘testing’ (95 characters).

This is how it is for me regardless of the course used however.

Edit: I just realized in this example the 395 character note is just misplaced 17 rows beneath where it should be. Which still isn’t ideal, but is different to what usually happens on my proper/bigger private courses (field missing completely, can’t be found anywhere in the spreadsheet). Is there something wrong on my end that these strange misplacements & omissions occur?

Should there be anything in that field? If opened on Memrise, this word doesn’t show anything corresponding to ‘Part of Speech’ either, unlike the second one, which has the respective attribute at the bottom:

Apart from the duplicate “common japanese” field for the second word (which is not downloaded since the extension is not designed to handle conflicting field names), the data I see in the downloaded csv seems to coincide with what is displayed on the Memrise screenshots:

Should there be anything in that field?

Yes - 395 characters of the word ‘test’. It’s right there in the memrise level editor just like the second one that does show up. (And just like the 189+ character notes on my private courses that don’t download, sitting next to their shorter counterparts that do download.)

Weirder still, if you check my post edit, the 395 character field actually is in the csv, just 17 rows away from where it should be randomly: memrise|690x306 This is actually different to what usually happens for me (totally absent), but no less puzzling.

I’m not sure why it doesn’t show up in your screenshot. But does that suggest it’s a memrise thing rather than an issue with the extension?

It appears so. It would make sense that Memrise sanitizes the data between editor and reviewer in some ways. The extension uses the same requests as the reviewer to fetch info, so anything not included there won’t be downloaded.
Here is the full response provided by Memrise in return to requesting data from the first level of that course (you can use search to verify that “test test test test” does not appear there, while “testing testing testing testing” does):

Full response
{
    "learnables": [
        {
            "id": 28902206603522,
            "learning_element": "test",
            "definition_element": "test",
            "learning_element_tokens": [
                "test"
            ],
            "definition_element_tokens": [
                "test"
            ],
            "difficulty": "unknown",
            "item_type": null,
            "screens": {
                "1": {
                    "item": {
                        "label": "Kana",
                        "kind": "text",
                        "value": "test",
                        "alternatives": [],
                        "style": [],
                        "direction": "target",
                        "markdown": false
                    },
                    "definition": {
                        "label": "English",
                        "kind": "text",
                        "value": "test",
                        "alternatives": [],
                        "style": [],
                        "direction": "source",
                        "markdown": false
                    },
                    "visible_info": [],
                    "hidden_info": [
                        {
                            "label": "Common Japanese",
                            "kind": "text",
                            "value": "test",
                            "alternatives": [],
                            "style": [],
                            "direction": "target",
                            "markdown": false
                        },
                        {
                            "label": "Kanji",
                            "kind": "text",
                            "value": "test",
                            "alternatives": [],
                            "style": [],
                            "direction": "target",
                            "markdown": false
                        }
                    ],
                    "attributes": [],
                    "audio": null,
                    "markdown": false,
                    "video": null,
                    "template": "presentation"
                },
                "2": {
                    "template": "multiple_choice",
                    "prompt": {
                        "text": {
                            "label": "English",
                            "kind": "text",
                            "value": "test",
                            "alternatives": [],
                            "style": [],
                            "direction": "source",
                            "markdown": false
                        },
                        "audio": null,
                        "video": null,
                        "image": null
                    },
                    "answer": {
                        "label": "Kana",
                        "kind": "text",
                        "value": "test",
                        "alternatives": [],
                        "style": [],
                        "direction": "target",
                        "markdown": false
                    },
                    "correct": [
                        "test"
                    ],
                    "choices": [
                        "testing",
                        "test",
                        "test",
                        "test"
                    ],
                    "audio": null,
                    "markdown": false,
                    "attributes": [],
                    "post_answer_info": null,
                    "placeholder": null,
                    "feedback_screen": null,
                    "is_strict": false,
                    "translation_prompt": null,
                    "gap_prompt": null
                },
                "3": {
                    "template": "reversed_multiple_choice",
                    "prompt": {
                        "text": {
                            "label": "Kana",
                            "kind": "text",
                            "value": "test",
                            "alternatives": [],
                            "style": [],
                            "direction": "target",
                            "markdown": false
                        },
                        "audio": null,
                        "video": null,
                        "image": null
                    },
                    "answer": {
                        "label": "English",
                        "kind": "text",
                        "value": "test",
                        "alternatives": [],
                        "style": [],
                        "direction": "source",
                        "markdown": false
                    },
                    "correct": [
                        "test"
                    ],
                    "choices": [
                        "testing",
                        "test",
                        "test",
                        "test"
                    ],
                    "audio": null,
                    "markdown": false,
                    "attributes": [],
                    "post_answer_info": null,
                    "placeholder": null,
                    "feedback_screen": null,
                    "is_strict": false,
                    "translation_prompt": null,
                    "gap_prompt": null
                },
                "4": {
                    "template": "typing",
                    "prompt": {
                        "text": {
                            "label": "English",
                            "kind": "text",
                            "value": "test",
                            "alternatives": [],
                            "style": [],
                            "direction": "source",
                            "markdown": false
                        },
                        "audio": null,
                        "video": null,
                        "image": null
                    },
                    "answer": {
                        "label": "Kana",
                        "kind": "text",
                        "value": "test",
                        "alternatives": [],
                        "style": [],
                        "direction": "target",
                        "markdown": false
                    },
                    "correct": [
                        "test"
                    ],
                    "choices": [
                        "n",
                        "g",
                        "t",
                        "i",
                        "e",
                        "s"
                    ],
                    "audio": null,
                    "markdown": false,
                    "attributes": [],
                    "post_answer_info": null,
                    "placeholder": null,
                    "feedback_screen": null,
                    "is_strict": false,
                    "translation_prompt": null,
                    "gap_prompt": null
                }
            },
            "screen_config": {
                "explore": [],
                "growth_level_0": [],
                "growth_level_1": [],
                "growth_level_2": [],
                "growth_level_3": [],
                "growth_level_4": [],
                "growth_level_5": []
            }
        },
        {
            "id": 28902207258882,
            "learning_element": "testing",
            "definition_element": "testing",
            "learning_element_tokens": [
                "testing"
            ],
            "definition_element_tokens": [
                "testing"
            ],
            "difficulty": "unknown",
            "item_type": null,
            "screens": {
                "1": {
                    "item": {
                        "label": "Kana",
                        "kind": "text",
                        "value": "testing",
                        "alternatives": [],
                        "style": [],
                        "direction": "target",
                        "markdown": false
                    },
                    "definition": {
                        "label": "English",
                        "kind": "text",
                        "value": "testing",
                        "alternatives": [],
                        "style": [],
                        "direction": "source",
                        "markdown": false
                    },
                    "visible_info": [],
                    "hidden_info": [
                        {
                            "label": "Common Japanese",
                            "kind": "text",
                            "value": "testing",
                            "alternatives": [],
                            "style": [],
                            "direction": "target",
                            "markdown": false
                        },
                        {
                            "label": "Kanji",
                            "kind": "text",
                            "value": "testing",
                            "alternatives": [],
                            "style": [],
                            "direction": "target",
                            "markdown": false
                        }
                    ],
                    "attributes": [
                        {
                            "label": "Part of Speech",
                            "value": "testing testing testing testing"
                        }
                    ],
                    "audio": null,
                    "markdown": false,
                    "video": null,
                    "template": "presentation"
                },
                "2": {
                    "template": "multiple_choice",
                    "prompt": {
                        "text": {
                            "label": "English",
                            "kind": "text",
                            "value": "testing",
                            "alternatives": [],
                            "style": [],
                            "direction": "source",
                            "markdown": false
                        },
                        "audio": null,
                        "video": null,
                        "image": null
                    },
                    "answer": {
                        "label": "Kana",
                        "kind": "text",
                        "value": "testing",
                        "alternatives": [],
                        "style": [],
                        "direction": "target",
                        "markdown": false
                    },
                    "correct": [
                        "testing"
                    ],
                    "choices": [
                        "test",
                        "testing",
                        "testing",
                        "testing"
                    ],
                    "audio": null,
                    "markdown": false,
                    "attributes": [],
                    "post_answer_info": null,
                    "placeholder": null,
                    "feedback_screen": null,
                    "is_strict": false,
                    "translation_prompt": null,
                    "gap_prompt": null
                },
                "3": {
                    "template": "reversed_multiple_choice",
                    "prompt": {
                        "text": {
                            "label": "Kana",
                            "kind": "text",
                            "value": "testing",
                            "alternatives": [],
                            "style": [],
                            "direction": "target",
                            "markdown": false
                        },
                        "audio": null,
                        "video": null,
                        "image": null
                    },
                    "answer": {
                        "label": "English",
                        "kind": "text",
                        "value": "testing",
                        "alternatives": [],
                        "style": [],
                        "direction": "source",
                        "markdown": false
                    },
                    "correct": [
                        "testing"
                    ],
                    "choices": [
                        "test",
                        "testing",
                        "testing",
                        "testing"
                    ],
                    "audio": null,
                    "markdown": false,
                    "attributes": [],
                    "post_answer_info": null,
                    "placeholder": null,
                    "feedback_screen": null,
                    "is_strict": false,
                    "translation_prompt": null,
                    "gap_prompt": null
                },
                "4": {
                    "template": "typing",
                    "prompt": {
                        "text": {
                            "label": "English",
                            "kind": "text",
                            "value": "testing",
                            "alternatives": [],
                            "style": [],
                            "direction": "source",
                            "markdown": false
                        },
                        "audio": null,
                        "video": null,
                        "image": null
                    },
                    "answer": {
                        "label": "Kana",
                        "kind": "text",
                        "value": "testing",
                        "alternatives": [],
                        "style": [],
                        "direction": "target",
                        "markdown": false
                    },
                    "correct": [
                        "testing"
                    ],
                    "choices": [
                        "g",
                        "e",
                        "i",
                        "n",
                        "s",
                        "t"
                    ],
                    "audio": null,
                    "markdown": false,
                    "attributes": [],
                    "post_answer_info": null,
                    "placeholder": null,
                    "feedback_screen": null,
                    "is_strict": false,
                    "translation_prompt": null,
                    "gap_prompt": null
                }
            },
            "screen_config": {
                "explore": [],
                "growth_level_0": [],
                "growth_level_1": [],
                "growth_level_2": [],
                "growth_level_3": [],
                "growth_level_4": [],
                "growth_level_5": []
            }
        }
    ],
    "progress": [],
    "session_source_info": {
        "source_id": 6617985,
        "source_type": "course_id_and_level_index",
        "name": "test",
        "translated_name": "test",
        "learnable_ids_to_course_ids": {},
        "num_due_for_review": 0,
        "level_id": 15875645,
        "level_name": "New level",
        "source_sub_index": 1,
        "template_id": null,
        "parent_source_id": null,
        "parent_template_id": null
    },
    "settings": {
        "disable_multimedia": false,
        "disable_tapping": false,
        "prioritize_typing": true
    }
}

It’s not in the csv that I downloaded. In that one the part I pasted in the screenshot before is the actual end of the table, there is nothing else below. Maybe info returned by Memrise also differs somewhat, depending on wether it is requested from a course creator’s account.

Does it show up for you when you are reviewing the course?


maybe they similarly get misplaced into different rows and then overwritten by the words that actually belong there?

Also, what does your csv look like when it’s opened in plain text editor (notepad)?