Index | Thread | Search

From:
Chris Billington <emulti@disroot.org>
Subject:
update: audio/curseradio
To:
ports@openbsd.org
Date:
Wed, 17 Jun 2026 13:58:09 +0800

Download raw body.

Thread
  • Chris Billington:

    update: audio/curseradio

The present version of audio/curseradio is broken, due to the removal of 
http/https functionality in recent versions of libxml.

The attached patch makes it work again.

The Tunein OPML directory used (http://opml.radiotime.com) seems to be 
unmaintained, so there are dead links for a percentage of stations.

Chris

? curseradio.patch
Index: Makefile
===================================================================
RCS file: /cvs/ports/audio/curseradio/Makefile,v
diff -u -p -u -r1.14 Makefile
--- Makefile	29 Apr 2025 10:36:26 -0000	1.14
+++ Makefile	17 Jun 2026 05:18:38 -0000
@@ -2,7 +2,7 @@ MODPY_DISTV =	0.3
 COMMENT =	curses interface for browsing and playing radio streams
 DISTNAME =	curseradio-${MODPY_DISTV}pre20241222
 CATEGORIES =	audio
-REVISION =	0
+REVISION =	1
 
 GH_ACCOUNT =	elewarr
 GH_PROJECT =	curseradio
Index: patches/patch-curseradio_curseradio_py
===================================================================
RCS file: /cvs/ports/audio/curseradio/patches/patch-curseradio_curseradio_py,v
diff -u -p -u -r1.2 patch-curseradio_curseradio_py
--- patches/patch-curseradio_curseradio_py	11 Mar 2022 18:20:08 -0000	1.2
+++ patches/patch-curseradio_curseradio_py	17 Jun 2026 05:18:38 -0000
@@ -1,8 +1,14 @@
 Index: curseradio/curseradio.py
 --- curseradio/curseradio.py.orig
 +++ curseradio/curseradio.py
-@@ -30,7 +30,7 @@ import re
+@@ -26,11 +26,12 @@ import pathlib
+ import xdg.BaseDirectory
+ import configparser
+ import re
++from urllib.request import urlopen
++from io import BytesIO
  
+-
  CONFIG_DEFAULT = {
      'opml': {'root': "http://opml.radiotime.com/"},
 -    'playback': {'command': '/usr/bin/mpv'},
@@ -10,3 +16,16 @@ Index: curseradio/curseradio.py
      'interface': {'keymap': 'default'},
      'keymap.default': {
          'up': 'KEY_UP',
+@@ -61,7 +62,11 @@ class OPMLNode:
+         """
+         if attr is None: attr = {}
+         parser = lxml.etree.XMLParser(dtd_validation=False, no_network=False)
+-        tree = lxml.etree.parse(url, parser=parser)
++        if url.startswith(("http://", "https://")):
++            with urlopen(url) as f:
++                tree = lxml.etree.parse(BytesIO(f.read()), parser=parser)
++        else:
++            tree = lxml.etree.parse(url, parser=parser)
+         result = cls(text=text, attr=attr)
+         result.children = [OPMLNode.from_element(o)
+                            for o in tree.xpath('/opml/body/outline')]