Extension: Rooster Lesson Editor -> Easy LingQ Lesson editing program

Hi there, this looks extremely useful!

I’m not a Firefox user. But I must be doing something wrong, because when clicking the link for the Chrome extension in your post, I’m taken to a site where google wants me to register as a developer. This doesn’t seem right…

Hi @jaredredmond

Sorry about that I fixed the chrome link

1 Like

Lovely, thank you for that!



Thankyou very much to @jf999 for his generous donation and @jpp025 for his great idea with the translations.


→ Lesson editor now loads without page refresh
→ Translation View and Update menu added
→ Lesson editor is now longer and wider by default
→ Translation box and original box scroll each other


→ increased scope to LingQ library onwards → no reload required
→ fixed conflicting names betweer rooster products
→ added translation toggle → retains state between updates
→ found good end point to do mass updates. Requires code restructuring (change of operations order) so will be looked at in future patch.
→ check out this endpoint yourself → change ‘fi’ to your language ad ‘214…’ to your lessonId.


→ Place to drop a new block of text content if you want to overwrite the whole thing. also select if you want paragraph everything in this menu.
→ Generate Timestamps and Timestamps display
→ Maybe faster saving (If i sort out the operations and backend)




1 Like


With many thanks to @jf999 and @jpp025


I now consider the free version of this product complete.
Unless there is some major problem…!

Patch Notes 1.20

→ Added toggle-able Timestamp menu
→ Editing of timestamps,
→ Playback of Audio fragments without delay
→ Edit multiple timestamps before saving
→ Auto generate new timestamps without a page refresh

Patch Notes for nerds 1.20

→ Audio is cached when we first request timestamps. No delay or lagging between audio clips.
→ Genaudio returns invalid JSON → LingQ devs should have a look at this, the timestamps are returning too early and giving invalid results. I had to re-request the timestamp data after 3 seconds.

Lesson Editor Free -> final thoughts and notes from the author.

→ There are minor bug fixes and improvements to be made on the saving operations.
→ The source code is available in this state to anyone looking to make improvements for personal use.
→ Notable bugs include (Multi-line deletion by cursor, cannot paste on new line and backspacing at end of line causes script errors sometimes.)
→ People should just do big edits in a different editor and utilize the delete everything button until the premium version of this product is released.

1 Like

Awesome work, @roosterburton!

Can this be made resizable? It seems like the proportions are off for my 13-inch screen:

Edit 2: Example of a resizable window that you’ve done in the past:

Even in full-screen mode, it requires side-scrolling:

Firefox Full-screen Rooster Editor:

Edit: Or is there a way for the extension to detect the size of the (Firefox) window and automatically resize based on what it detects? (hopefully that makes sense :laughing: )

P.S. Do you know of a way I can force an update on a Firefox extension without having to uninstall and reinstall? I keep having to uninstall and reinstall to see updates for the extensions. It’s not a huge deal, just inconvenient, lol.

1 Like

Hi @roosterburton, the extension looks really promising and it already can save hours of time!
I’ve encountered some issues in it though, that I’d like to share and give some thoughts on possible solutions for them:

  1. editable-container and translation-container grow too wide (as mentioned by @jpp025, one has to use side scroll for multiple screen wide text). The easy fix that comes to me is setting “white-space” to “normal” (instead of “nowrap”) on these elements. However as a side effect the “Paragraph” and “Delete” buttons stretch over the lines, which is not critical, but timestamps will no longer align with sentences, and this is a bit worse.

    EDIT: Downloaded the sources and I see that you deliberately prevent line breaks. Not sure if it’s more preferable than having 4 different horizontal scrolls… Maybe then contentContainer should be set with max width, to avoid the overall horizontal scroll as a starting point, but with editable containers its either wrap and misaligned rows across the page or nowrap and horizontal slides…

  2. Not sure if this one fall into “backspace at the end of line”, but: when merging two sentences (by hitting delete at the end of the line) the second sentence remains after changes are saved, resulting in duplicated parts.

  3. If there is no audio file attached then timestamps are filled with nulls for every sentence: [null, null].

    The issue however is when you attempt to save changes and it tries to update timestamps as well, and we have the following exception: TypeError: timestampBox.getAttribute(…) is nullcontent.js:1714:57
    The page must be reloaded after that, as it gets stuck in saving state.

  4. Quite minor point, but might help with better visuals. It seems that timestamps are stored in float and therefore sometimes we have ridiculous numbers there. I’d guess floor() to first decimal to match with a built-in editor might be a solution.

