Merge pull request #17 from PiratesIRC/claude/merge-pagination-fix-with-v0.6.0b-01GdAHdP7Hr9wKGc1d8XsZDB

Merge pagination fixes from PR #16 into v0.6.0b, thanks @wdmitchelluk
This commit is contained in:
Pirates IRC
2025-11-28 10:57:12 -06:00
committed by GitHub

View File

@@ -1691,13 +1691,30 @@ class Plugin:
all_groups = [] all_groups = []
page = 1 page = 1
while True: while True:
try:
api_groups = self._get_api_data(f"/api/channels/groups/?page={page}", token, settings, logger) api_groups = self._get_api_data(f"/api/channels/groups/?page={page}", token, settings, logger)
except Exception as e:
# If we get an error (e.g., 404 for non-existent page), we've reached the end
if page > 1:
logger.info(f"[Stream-Mapparr] No more group pages available (attempted page {page})")
break
else:
# If error on first page, re-raise
raise
if isinstance(api_groups, dict) and 'results' in api_groups: if isinstance(api_groups, dict) and 'results' in api_groups:
all_groups.extend(api_groups['results']) results = api_groups['results']
if not results:
logger.info("[Stream-Mapparr] Reached last page of groups (empty results)")
break
all_groups.extend(results)
if not api_groups.get('next'): if not api_groups.get('next'):
break break
page += 1 page += 1
elif isinstance(api_groups, list): elif isinstance(api_groups, list):
if not api_groups:
logger.info("[Stream-Mapparr] Reached last page of groups (empty results)")
break
all_groups.extend(api_groups) all_groups.extend(api_groups)
break break
else: else:
@@ -2000,15 +2017,34 @@ class Plugin:
all_groups = [] all_groups = []
page = 1 page = 1
while True: while True:
try:
api_groups = self._get_api_data(f"/api/channels/groups/?page={page}", token, settings, logger, limiter=limiter) api_groups = self._get_api_data(f"/api/channels/groups/?page={page}", token, settings, logger, limiter=limiter)
except Exception as e:
# If we get an error (e.g., 404 for non-existent page), we've reached the end
if page > 1:
logger.info(f"[Stream-Mapparr] No more group pages available (attempted page {page})")
break
else:
# If error on first page, re-raise
raise
if isinstance(api_groups, dict) and 'results' in api_groups: if isinstance(api_groups, dict) and 'results' in api_groups:
all_groups.extend(api_groups['results']) results = api_groups['results']
if not api_groups.get('next'): break if not results:
logger.info("[Stream-Mapparr] Reached last page of groups (empty results)")
break
all_groups.extend(results)
if not api_groups.get('next'):
break
page += 1 page += 1
elif isinstance(api_groups, list): elif isinstance(api_groups, list):
if not api_groups:
logger.info("[Stream-Mapparr] Reached last page of groups (empty results)")
break
all_groups.extend(api_groups) all_groups.extend(api_groups)
break break
else: break else:
break
group_name_to_id = {g['name']: g['id'] for g in all_groups if 'name' in g and 'id' in g} group_name_to_id = {g['name']: g['id'] for g in all_groups if 'name' in g and 'id' in g}
@@ -2052,18 +2088,55 @@ class Plugin:
page = 1 page = 1
while True: while True:
endpoint = f"/api/channels/streams/?page={page}&page_size=100" endpoint = f"/api/channels/streams/?page={page}&page_size=100"
streams_response = self._get_api_data(endpoint, token, settings, logger, limiter=limiter)
try:
streams_response = self._get_api_data(endpoint, token, settings, logger, limiter=limiter)
except Exception as e:
# If we get an error (e.g., 404 for non-existent page), we've reached the end
if page > 1:
logger.info(f"[Stream-Mapparr] No more pages available (attempted page {page})")
break
else:
# If error on first page, re-raise
raise
# Handle both paginated and non-paginated responses
if isinstance(streams_response, dict) and 'results' in streams_response: if isinstance(streams_response, dict) and 'results' in streams_response:
results = streams_response['results'] results = streams_response['results']
# Check if we got empty results
if not results:
logger.info("[Stream-Mapparr] Reached last page of streams (empty results)")
break
all_streams_data.extend(results) all_streams_data.extend(results)
if not streams_response.get('next') or len(results) < 100: break logger.debug(f"[Stream-Mapparr] Fetched page {page}: {len(results)} streams (total so far: {len(all_streams_data)})")
# Stop if this page had fewer results than page_size (last page)
if len(results) < 100:
logger.info("[Stream-Mapparr] Reached last page of streams")
break
page += 1 page += 1
elif isinstance(streams_response, list): elif isinstance(streams_response, list):
# Check if we got empty results
if not streams_response:
logger.info("[Stream-Mapparr] Reached last page of streams (empty results)")
break
# List response - could still be paginated
all_streams_data.extend(streams_response) all_streams_data.extend(streams_response)
if len(streams_response) < 100: break logger.debug(f"[Stream-Mapparr] Fetched page {page}: {len(streams_response)} streams (total so far: {len(all_streams_data)})")
# If we got exactly 100 results, there might be more pages
if len(streams_response) == 100:
page += 1 page += 1
else: break else:
logger.info("[Stream-Mapparr] Reached last page of streams")
break
else:
logger.warning("[Stream-Mapparr] Unexpected streams response format")
break
self.loaded_channels = channels_to_process self.loaded_channels = channels_to_process
self.loaded_streams = all_streams_data self.loaded_streams = all_streams_data