From a495ad07714bd754ab57f786baf9f37e065322e1 Mon Sep 17 00:00:00 2001 From: Mircea Lungu Date: Wed, 27 May 2026 09:59:44 +0200 Subject: [PATCH 1/2] Add Open Graph link previews for shared audio lessons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shared-lesson links (zeeguu.org/shared-lesson/) previously showed the generic site preview on WhatsApp/iMessage/Slack/etc., because the SPA shell has no per-lesson meta tags and crawlers don't run JS. This serves crawlers a server-rendered preview with the actual lesson. - DailyAudioLesson.cefr_level(): the lesson's CEFR level, read from its segments (most common, since cached word-audio can disagree — see #636). Surfaced in all three lesson responses incl. the shared view. - og_image.py: renders a 1200x630 branded card (amber elephant, language, title, duration/CEFR/type chips, words) from a lesson view dict. Cached on disk; lessons are immutable. Montserrat (brand font) + logo bundled as assets. - Endpoints: GET /shared_lesson_preview/ (OG/Twitter HTML) and GET /shared_lesson_image/.png (the card). Both public, keyed on the unguessable share_uuid; no auth. nginx routing for crawler user-agents is staged separately in the ops tree. Co-Authored-By: Claude Opus 4.7 (1M context) --- zeeguu/api/endpoints/audio_lessons.py | 107 ++++++++ .../assets/fonts/Montserrat-Bold.ttf | Bin 0 -> 47088 bytes .../assets/fonts/Montserrat-ExtraBold.ttf | Bin 0 -> 47468 bytes .../assets/fonts/Montserrat-Regular.ttf | Bin 0 -> 46392 bytes .../assets/fonts/Montserrat-SemiBold.ttf | Bin 0 -> 47036 bytes .../core/audio_lessons/assets/zeeguu-logo.png | Bin 0 -> 20377 bytes .../audio_lessons/daily_lesson_generator.py | 3 + zeeguu/core/audio_lessons/og_image.py | 248 ++++++++++++++++++ zeeguu/core/model/daily_audio_lesson.py | 28 ++ 9 files changed, 386 insertions(+) create mode 100644 zeeguu/core/audio_lessons/assets/fonts/Montserrat-Bold.ttf create mode 100644 zeeguu/core/audio_lessons/assets/fonts/Montserrat-ExtraBold.ttf create mode 100644 zeeguu/core/audio_lessons/assets/fonts/Montserrat-Regular.ttf create mode 100644 zeeguu/core/audio_lessons/assets/fonts/Montserrat-SemiBold.ttf create mode 100644 zeeguu/core/audio_lessons/assets/zeeguu-logo.png create mode 100644 zeeguu/core/audio_lessons/og_image.py diff --git a/zeeguu/api/endpoints/audio_lessons.py b/zeeguu/api/endpoints/audio_lessons.py index a0fd0f3b..83484a4d 100644 --- a/zeeguu/api/endpoints/audio_lessons.py +++ b/zeeguu/api/endpoints/audio_lessons.py @@ -1,8 +1,11 @@ import flask +from markupsafe import escape from zeeguu.api.utils.background import run_in_background from zeeguu.api.utils.json_result import json_result from zeeguu.api.utils.route_wrappers import cross_domain, requires_session +from zeeguu.config import ZEEGUU_DATA_FOLDER +from zeeguu.core.audio_lessons import og_image from zeeguu.core.audio_lessons.daily_lesson_generator import DailyLessonGenerator from zeeguu.core.audio_lessons.script_generator import VALID_LESSON_TYPES, THREE_WORDS_LESSON from zeeguu.core.audio_lessons.suggestion_validator import validate_suggestion @@ -10,6 +13,12 @@ from zeeguu.logging import log from . import api +# Production origins for shared-lesson link previews. The share page lives on +# the web app; the OG card image is served by this API. (The frontend likewise +# hardcodes zeeguu.org.) +SHARE_WEB_ORIGIN = "https://zeeguu.org" +SHARE_API_ORIGIN = "https://api.zeeguu.org" + def _generate_lesson_in_background(user_id, preparation): """ @@ -183,6 +192,104 @@ def create_lesson_share_link(lesson_id): return json_result({"share_uuid": lesson.share_uuid}) +def _preview_texts(view): + """Build the (page/OG title, description) for a shared lesson's link preview.""" + title = (view.get("title") or "Audio lesson").strip() + language = og_image.language_name(view.get("language_code")) + cefr = view.get("cefr_level") + lesson_type = view.get("lesson_type") + words = [w.get("origin") for w in (view.get("words") or []) if w.get("origin")] + + seconds = view.get("duration_seconds") + minutes = f"{max(1, round(seconds / 60))}-min" if seconds else None + + # OG title: the lesson name, with light context appended. + context = f"{language} audio lesson" if language else "audio lesson" + og_title = f"{title} — {context}" + + # Description. + lead = " ".join(p for p in [minutes, language] if p) # e.g. "4-min German" + opening = f"A {lead} audio lesson" if lead else "An audio lesson" + if cefr: + opening += f" at level {cefr}" + if lesson_type in ("topic", "situation"): + body = "Listen to a real conversation and pick up the words." + elif words: + body = f"Learn {len(words)} new words by listening." + else: + body = "Learn by listening." + description = f"{opening}. {body} With Zeeguu." + return og_title, description + + +def _preview_html(view, share_uuid): + og_title, description = _preview_texts(view) + page_url = f"{SHARE_WEB_ORIGIN}/shared-lesson/{share_uuid}" + image_url = f"{SHARE_API_ORIGIN}/shared_lesson_image/{share_uuid}.png" + title = escape(og_title) + desc = escape(description) + return f""" + + + + +{title} + + + + + + + + + + + + + + + + + + + +

Opening this audio lesson on Zeeguu… Continue.

+ + +""" + + +@api.route("/shared_lesson_preview/", methods=["GET"]) +@cross_domain +def shared_lesson_preview(share_uuid): + """Crawler-facing HTML with Open Graph tags for a shared lesson link. + + nginx routes social-scraper user-agents hitting zeeguu.org/shared-lesson/ + here; real users get the SPA. A missing lesson (or a human who lands here) is + redirected to the app.""" + view = DailyLessonGenerator().get_shared_lesson_view(share_uuid) + if view.get("error"): + return flask.redirect(f"{SHARE_WEB_ORIGIN}/shared-lesson/{share_uuid}", code=302) + response = flask.Response(_preview_html(view, share_uuid), mimetype="text/html") + response.headers["Cache-Control"] = "public, max-age=3600" + return response + + +@api.route("/shared_lesson_image/.png", methods=["GET"]) +@cross_domain +def shared_lesson_image(share_uuid): + """1200x630 Open Graph card for a shared lesson, rendered once and cached.""" + view = DailyLessonGenerator().get_shared_lesson_view(share_uuid) + if view.get("error"): + return flask.Response("Not found", status=404) + path = og_image.ensure_cached_card(view, ZEEGUU_DATA_FOLDER) + if not path: + return flask.Response("Not found", status=404) + response = flask.send_file(path, mimetype="image/png") + response.headers["Cache-Control"] = "public, max-age=86400" + return response + + @api.route("/get_todays_lesson", methods=["GET"]) @cross_domain @requires_session diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-Bold.ttf b/zeeguu/core/audio_lessons/assets/fonts/Montserrat-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3bfd79b66f9dd2a59deef46385ff5d9c576d6aae GIT binary patch literal 47088 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 TV!uf}z&C0i)Vr*-XWRb)IXm>Y literal 0 HcmV?d00001 diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-ExtraBold.ttf b/zeeguu/core/audio_lessons/assets/fonts/Montserrat-ExtraBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d0291d1c38b082b9f3f2f3f341ff579bcedd9b46 GIT binary patch literal 47468 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 literal 0 HcmV?d00001 diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-Regular.ttf b/zeeguu/core/audio_lessons/assets/fonts/Montserrat-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5da852a349abb6a4f043b9bbbed1f66f6c249dc9 GIT binary patch literal 46392 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 literal 0 HcmV?d00001 diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-SemiBold.ttf b/zeeguu/core/audio_lessons/assets/fonts/Montserrat-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9fe924c0f7c0f730a20add74dccb174ce7d1b58f GIT binary patch literal 47036 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Ühz?iE*yj?(xSwj*!wBfXd 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 literal 0 HcmV?d00001 diff --git a/zeeguu/core/audio_lessons/assets/zeeguu-logo.png b/zeeguu/core/audio_lessons/assets/zeeguu-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a07d6e68dd291c32ecfe495d4cb2cec8352f4d40 GIT binary patch literal 20377 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 i` link otherwise falls back to the generic site +preview. This renders a 1200x630 PNG card from a lesson's public view dict +(the same data returned by DailyLessonGenerator.get_shared_lesson_view) so the +preview shows the actual lesson: title, language, duration, CEFR level, words. + +Pure function of the view dict + brand assets — no DB access — so it's trivial +to unit-test and to render samples. Cards are immutable per lesson, so callers +cache the PNG on disk (see ensure_cached_card). +""" + +import os +from functools import lru_cache + +from PIL import Image, ImageDraw, ImageFont + +# 1.91:1 — the ratio every major scraper crops to. +WIDTH, HEIGHT = 1200, 630 +MARGIN = 70 + +_ASSETS = os.path.join(os.path.dirname(__file__), "assets") +_FONTS = os.path.join(_ASSETS, "fonts") +_LOGO_PATH = os.path.join(_ASSETS, "zeeguu-logo.png") + +# Warm Zeeguu palette (mirrors web/src/components/colors.js). +BG_TOP = (255, 248, 230) # cream +BG_BOTTOM = (255, 230, 188) # light amber +INK = (74, 50, 8) # dark brown — primary text +INK_SOFT = (140, 110, 60) # muted brown — secondary text +ORANGE = (255, 168, 40) # zeeguuOrange-ish, brand accent +ORANGE_DEEP = (196, 120, 24) # darker orange for the wordmark +CHIP_BORDER = (224, 190, 130) +WHITE = (255, 255, 255) + +_LANGUAGE_NAMES = { + "da": "Danish", "de": "German", "es": "Spanish", "fr": "French", + "nl": "Dutch", "en": "English", "it": "Italian", "pt": "Portuguese", + "ro": "Romanian", "sv": "Swedish", "no": "Norwegian", "pl": "Polish", + "ru": "Russian", "hu": "Hungarian", +} + + +def language_name(code): + if not code: + return None + return _LANGUAGE_NAMES.get(code.lower(), code.upper()) + + +@lru_cache(maxsize=None) +def _font(weight, size): + return ImageFont.truetype(os.path.join(_FONTS, f"Montserrat-{weight}.ttf"), size) + + +def _text_w(draw, text, font): + return draw.textlength(text, font=font) + + +def _wrap(draw, text, font, max_width, max_lines): + """Greedy word wrap; the last line gets an ellipsis if text is truncated.""" + words = text.split() + lines, current = [], "" + for word in words: + candidate = f"{current} {word}".strip() + if _text_w(draw, candidate, font) <= max_width or not current: + current = candidate + else: + lines.append(current) + current = word + if len(lines) == max_lines: + break + if len(lines) < max_lines and current: + lines.append(current) + + truncated = len(lines) == max_lines and ( + current != lines[-1] or len(" ".join(words)) > len(" ".join(lines)) + ) + if truncated: + last = lines[-1] + while last and _text_w(draw, last + "…", font) > max_width: + last = last[:-1].rstrip() + lines[-1] = last + "…" + return lines + + +def _rounded(draw, box, radius, **kwargs): + draw.rounded_rectangle(box, radius=radius, **kwargs) + + +def _draw_chip(draw, x, y, text, font, *, filled): + """Draws a pill at (x, y); returns the x just past its right edge.""" + pad_x, pad_y = 22, 12 + tw = _text_w(draw, text, font) + ascent, descent = font.getmetrics() + th = ascent + descent + box = (x, y, x + tw + 2 * pad_x, y + th + 2 * pad_y) + if filled: + _rounded(draw, box, radius=(th + 2 * pad_y) // 2, fill=ORANGE) + draw.text((x + pad_x, y + pad_y), text, font=font, fill=WHITE) + else: + _rounded(draw, box, radius=(th + 2 * pad_y) // 2, + fill=WHITE, outline=CHIP_BORDER, width=2) + draw.text((x + pad_x, y + pad_y), text, font=font, fill=INK_SOFT) + return box[2] + + +def _play_chip(draw, x, y, text, font): + """A duration chip with a little play triangle in front of the text.""" + pad_x, pad_y, gap = 22, 12, 14 + tri = 22 + tw = _text_w(draw, text, font) + ascent, descent = font.getmetrics() + th = ascent + descent + box = (x, y, x + pad_x + tri + gap + tw + pad_x, y + th + 2 * pad_y) + _rounded(draw, box, radius=(th + 2 * pad_y) // 2, + fill=WHITE, outline=CHIP_BORDER, width=2) + cy = y + (th + 2 * pad_y) / 2 + tx = x + pad_x + draw.polygon( + [(tx, cy - tri / 2), (tx, cy + tri / 2), (tx + tri * 0.9, cy)], + fill=ORANGE_DEEP, + ) + draw.text((tx + tri + gap, y + pad_y), text, font=font, fill=INK_SOFT) + return box[2] + + +def _format_duration(seconds): + if not seconds: + return None + minutes = max(1, round(seconds / 60)) + return f"{minutes} min" + + +def _lesson_type_label(lesson_type): + return { + "three_words_lesson": "Vocabulary", + "topic": "Conversation", + "situation": "Conversation", + }.get(lesson_type) + + +def render_card(view): + """Render the OG card for a lesson view dict and return a PIL Image.""" + img = Image.new("RGB", (WIDTH, HEIGHT), BG_TOP) + # Vertical cream→amber gradient. + top, bottom = BG_TOP, BG_BOTTOM + for y in range(HEIGHT): + t = y / HEIGHT + img.paste( + tuple(round(top[i] + (bottom[i] - top[i]) * t) for i in range(3)), + (0, y, WIDTH, y + 1), + ) + draw = ImageDraw.Draw(img) + + # Left brand accent bar. + draw.rectangle((0, 0, 12, HEIGHT), fill=ORANGE) + + # --- Header: logo + wordmark (left), language pill (right) --- + logo_size = 92 + try: + logo = Image.open(_LOGO_PATH).convert("RGBA").resize((logo_size, logo_size)) + img.paste(logo, (MARGIN, MARGIN), logo) + except OSError: + logo = None + wordmark_font = _font("ExtraBold", 44) + wm_x = MARGIN + logo_size + 24 + wm_y = MARGIN + (logo_size - sum(wordmark_font.getmetrics())) // 2 + draw.text((wm_x, wm_y), "Zeeguu", font=wordmark_font, fill=ORANGE_DEEP) + + language = language_name(view.get("language_code")) + if language: + lang_font = _font("Bold", 32) + lw = _text_w(draw, language, lang_font) + _draw_chip(draw, WIDTH - MARGIN - lw - 44, MARGIN + 20, language, + lang_font, filled=True) + + # --- Title (vertically anchored in the middle band) --- + title = (view.get("title") or "Audio lesson").strip() + title_font = _font("Bold", 62) + title_lines = _wrap(draw, title, title_font, WIDTH - 2 * MARGIN, max_lines=2) + line_h = sum(title_font.getmetrics()) + 12 + title_y = MARGIN + logo_size + 60 + for i, line in enumerate(title_lines): + draw.text((MARGIN, title_y + i * line_h), line, font=title_font, fill=INK) + + # --- Meta chips: duration · CEFR · type --- + chips_y = title_y + len(title_lines) * line_h + 36 + chip_font = _font("SemiBold", 30) + cursor = MARGIN + duration = _format_duration(view.get("duration_seconds")) + if duration: + cursor = _play_chip(draw, cursor, chips_y, duration, chip_font) + 16 + cefr = view.get("cefr_level") + if cefr: + cursor = _draw_chip(draw, cursor, chips_y, cefr, chip_font, filled=True) + 16 + type_label = _lesson_type_label(view.get("lesson_type")) + if type_label: + cursor = _draw_chip(draw, cursor, chips_y, type_label, chip_font, filled=False) + + # --- Footer: the words being learned, else a tagline --- + words = [w.get("origin") for w in (view.get("words") or []) if w.get("origin")] + footer_font = _font("SemiBold", 30) + if words: + footer = " · ".join(words[:5]) + footer = _wrap(draw, footer, footer_font, WIDTH - 2 * MARGIN, max_lines=1)[0] + else: + footer = "Listen, and pick up the words" + draw.text((MARGIN, HEIGHT - MARGIN - sum(footer_font.getmetrics())), + footer, font=footer_font, fill=INK_SOFT) + + # Bottom-right domain. + dom_font = _font("Bold", 28) + dom = "zeeguu.org" + draw.text((WIDTH - MARGIN - _text_w(draw, dom, dom_font), + HEIGHT - MARGIN - sum(dom_font.getmetrics())), + dom, font=dom_font, fill=ORANGE_DEEP) + + return img + + +def card_png_bytes(view): + from io import BytesIO + + buffer = BytesIO() + render_card(view).save(buffer, format="PNG") + return buffer.getvalue() + + +def cached_card_path(data_folder, lesson_id): + return os.path.join(data_folder, "og-images", "shared-lessons", f"{lesson_id}.png") + + +def ensure_cached_card(view, data_folder): + """Render (once) and cache the card PNG for this lesson; return its path. + + Lessons are immutable, so an existing file is reused. Returns None if the + view has no lesson_id to key the cache on. + """ + lesson_id = view.get("lesson_id") + if not lesson_id: + return None + path = cached_card_path(data_folder, lesson_id) + if not os.path.exists(path): + os.makedirs(os.path.dirname(path), exist_ok=True) + render_card(view).save(path, format="PNG") + return path diff --git a/zeeguu/core/model/daily_audio_lesson.py b/zeeguu/core/model/daily_audio_lesson.py index bd7a4bed..0e67cc02 100644 --- a/zeeguu/core/model/daily_audio_lesson.py +++ b/zeeguu/core/model/daily_audio_lesson.py @@ -187,6 +187,34 @@ def display_title(self): ] return ", ".join(origins) if origins else None + def cefr_level(self): + """ + CEFR level this lesson was generated for (e.g. "A1", "B2"), or None. + + Like display_title(), this is the single source of truth used by every + lesson response. The level isn't stored on the lesson itself; it lives + on each segment's content (AudioLessonDialogue / AudioLessonMeaning, + column difficulty_level). Dialogue lessons (topic/situation) have a + single segment, so it's unambiguous. Word lessons have one segment per + word, and those can disagree: a meaning's audio row is cached and reused + across users, so a word may carry the level it was first generated at + rather than this user's level. We therefore return the most common level + across segments, which tracks the user's generation level (ties resolve + to the first segment encountered). + """ + from collections import Counter + + levels = [] + for segment in self.segments: + if segment.segment_type == "dialogue_lesson" and segment.audio_lesson_dialogue: + levels.append(segment.audio_lesson_dialogue.difficulty_level) + elif segment.segment_type == "meaning_lesson" and segment.audio_lesson_meaning: + levels.append(segment.audio_lesson_meaning.difficulty_level) + levels = [level for level in levels if level] + if not levels: + return None + return Counter(levels).most_common(1)[0][0] + def ensure_share_uuid(self): if not self.share_uuid: self.share_uuid = str(uuid.uuid4()) From 0b8fbd69e6237646775f5fc8f7128f694a5b60e5 Mon Sep 17 00:00:00 2001 From: Mircea Lungu Date: Wed, 27 May 2026 10:06:32 +0200 Subject: [PATCH 2/2] Move brand assets to zeeguu/assets; reuse Language names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review follow-ups: - The logo + Montserrat fonts are generic brand assets, not audio-specific. Promote them from core/audio_lessons/assets to a top-level zeeguu/assets/ (images/ + fonts/) so the article-card follow-up can share them. og_image anchors paths on the package root. - Drop og_image's hardcoded language code→name dict; it duplicated Language.LANGUAGE_NAMES. The shared view now carries language_name (from lesson.language.name), so og_image stays DB-decoupled and mapping-free. Co-Authored-By: Claude Opus 4.7 (1M context) --- MANIFEST.in | 3 ++- zeeguu/api/endpoints/audio_lessons.py | 2 +- .../assets/fonts/Montserrat-Bold.ttf | Bin .../assets/fonts/Montserrat-ExtraBold.ttf | Bin .../assets/fonts/Montserrat-Regular.ttf | Bin .../assets/fonts/Montserrat-SemiBold.ttf | Bin .../assets => assets/images}/zeeguu-logo.png | Bin .../audio_lessons/daily_lesson_generator.py | 1 + zeeguu/core/audio_lessons/og_image.py | 20 ++++-------------- 9 files changed, 8 insertions(+), 18 deletions(-) rename zeeguu/{core/audio_lessons => }/assets/fonts/Montserrat-Bold.ttf (100%) rename zeeguu/{core/audio_lessons => }/assets/fonts/Montserrat-ExtraBold.ttf (100%) rename zeeguu/{core/audio_lessons => }/assets/fonts/Montserrat-Regular.ttf (100%) rename zeeguu/{core/audio_lessons => }/assets/fonts/Montserrat-SemiBold.ttf (100%) rename zeeguu/{core/audio_lessons/assets => assets/images}/zeeguu-logo.png (100%) diff --git a/MANIFEST.in b/MANIFEST.in index d0a413a0..ace499b4 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1,2 @@ -recursive-include ./zeeguu/core/sql/queries/ *.sql \ No newline at end of file +recursive-include ./zeeguu/core/sql/queries/ *.sql +recursive-include zeeguu/assets *.ttf *.png diff --git a/zeeguu/api/endpoints/audio_lessons.py b/zeeguu/api/endpoints/audio_lessons.py index 83484a4d..4b9fb2fb 100644 --- a/zeeguu/api/endpoints/audio_lessons.py +++ b/zeeguu/api/endpoints/audio_lessons.py @@ -195,7 +195,7 @@ def create_lesson_share_link(lesson_id): def _preview_texts(view): """Build the (page/OG title, description) for a shared lesson's link preview.""" title = (view.get("title") or "Audio lesson").strip() - language = og_image.language_name(view.get("language_code")) + language = view.get("language_name") cefr = view.get("cefr_level") lesson_type = view.get("lesson_type") words = [w.get("origin") for w in (view.get("words") or []) if w.get("origin")] diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-Bold.ttf b/zeeguu/assets/fonts/Montserrat-Bold.ttf similarity index 100% rename from zeeguu/core/audio_lessons/assets/fonts/Montserrat-Bold.ttf rename to zeeguu/assets/fonts/Montserrat-Bold.ttf diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-ExtraBold.ttf b/zeeguu/assets/fonts/Montserrat-ExtraBold.ttf similarity index 100% rename from zeeguu/core/audio_lessons/assets/fonts/Montserrat-ExtraBold.ttf rename to zeeguu/assets/fonts/Montserrat-ExtraBold.ttf diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-Regular.ttf b/zeeguu/assets/fonts/Montserrat-Regular.ttf similarity index 100% rename from zeeguu/core/audio_lessons/assets/fonts/Montserrat-Regular.ttf rename to zeeguu/assets/fonts/Montserrat-Regular.ttf diff --git a/zeeguu/core/audio_lessons/assets/fonts/Montserrat-SemiBold.ttf b/zeeguu/assets/fonts/Montserrat-SemiBold.ttf similarity index 100% rename from zeeguu/core/audio_lessons/assets/fonts/Montserrat-SemiBold.ttf rename to zeeguu/assets/fonts/Montserrat-SemiBold.ttf diff --git a/zeeguu/core/audio_lessons/assets/zeeguu-logo.png b/zeeguu/assets/images/zeeguu-logo.png similarity index 100% rename from zeeguu/core/audio_lessons/assets/zeeguu-logo.png rename to zeeguu/assets/images/zeeguu-logo.png diff --git a/zeeguu/core/audio_lessons/daily_lesson_generator.py b/zeeguu/core/audio_lessons/daily_lesson_generator.py index f35d2d6c..7008af4d 100644 --- a/zeeguu/core/audio_lessons/daily_lesson_generator.py +++ b/zeeguu/core/audio_lessons/daily_lesson_generator.py @@ -633,6 +633,7 @@ def get_shared_lesson_view(self, share_uuid): "canonical_suggestion": lesson.canonical_suggestion, "lesson_type": lesson.lesson_type, "language_code": lesson.language.code if lesson.language else None, + "language_name": lesson.language.name if lesson.language else None, "title": lesson.display_title(), "cefr_level": lesson.cefr_level(), } diff --git a/zeeguu/core/audio_lessons/og_image.py b/zeeguu/core/audio_lessons/og_image.py index db341ded..9e4ab2e1 100644 --- a/zeeguu/core/audio_lessons/og_image.py +++ b/zeeguu/core/audio_lessons/og_image.py @@ -15,15 +15,16 @@ import os from functools import lru_cache +import zeeguu from PIL import Image, ImageDraw, ImageFont # 1.91:1 — the ratio every major scraper crops to. WIDTH, HEIGHT = 1200, 630 MARGIN = 70 -_ASSETS = os.path.join(os.path.dirname(__file__), "assets") +_ASSETS = os.path.join(os.path.dirname(zeeguu.__file__), "assets") _FONTS = os.path.join(_ASSETS, "fonts") -_LOGO_PATH = os.path.join(_ASSETS, "zeeguu-logo.png") +_LOGO_PATH = os.path.join(_ASSETS, "images", "zeeguu-logo.png") # Warm Zeeguu palette (mirrors web/src/components/colors.js). BG_TOP = (255, 248, 230) # cream @@ -35,19 +36,6 @@ CHIP_BORDER = (224, 190, 130) WHITE = (255, 255, 255) -_LANGUAGE_NAMES = { - "da": "Danish", "de": "German", "es": "Spanish", "fr": "French", - "nl": "Dutch", "en": "English", "it": "Italian", "pt": "Portuguese", - "ro": "Romanian", "sv": "Swedish", "no": "Norwegian", "pl": "Polish", - "ru": "Russian", "hu": "Hungarian", -} - - -def language_name(code): - if not code: - return None - return _LANGUAGE_NAMES.get(code.lower(), code.upper()) - @lru_cache(maxsize=None) def _font(weight, size): @@ -169,7 +157,7 @@ def render_card(view): wm_y = MARGIN + (logo_size - sum(wordmark_font.getmetrics())) // 2 draw.text((wm_x, wm_y), "Zeeguu", font=wordmark_font, fill=ORANGE_DEEP) - language = language_name(view.get("language_code")) + language = view.get("language_name") if language: lang_font = _font("Bold", 32) lw = _text_w(draw, language, lang_font)