guix_mirror_bot pushed a commit to branch master
in repository guix.

commit 208f2c323029000d1f1ec371d795094abf7b78b4
Author: Liliana Marie Prikler <[email protected]>
AuthorDate: Mon Aug 4 09:23:27 2025 +0200

    gnu: komikku: Prepare for future servers.
    
    * gnu/packages/patches/komikku-future-servers-compat.patch: New file.
    * gnu/local.mk (dist_patch_DATA): Register it here.
    * gnu/packages/gnome.scm (komikku)[paatches]: Use it here.
    [#:phases]: Add ‘unpack-fonts’.
    [inputs]: Add font-0xpropo.
---
 gnu/local.mk                                       |   1 +
 gnu/packages/gnome.scm                             |  11 +-
 .../patches/komikku-future-servers-compat.patch    | 360 +++++++++++++++++++++
 3 files changed, 371 insertions(+), 1 deletion(-)

diff --git a/gnu/local.mk b/gnu/local.mk
index 1b927db355..e6a4624059 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1678,6 +1678,7 @@ dist_patch_DATA =                                         
\
   %D%/packages/patches/julia-SOURCE_DATE_EPOCH-mtime.patch     \
   %D%/packages/patches/julia-Use-MPFR-4.2.patch                        \
   %D%/packages/patches/komikku-python-3.11-compat.patch                        
\
+  %D%/packages/patches/komikku-future-servers-compat.patch                     
\
   %D%/packages/patches/libcall-ui-make-it-installable.patch    \
   
%D%/packages/patches/libcamera-ipa_manager-disable-signature-verification.patch 
     \
   %D%/packages/patches/libconfuse-CVE-2022-40320.patch         \
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index a45bb66441..3d609f97ac 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -13829,7 +13829,8 @@ profiler via Sysprof, debugging support, and more.")
        (sha256
         (base32
          "13mz3ijrmfh002pw977mzdnilgkfl0knr3xrxr0zdicx8nf7inr9"))
-       (patches (search-patches "komikku-python-3.11-compat.patch"))))
+       (patches (search-patches "komikku-python-3.11-compat.patch"
+                                "komikku-future-servers-compat.patch"))))
     (build-system meson-build-system)
     (arguments
      (list
@@ -13843,6 +13844,13 @@ profiler via Sysprof, debugging support, and more.")
                  ;; code following that line should migrate old databases
                  ;; but the line itself results in an import error
                  "return data_dir_path"))))