Anyway, the extension rocks! Keep up the great work!

1 Like

I took a few extra screenshots if it helps @roosterburton. I’m not sure about what it is on the technical side, but if the audio timestamps mirrored the LingQ timestamp editor (in terms of format) it would help with the user-friendliness/compatibility of the extension:

Current Timing in the Editor Rooster Editor:

Edit: Note: This is a screenshot of a current lesson that doesn’t have audio, yet. So, that may affect what is shown in the image.

Edit 2: This is what the timestamps of a lesson with audio imported looks like in the Rooster Editor:

Edit 3: Timing and structure of Editor in LingQ:

1 Like

if i import an youtube video there is a lot of empty space between sentences sure by making it into sentence mode it fixes the issue however if the text is too long we need a button that can do it to the whole text with one click something like “sentence everything”. etc That will be less time consuming and text extracted from youtube video will be more pleasant to read.

1 Like

Thank you very much for all the feedback. I’ll look into solutions for these things today and post an update!


Bug fixes and idea implementations from 1.20

Again with many thanks to @wadeack @jpp025 and @asad100101 for their ideas and contributions.










→ I removed the ability to delete and backspace up lines in the original editor.
→ Doesn’t send timestamps/translation info if they aren’t visible.



→ Add Headers to the text as well as Paragraphs/Sentences
→ Move the Paragraph/Sentence/header button to own column
→ Change delete button to small X on outside left of container
→ Generate AI lesson audio in the menu
→ Choose which voice you want to narrate whole thing
→ Choose which voice for each sentence (If you want)
→ Quick popup to insert new lesson text, if you want paragraphs, generated audio etc…
→ Add editor button to the /reader
→ Better UI design and color choices
→ Removed donation button
→ Early donaters get premium for free

If something else should be here, leave a suggestion.


Additional Idea: Highlight Sentence/paragraph on click:

When you click on a sentence/paragraph to type into that spot (or click to manipulate the play audio/TTS buttons), a light (but still easily seen—like a highlighter) highlight extends across the editor (containers) to follow everything on that line. This is especially helpful when you’re working with a larger text field, so you can edit quickly and easily.

Very Rough Example:


Patch notes for 1.10 - 1.18

For 1.10

→ GUI Layout fixed
→ Toggle Formatting/Delete buttons
→ Dark Mode toggle → Retains state
→ Starts in dark mode
→ Change font → Retains state

