diff --git a/plugins/limnoria/NtrPlaylist/plugin.py b/plugins/limnoria/NtrPlaylist/plugin.py index 8882f97..abc361a 100644 --- a/plugins/limnoria/NtrPlaylist/plugin.py +++ b/plugins/limnoria/NtrPlaylist/plugin.py @@ -94,7 +94,7 @@ def format_playlist(data: dict) -> str: for t in tracks: entry = f"{t.get('title', '')} by {t.get('artist', '')}" sep = ", " if parts else "" - if length + len(sep) + len(entry) + 4 > _MAX_IRC_LINE: # +4 for " ..." + if length + len(sep) + len(entry) + 5 > _MAX_IRC_LINE: # +5 for ", ..." parts.append("...") break parts.append(entry) diff --git a/plugins/sopel/ntr_playlist.py b/plugins/sopel/ntr_playlist.py index b3998ed..704acee 100644 --- a/plugins/sopel/ntr_playlist.py +++ b/plugins/sopel/ntr_playlist.py @@ -104,7 +104,7 @@ def format_playlist(data: dict) -> str: for t in tracks: entry = f"{t.get('title', '')} by {t.get('artist', '')}" sep = ", " if parts else "" - if length + len(sep) + len(entry) + 4 > _MAX_IRC_LINE: # +4 for " ..." + if length + len(sep) + len(entry) + 5 > _MAX_IRC_LINE: # +5 for ", ..." parts.append("...") break parts.append(entry) @@ -175,12 +175,14 @@ def ntr_playlist(bot, trigger): try: data = _api_get(base_url, f"/shows/by-episode/{episode}") except ApiError as e: + LOGGER.warning("API error for !playlist: %s", e) bot.say(e.detail) return else: try: data = _api_get(base_url, "/playlist") except ApiError as e: + LOGGER.warning("API error for !playlist: %s", e) bot.say(e.detail) return bot.say(format_playlist(data)) @@ -192,6 +194,7 @@ def ntr_status(bot, trigger): try: data = _api_get(base_url, "/health") except ApiError as e: + LOGGER.warning("API error for !status: %s", e) bot.say(e.detail) return status = data.get("status", "unknown") @@ -214,6 +217,7 @@ def ntr_refresh(bot, trigger): try: data = _api_post(base_url, "/admin/refresh", token) except ApiError as e: + LOGGER.warning("API error for !refresh: %s", e) bot.say(f"Refresh failed: {e.detail}") return count = data.get("track_count", 0) diff --git a/tests/test_plugin_helpers.py b/tests/test_plugin_helpers.py index e891692..0ad7be5 100644 --- a/tests/test_plugin_helpers.py +++ b/tests/test_plugin_helpers.py @@ -90,9 +90,9 @@ def format_playlist(data: dict) -> str: parts: list[str] = [] length = len(prefix) for t in tracks: - entry = f"{t.get("title", "")} by {t.get("artist", "")}" + entry = f"{t.get('title', '')} by {t.get('artist', '')}" sep = ", " if parts else "" - if length + len(sep) + len(entry) + 4 > _MAX_IRC_LINE: + if length + len(sep) + len(entry) + 5 > _MAX_IRC_LINE: # +5 for ", ..." parts.append("...") break parts.append(entry) @@ -197,7 +197,7 @@ class TestFormatPlaylist: data = {"tracks": [{"title": "A", "artist": "B"}]} assert format_playlist(data).startswith("Episode ?") - def test_truncation(self): + def test_truncation_many_tracks(self): tracks = [ {"title": f"Track{i:03d} With A Longer Name", "artist": f"Artist{i:03d}"} for i in range(50) @@ -207,6 +207,15 @@ class TestFormatPlaylist: assert len(result) <= _MAX_IRC_LINE assert result.endswith("...") + def test_truncation_long_single_track(self): + tracks = [ + {"title": "A" * 200, "artist": "B" * 200}, + {"title": "Second", "artist": "Track"}, + ] + data = {"episode_number": 1, "tracks": tracks} + result = format_playlist(data) + assert len(result) <= _MAX_IRC_LINE + # --------------------------------------------------------------------------- # _api_get