+          (add-after 'unpack 'unpack-fonts
+            (lambda* (#:key inputs #:allow-other-keys)
+              (mkdir-p "data/fonts")
+              (copy-file (search-input-file
+                          inputs
+                          "share/fonts/opentype/0xPropo-Medium.otf")
+                         "data/fonts/0xPropo-Medium.otf")))
           (add-after 'unpack 'skip-gtk-update-icon-cache
             (lambda _
               (substitute* "meson.build"
@@ -13860,6 +13868,7 @@ profiler via Sysprof, debugging support, and more.")
                   (,(getenv "GDK_PIXBUF_MODULE_FILE")))))))))
     (inputs
      (list bash-minimal
+           font-0xpropo
            gtk
            libadwaita
            libnotify
diff --git a/gnu/packages/patches/komikku-future-servers-compat.patch 
b/gnu/packages/patches/komikku-future-servers-compat.patch
new file mode 100644
index 0000000000..2131e81830
--- /dev/null
+++ b/gnu/packages/patches/komikku-future-servers-compat.patch
@@ -0,0 +1,360 @@
+This patch is a partial combination of the following upstream patches to make
+Komikku compatible with servers >= 1.79.0.
+
+https://codeberg.org/valos/Komikku/commit/311a8915d7fa80278979a6d80d75a5febef9f2c1
+https://codeberg.org/valos/Komikku/commit/6820caac4b1f3538b8ce6ed729c19c1f6f66ea7f
+
+diff --git a/data/info.febvre.Komikku.gresource.xml.in 
b/data/info.febvre.Komikku.gresource.xml.in
+index 87fe29f..8dca096 100644
+--- a/data/info.febvre.Komikku.gresource.xml.in
++++ b/data/info.febvre.Komikku.gresource.xml.in
+@@ -36,6 +36,9 @@
+         <!-- CSS -->
+         <file compressed="true" alias="style.css">css/style.css</file>
+ 
++        <!-- Fonts -->
++        <file compressed="true" 
alias="text-image.otf">fonts/0xPropo-Medium.otf</file>
++
+         <!-- Icons -->
+         <file compressed="true" preprocess="xml-stripblanks" 
alias="icons/scalable/apps/brush-symbolic.svg">icons/brush-symbolic.svg</file>
+         <file compressed="true" preprocess="xml-stripblanks" 
alias="icons/scalable/apps/computer-fail-symbolic.svg">icons/computer-fail-symbolic.svg</file>
+diff --git a/komikku/servers/__init__.py b/komikku/servers/__init__.py
+index ab73cff..8482ab2 100644
+--- a/komikku/servers/__init__.py
++++ b/komikku/servers/__init__.py
+@@ -44,6 +44,7 @@ LANGUAGES = dict(
+     eo='Espéranto',
+     es='Español',
+     es_419='Español (Latinoamérica)',
++    fa='فارسی',
+     fr='Français',
+     it='Italiano',
+     nl='Nederlands',
+diff --git a/komikku/servers/existentialcomics/__init__.py 
b/komikku/servers/existentialcomics/__init__.py
+index 1ecb85f..f1747bd 100644
+--- a/komikku/servers/existentialcomics/__init__.py
++++ b/komikku/servers/existentialcomics/__init__.py
+@@ -8,6 +8,7 @@ import textwrap
+ 
+ from komikku.servers import Server
+ from komikku.servers import USER_AGENT
++from komikku.servers.utils import TextImage
+ from komikku.utils import get_buffer_mime_type
+ 
+ 
+@@ -105,24 +106,26 @@ class Existentialcomics(Server):
+         """
+         if page.get('slug'):
+             r = self.session_get(self.image_url.format(page['slug']))
++            if r.status_code != 200:
++                return None
++
++            mime_type = get_buffer_mime_type(r.content)
++            if not mime_type.startswith('image'):
++                return None
++
+             name = page['slug']
++            content = r.content
+         else:
+-            r = self.session_get(
+-                'https://fakeimg.pl/1500x2126/ffffff/000000/',
+-                params=dict(
+-                    text='\n'.join(textwrap.wrap(page['text'], 25)),
+-                    font_size=64,
+-                    font='museo'
+-                )
+-            )
+-            name = '{0}-alt-text.png'.format(page['name'])
++            text = '\n'.join(textwrap.wrap(page['text'], 25))
++            image = TextImage(text)
+ 
+-        mime_type = get_buffer_mime_type(r.content)
+-        if not mime_type.startswith('image'):
+-            return None
++            mime_type = image.mime_type
++            name = f'{page["name"]}-alt-text.{image.format}'
++            print(name)
++            content = image.content
+ 
+         return dict(
+-            buffer=r.content,
++            buffer=content,
+             mime_type=mime_type,
+             name=name,
+         )
+diff --git a/komikku/servers/fosscomics/__init__.py 
b/komikku/servers/fosscomics/__init__.py
+index f77e13d..a3097e5 100644
+--- a/komikku/servers/fosscomics/__init__.py
++++ b/komikku/servers/fosscomics/__init__.py
+@@ -11,6 +11,7 @@ import requests
+ from komikku.servers import Server
+ from komikku.servers import USER_AGENT
+ from komikku.servers.utils import convert_date_string
++from komikku.servers.utils import TextImage
+ from komikku.utils import get_buffer_mime_type
+ 
+ 
+@@ -122,27 +123,25 @@ class Fosscomics(Server):
+ 
+         if page.get('image'):
+             r = self.session_get(self.image_url.format(chapter_slug, 
page['image']))
+-            name = f'{chapter_num:02d}_{page["index"]:02d}.png'  # noqa: E231
+-        else:
+-            r = self.session_get(
+-                'https://fakeimg.pl/1500x2126/ffffff/000000/',
+-                params=dict(
+-                    text='\n'.join(textwrap.wrap(page['text'], 40)),
+-                    font_size=64,
+-                    font='museo'
+-                )
+-            )
+-            name = 
f'{chapter_num:02d}_{page["index"]:02d}_text_{page["subindex"]:02d}.png'  # 
noqa: E231
++            if r.status_code != 200:
++                return None
+ 
+-        if r.status_code != 200:
+-            return None
++            mime_type = get_buffer_mime_type(r.content)
++            if not mime_type.startswith('image'):
++                return None
+ 
+-        mime_type = get_buffer_mime_type(r.content)
+-        if not mime_type.startswith('image'):
+-            return None
++            name = 
f'{chapter_num:02d}_{page["index"]:02d}.{mime_type.split("/")[-1]}'  # noqa: 
E231
++            content = r.content
++        else:
++            text = '\n'.join(textwrap.wrap(page['text'], 25))
++            image = TextImage(text)
++
++            mime_type = image.mime_type
++            name = 
f'{chapter_num:02d}_{page["index"]:02d}_text_{page["subindex"]:02d}.{image.format}'
  # noqa: E231
++            content = image.content
+ 
+         return dict(
+-            buffer=r.content,
++            buffer=content,
+             mime_type=mime_type,
+             name=name,
+         )
+diff --git a/komikku/servers/grisebouille/__init__.py 
b/komikku/servers/grisebouille/__init__.py
+index 49aa539..211fbb9 100644
+--- a/komikku/servers/grisebouille/__init__.py
++++ b/komikku/servers/grisebouille/__init__.py
+@@ -9,6 +9,7 @@ import textwrap
+ from komikku.servers import Server
+ from komikku.servers import USER_AGENT
+ from komikku.servers.utils import convert_date_string
++from komikku.servers.utils import TextImage
+ from komikku.utils import get_buffer_mime_type
+ 
+ 
+@@ -123,27 +124,22 @@ class Grisebouille(Server):
+             if r.status_code != 200:
+                 return None
+ 
+-            name = page['image'].split('/')[-1]
+-        else:
+-            r = self.session_get(
+-                'https://fakeimg.pl/1500x2126/ffffff/000000/',
+-                params=dict(
+-                    text='\n'.join(textwrap.wrap(page['text'], 25)),
+-                    font_size=64,
+-                    font='museo',
+-                )
+-            )
+-            if r.status_code != 200:
++            mime_type = get_buffer_mime_type(r.content)
++            if not mime_type.startswith('image'):
+                 return None
+ 
+-            name = 'txt_{0:03d}.png'.format(page['index'])
++            name = page['image'].split('/')[-1]
++            content = r.content
++        else:
++            text = '\n'.join(textwrap.wrap(page['text'], 25))
++            image = TextImage(text)
+ 
+-        mime_type = get_buffer_mime_type(r.content)
+-        if not mime_type.startswith('image'):
+-            return None
++            mime_type = image.mime_type
++            name = f'txt_{page["index"]:03d}.{image.format}'  # noqa: E231
++            content = image.content
+ 
+         return dict(
+-            buffer=r.content,
++            buffer=content,
+             mime_type=mime_type,
+             name=name,
+         )
+diff --git a/komikku/servers/multi/hiveworks/__init__.py 
b/komikku/servers/multi/hiveworks/__init__.py
+index a0bb405..ec9d955 100644
+--- a/komikku/servers/multi/hiveworks/__init__.py
++++ b/komikku/servers/multi/hiveworks/__init__.py
+@@ -17,6 +17,7 @@ import textwrap
+ from komikku.servers import Server
+ from komikku.servers import USER_AGENT
+ from komikku.servers.utils import convert_date_string
++from komikku.servers.utils import TextImage
+ from komikku.utils import get_buffer_mime_type
+ 
+ 
+@@ -112,27 +113,25 @@ class Hiveworks(Server):
+         """Returns chapter page scan (image) content"""
+         if page.get('image'):
+             r = self.session_get(self.image_url.format(page['image']))
++            if r.status_code != 200:
++                return None
++
++            mime_type = get_buffer_mime_type(r.content)
++            if not mime_type.startswith('image'):
++                return None
++
+             name = page['image']
++            content = r.content
+         else:
+-            r = self.session_get(
+-                'https://fakeimg.pl/1500x2126/ffffff/000000/',
+-                params=dict(
+-                    text='\n'.join(textwrap.wrap(page['text'], 25)),
+-                    font_size=64,
+-                    font='museo'
+-                )
+-            )
+-            name = '{0}-alt-text.png'.format(chapter_slug)
+-
+-        if r.status_code != 200:
+-            return None
++            text = '\n'.join(textwrap.wrap(page['text'], 25))
++            image = TextImage(text)
+ 
+-        mime_type = get_buffer_mime_type(r.content)
+-        if not mime_type.startswith('image'):
+-            return None
++            mime_type = image.mime_type
++            name = f'{chapter_slug}-alt-text.{image.format}'
++            content = image.content
+ 
+         return dict(
+-            buffer=r.content,
++            buffer=content,
+             mime_type=mime_type,
+             name=name,
+         )
+diff --git a/komikku/servers/utils.py b/komikku/servers/utils.py
+index cf898fc..9fb2139 100644
+--- a/komikku/servers/utils.py
++++ b/komikku/servers/utils.py
+@@ -23,15 +23,54 @@ from bs4 import BeautifulSoup
+ from bs4 import NavigableString
+ import dateparser
+ import emoji
++from gi.repository import Gio
+ from PIL import Image
++from PIL import ImageDraw
++from PIL import ImageFont
+ import requests
+ 
+ from komikku.servers.loader import ServerFinder
+ from komikku.utils import get_cached_logos_dir
+ 
+ logger = logging.getLogger(__name__)
+ 
+ 
++class TextImage:
++    def __init__(self, text, width=1500, height=2126, bg_color='#fff', 
fg_color='#000', font_size=64, format='webp'):
++        self.format = format
++        self.image = Image.new('RGB', (width, height), bg_color)
++
++        if text is None:
++            text = ''
++
++        rfont = 
Gio.resources_lookup_data('/info/febvre/Komikku/text-image.otf', 
Gio.ResourceLookupFlags.NONE)
++        font = ImageFont.truetype(BytesIO(rfont.get_data()), font_size)
++
++        draw = ImageDraw.Draw(self.image)
++        if '\n' in text:
++            left, top, right, bottom = draw.multiline_textbbox((0, 0), text, 
font, font_size=font_size)
++        else:
++            left, top, right, bottom = draw.textbbox((0, 0), text, font, 
font_size=font_size)
++
++        text_width = right - left
++        text_height = bottom - top
++        text_coord = ((width - text_width) // 2, (height - text_height) // 2)
++
++        draw.multiline_text(text_coord, text, fill=fg_color, font=font, 
align='center')
++        del draw
++
++    @property
++    def content(self):
++        buf = BytesIO()
++        self.image.save(buf, self.format.upper())
++
++        return buf.getvalue()
++
++    @property
++    def mime_type(self):
++        return f'image/{self.format}'
++
++
+ def convert_date_string(date_string, format=None, languages=None):
+     """
+     Convert a date string into a date object
+diff --git a/komikku/servers/xkcd/__init__.py 
b/komikku/servers/xkcd/__init__.py
+index 3445884..0eaeb5e 100644
+--- a/komikku/servers/xkcd/__init__.py
++++ b/komikku/servers/xkcd/__init__.py
+@@ -9,6 +9,7 @@ import textwrap
+ from komikku.servers import Server
+ from komikku.servers import USER_AGENT
+ from komikku.servers.utils import convert_date_string
++from komikku.servers.utils import TextImage
+ from komikku.utils import get_buffer_mime_type
+ 
+ 
+@@ -108,27 +109,25 @@ class Xkcd(Server):
+         """
+         if page.get('image'):
+             r = self.session_get(self.image_url.format(page['image']))
++            if r.status_code != 200:
++                return None
++
++            mime_type = get_buffer_mime_type(r.content)
++            if not mime_type.startswith('image'):
++                return None
++
+             name = page['image']
++            content = r.content
+         else:
+-            r = self.session_get(
+-                'https://fakeimg.pl/1500x2126/ffffff/000000/',
+-                params=dict(
+-                    text='\n'.join(textwrap.wrap(page['text'], 25)),
+-                    font_size=64,
+-                    font='museo'
+-                )
+-            )
+-            name = '{0}-alt-text.png'.format(chapter_slug)
+-
+-        if r.status_code != 200:
+-            return None
++            text = '\n'.join(textwrap.wrap(page['text'], 25))
++            image = TextImage(text)
+ 
+-        mime_type = get_buffer_mime_type(r.content)
+-        if not mime_type.startswith('image'):
+-            return None
++            mime_type = image.mime_type
++            name = f'{chapter_slug}-alt-text.{image.format}'
++            content = image.content
+ 
+         return dict(
+-            buffer=r.content,
++            buffer=content,
+             mime_type=mime_type,
+             name=name,
+         )
+--
+libgit2 1.5.2
+

Reply via email to