For 1.11
→ Added New columns for TTS
→ Added these TTS voices
const voiceMap = {
‘fi’: [
{ appName: “msspeak”, voice: “fi-FI:Female:SelmaNeural” },
{ appName: “gCloudTTS”, voice: “fi-FI:female” },
{ appName: “msspeak”, voice: “fi-FI:Female” }
‘zh’: {appName: ‘polly’, voice: ‘Zhiyu’},
‘ko’: {appName: ‘polly’, voice: ‘Seoyeon’},
‘ja’: {appName: ‘gCloudTTS’, voice: ‘ja-JA:Female’},
‘sv’: {appName: ‘polly’, voice: ‘Astrid’},
‘de’: {appName: ‘polly’, voice: ‘Marlene’},
‘fr’: {appName: ‘polly’, voice: ‘Celine’},
‘it’: {appName: ‘polly’, voice: ‘Carla’},
‘ru’: {appName: ‘polly’, voice: ‘Tatyana’}

for 1.12
→ Bug fixes for non Finnish TTS
→ Added 3 more Japanese voices
→ Added play/pause/resume button to the voices

for 1.13
→ Works with Free and Premium installed
→ Bug fix for audio after saving

for 1.14
→ GUI Update, title in dark mode, some buttons are same lined.

for 1.15
→ Added the code to display and toggle headers
(but they don’t work in link reader… , I’ll add a custom patch to the LingQ reader to display headers in the future)
→ Moved to NODE JS
→ Can now generate TTS audio for your lesson (FIREFOX ONLY)
(Chrome has stricter cross origin controls and blocks my request to the LingQ amazon bucket. Firefox allows it)

for 1.16
→ fixed dropdown for TTS on Firefox
→ Added a lot more TTS voices
→ ‘fi’: [
{ appName: “msspeak”, voice: “fi-FI:Female:SelmaNeural” },
{ appName: “gCloudTTS”, voice: “fi-FI:female” },
{ appName: “msspeak”, voice: “fi-FI:Female” }
‘zh’: [
{appName: ‘polly’, voice: ‘Zhiyu’},
{appName: ‘msspeak’, voice: ‘zh-HK:Female’},
‘ko’: [
{appName: ‘polly’, voice: ‘Seoyeon’},
{appName: ‘msspeak’, voice: ‘ko-KR:Female’}
‘ja’: [
{appName: ‘polly’, voice: ‘Takumi’},
{appName: ‘polly’, voice: ‘Mizuki’},
{appName: ‘gCloudTTS’, voice: ‘ja-JP:male’},
{appName: ‘gCloudTTS’, voice: ‘ja-JP:female’}
‘sv’: [
{appName: ‘polly’, voice: ‘Astrid’},
{appName: ‘msspeak’, name: ‘sv-SE:Female’}
{appName: ‘polly’, voice: ‘Marlene’},
{appName: ‘polly’, voice: ‘Vicki’},
{appName: ‘msspeak’, voice: ‘de-DE:Female’},
{appName: ‘polly’, voice: ‘Hans’}
{appName: ‘polly’, voice: ‘Celine’},
{appName: ‘polly’, voice: ‘Lea’},
{appName: ‘polly’, voice: ‘Mathieu’},
{appName: ‘gCloudTTS’, voice: ‘fr-CA:female’}
‘it’: [
{appName: ‘polly’, voice: ‘Carla’},
{appName: ‘polly’, voice: ‘Bianca’},
{appName: ‘msspeak’, voice: ‘it-IT:Female’},
{appName: ‘polly’, voice: ‘Giorgio’}
‘ru’: [
{appName: ‘polly’, voice: ‘Tatyana’},
{appName: ‘polly’, voice: ‘Maxim’}
‘tr’: [{appName: ‘polly’, voice: ‘Filiz’}],
‘hk’: [{appName: ‘msspeak’, name: ‘zh-HK:Female’}],
‘nl’: [{appName: ‘polly’, voice: ‘Lotte’}],
‘srp’: [{appName: ‘gCloudTTS’, name: ‘sr-RS:female’}],
‘ar’: [{appName: ‘polly’, voice: ‘Zeina’}],
{appName: ‘msspeak’, voice: ‘ca-ES:Female’},
{appName: ‘msspeak’, voice: ‘ca-ES:Male’}
{appName: ‘msspeak’, name: ‘zh-CN:Female’},
{appName: ‘polly’, name: ‘Zhiyu’}
{appName: ‘msspeak’, voice: ‘en-US:Female’},
{appName: ‘polly’, voice: ‘Nicole’},
{appName: ‘polly’, voice: ‘Brian’},
{appName: ‘polly’, voice: ‘Matthew’}
‘la’:[{appName: ‘gtts’, voice: ‘la’}],
‘eo’:[{appName: ‘eSpeak’, voice: ‘eo’}],
{appName: ‘msspeak’, voice: ‘el-GR:Female’},
{appName: ‘gCloudTTS’, voice: ‘el-GR:female’}
{appName: ‘polly’, voice: ‘Vitoria’},
{appName: ‘polly’, voice: ‘Ricardo’},
{appName: ‘polly’, voice: ‘Cristiano’},
{appName: ‘polly’, voice: ‘Camila’}
{appName: ‘msspeak’, voice: ‘sl-SI:Female’},
{appName: ‘msspeak’, voice: ‘sl-SI:Male’}

for 1.17
→ Added current time to the play buttons

for 1.18
→ Added Input to upload a .txt file as the new lesson text. (One update method)


Edit: Another Important positive of this feature is that it doesn’t try to use Western punctuation sentence ending markers (a.k.a. periods ( . ), question marks ( ? ), etc. to separate what it perceives as a “typical sentence.” When you upload a .txt file for patching the text, it keeps each line of text as a line of text. THANK YOU SO MUCH!

I say this because I tried LingQ’s TXT file import feature for uploading lessons and it changed my txt sentences based on where it read a punctuation mark, which messed up my intended view of the text — combining sentences just because it saw no Western punctuation marks.

I was about to use the Premium Rooster Lesson Editor to patch the text to look how I initially intended it to look (basically each new line equals a paragraph — regardless of punctuation — which is how I like to view things)! So awesome!

Original Reply:

Love it! This feature is a game changer for those of us with languages that aren’t as closely knit to Western punctuation, have a hodge-podge of a lesson with no punctuation consistency*, and have a more difficult time with the built-in LingQ editor!

*Some sentences end in a specific type of punctuation, others end in another kind, and still others omit punctuation with no discernable pattern to use punctuation/symbol indicators of splitting sentences.

Plus, having an alternative and straightforward option to bulk edit target language text for lessons is nice!

I love that I can edit the text for this simply by putting each sentence on a new line in the .txt file!

P.S. For Mac users, use your TextEdit program (on the Mac by default as far as I can tell) and be sure your file saves as a plain text file (under Format) to be sure it gets saved as a .txt file. I didn’t do this at first, and it saved as an RTF file (the default format for a New Document via TextEdit), which doesn’t turn out well for your edit text, lol.

Why you should make sure your file is .txt and not RTF, lol:

A nice picture of how it looks when you do use txt :)

Excellent edition, @roosterburton!

1 Like

That is a feature I didn’t anticipate but I’m glad it works in that way! Grammarless languages, damn… what a trip.

I almost cried when I found there was a way to patch the text like this. This code has become quite intricate with the individual saves and order of operations. I like that this bulk patch method doesn’t destroy the original formatting either.

Nice find! Great way to save the ASCII codes if you ever wanted them.
You can probably use RTF just save with formatting of UTF8. I’ll add support for more file types next update.

1 Like

haha, yeah, definitely not something I expected from a Western POV (didn’t realize how limited that perspective was for me until I learned this)

I would say it’s not entirely “grammarless”, it just has a different grammar structure that isn’t always immediately clear for language learners (especially noobies, like me).

For example:

There are also sentence endings like the ones found here that serve as indications of a sentence/complete expression of thought:

  • -요
  • -ㅂ니다
  • -(으/느)ㄴ 것 같아요
  • -(으)ㄹ 수도 있어요
  • -죠 or -지요
  • -(으/느)ㄴ데요
  • -네요
  • -세요

Note: Only a *few *are listed.

Source: And also a really good explainer about the difference between the English Language and Korean:

This video actually explains some of the challenges of Korean sentences specifically, if anyone is interested:

ung-gat-ta-tai-oh at the end of every sentence… Not sure why they need so many syllables, maybe I’ll find out one day!

Short Answer: Honorifics, verb tenses, etc.

But yes, it’s a great language to dive into if you are ever interested, regardless, great to have the .txt patch text feature! :smiley: Thanks again!

I wanted it. I downloaded and installed it. I have it. I imported a lesson and clicked it. I saw it. I tried to use it. I’m lost. Help! You probably posted instructions somewhere in this thread…?

Sorry, my head is muddled after 2.5 hours of editing an imported YouTube video’s messed up captions. (All the captions just said: woo woo woo, wee wee, music, wee wee, etc…)

Hi @WillowMeDown! @roosterburton has great videos for the Rooster extensions linked on the main extension page: Web Browser Extensions (Software) for LingQ

These are ones I found particularly helpful for the Editor:

The directions for getting it to pop up are quoted below for your convenience:

More videos and visuals for the free version of the editor:

For the new .txt file feature, that is only in the Premium Version, the Patch 1.18 Video shows how to use that feature:

Edit: Note: Patch Video 1.15 shows how to use the Premium Editor Version without the .txt edit feature, but it still works the same way with the most recent patch.

1 Like