From 084027b231f99a0d2ff746a85571188d01ad80d2 Mon Sep 17 00:00:00 2001 From: Salman Faris Date: Mon, 4 May 2026 11:07:31 +0530 Subject: [PATCH 01/15] Switch API base URL from v4 to v4.1 Updated all Screenly API endpoint URLs from /v4/ to /v4.1/. --- automated_quality_control.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index ed9de8b..460fac6 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -22,7 +22,7 @@ def get_ten_random_assets(): """ response = requests.get( - 'https://api.screenlyapp.com/v4/assets?select=id&type=in.("appweb","audio","edge-app","image","video","web")&status=in.("finished","processing")', + 'https://api.screenlyapp.com/v4.1/assets?select=id&type=in.("appweb","audio","edge-app","image","video","web")&status=in.("finished","processing")', headers=REQUEST_HEADERS, ) response.raise_for_status() @@ -43,7 +43,7 @@ def get_screens() -> List[Dict[str, Any]]: Return a list of screens in the account. """ - response = requests.get('https://api.screenlyapp.com/v4/screens?select=id,name,hostname,status,in_sync&type=eq.hardware&is_enabled=eq.true', headers=REQUEST_HEADERS) + response = requests.get('https://api.screenlyapp.com/v4.1/screens?select=id,name,hostname,status,in_sync&type=eq.hardware&is_enabled=eq.true', headers=REQUEST_HEADERS) response.raise_for_status() return response.json() @@ -89,7 +89,7 @@ def get_qc_playlist_ids(): Get all playlists starting with 'PLAYLIST_PREFIX'. """ - response = requests.get("https://api.screenlyapp.com/v4/playlists", headers=REQUEST_HEADERS) + response = requests.get("https://api.screenlyapp.com/v4.1/playlists", headers=REQUEST_HEADERS) response.raise_for_status() qc_playlists = [] @@ -106,13 +106,13 @@ def delete_playlist(playlist_id): removed before the playlist itself can be deleted. """ items_response = requests.delete( - f"https://api.screenlyapp.com/v4/playlist-items?playlist_id=eq.{playlist_id}", + f"https://api.screenlyapp.com/v4.1/playlist-items?playlist_id=eq.{playlist_id}", headers=REQUEST_HEADERS, ) if not items_response.ok: return False response = requests.delete( - f"https://api.screenlyapp.com/v4/playlists?id=eq.{playlist_id}", + f"https://api.screenlyapp.com/v4.1/playlists?id=eq.{playlist_id}", headers=REQUEST_HEADERS, ) return response.ok @@ -123,7 +123,7 @@ def get_all_screens_label_id(): Return the ID of the built-in 'all-screens' label. """ response = requests.get( - "https://api.screenlyapp.com/v4/labels?type=eq.all-screens", + "https://api.screenlyapp.com/v4.1/labels?type=eq.all-screens", headers=REQUEST_HEADERS, ) response.raise_for_status() @@ -143,7 +143,7 @@ def add_asset_to_playlist(playlist_id, asset_id): "duration": 10, } response = requests.post( - "https://api.screenlyapp.com/v4/playlist-items", + "https://api.screenlyapp.com/v4.1/playlist-items", headers={**REQUEST_HEADERS, "Prefer": "return=representation"}, json=payload, ) @@ -161,7 +161,7 @@ def assign_playlist_to_all_screens(playlist_id): "playlist_id": playlist_id, } response = requests.post( - "https://api.screenlyapp.com/v4/labels/playlists", + "https://api.screenlyapp.com/v4.1/labels/playlists", headers={**REQUEST_HEADERS, "Prefer": "return=representation"}, json=payload, ) @@ -184,7 +184,7 @@ def create_qc_playlist(): } response = requests.post( - "https://api.screenlyapp.com/v4/playlists", + "https://api.screenlyapp.com/v4.1/playlists", headers={**REQUEST_HEADERS, "Prefer": "return=representation"}, json=payload, ) From 5b182c64a26bb206ed4aa84a92983f60dde9acf4 Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 9 Jun 2026 22:30:54 -0700 Subject: [PATCH 02/15] Update automated_quality_control.py --- automated_quality_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index 460fac6..6a62288 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -43,7 +43,7 @@ def get_screens() -> List[Dict[str, Any]]: Return a list of screens in the account. """ - response = requests.get('https://api.screenlyapp.com/v4.1/screens?select=id,name,hostname,status,in_sync&type=eq.hardware&is_enabled=eq.true', headers=REQUEST_HEADERS) + response = requests.get('https://api.screenlyapp.com/v4.1/screens?select=id,name,hostname,screen_statuses(status,in_sync)&type=eq.hardware&is_enabled=eq.true', headers=REQUEST_HEADERS) response.raise_for_status() return response.json() From a1afb318e139169fe7237d12263d5c838b524d4a Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Wed, 10 Jun 2026 07:28:31 -0700 Subject: [PATCH 03/15] Update docstrings to remove stale v4 version references --- automated_quality_control.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index 6a62288..5e2c817 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -102,7 +102,7 @@ def get_qc_playlist_ids(): def delete_playlist(playlist_id): """ - Delete a playlist and its items. In v4, playlist items must be + Delete a playlist and its items. Playlist items must be removed before the playlist itself can be deleted. """ items_response = requests.delete( @@ -135,7 +135,7 @@ def get_all_screens_label_id(): def add_asset_to_playlist(playlist_id, asset_id): """ - Add a single asset to a playlist via the v4 playlist-items endpoint. + Add a single asset to a playlist via the playlist-items endpoint. """ payload = { "playlist_id": playlist_id, From ed78a8face505c1f21499f1f4023e809e1b174a6 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Wed, 10 Jun 2026 07:50:26 -0700 Subject: [PATCH 04/15] Add temporary debug step to check Screenly API auth --- .../workflows/automated-quality-control.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/automated-quality-control.yml b/.github/workflows/automated-quality-control.yml index 69b6d7b..de70e46 100644 --- a/.github/workflows/automated-quality-control.yml +++ b/.github/workflows/automated-quality-control.yml @@ -18,6 +18,26 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt + - name: Screenly API whoami + env: + SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} + API_BASE_URL: ${{ vars.API_BASE_URL }} + run: | + set -euo pipefail + current_user=$( + curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ + "${API_BASE_URL}/api/v4.1/users" \ + | jq -r '.[0] | "\(.first_name) \(.last_name) <\(.email)>"' + ) + echo "Current user: ${current_user}" + current_team=$( + curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ + "${API_BASE_URL}/api/v4.1/teams" \ + | jq -r '.[] | select(.is_current == true) + | "\(.name) (\(.domain))"' + ) + echo "Current team: ${current_team}" + - name: Run automated QC script env: SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} From fc8b6c5c140977fe6bfa0247ecd2e91d6e1f6155 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Wed, 10 Jun 2026 07:56:05 -0700 Subject: [PATCH 05/15] Fall back to https://api.screenlyapp.com if API_BASE_URL is unset --- .github/workflows/automated-quality-control.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/automated-quality-control.yml b/.github/workflows/automated-quality-control.yml index de70e46..41ba7cb 100644 --- a/.github/workflows/automated-quality-control.yml +++ b/.github/workflows/automated-quality-control.yml @@ -24,6 +24,7 @@ jobs: API_BASE_URL: ${{ vars.API_BASE_URL }} run: | set -euo pipefail + API_BASE_URL="${API_BASE_URL:-https://api.screenlyapp.com}" current_user=$( curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ "${API_BASE_URL}/api/v4.1/users" \ From eeb87ec203e435e742b118491229fba76b0c1be5 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Wed, 10 Jun 2026 08:00:42 -0700 Subject: [PATCH 06/15] Remove temporary Screenly API whoami debug step --- .../workflows/automated-quality-control.yml | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/.github/workflows/automated-quality-control.yml b/.github/workflows/automated-quality-control.yml index 41ba7cb..69b6d7b 100644 --- a/.github/workflows/automated-quality-control.yml +++ b/.github/workflows/automated-quality-control.yml @@ -18,27 +18,6 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt - - name: Screenly API whoami - env: - SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} - API_BASE_URL: ${{ vars.API_BASE_URL }} - run: | - set -euo pipefail - API_BASE_URL="${API_BASE_URL:-https://api.screenlyapp.com}" - current_user=$( - curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ - "${API_BASE_URL}/api/v4.1/users" \ - | jq -r '.[0] | "\(.first_name) \(.last_name) <\(.email)>"' - ) - echo "Current user: ${current_user}" - current_team=$( - curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ - "${API_BASE_URL}/api/v4.1/teams" \ - | jq -r '.[] | select(.is_current == true) - | "\(.name) (\(.domain))"' - ) - echo "Current team: ${current_team}" - - name: Run automated QC script env: SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} From 743f3f12addf05f59cadc1ad2ba9fcc31701f24e Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 09:19:54 -0700 Subject: [PATCH 07/15] Fix KeyError by accessing nested screen_statuses fields --- automated_quality_control.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index 5e2c817..ef23134 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -64,10 +64,10 @@ def wait_for_screens_to_sync(): print(f"Unable to fetch screens: {error}") sys.exit(1) - screens_not_in_sync = [screen for screen in screens if not screen['in_sync']] + screens_not_in_sync = [screen for screen in screens if not screen['screen_statuses']['in_sync']] - offline_screens = [s for s in screens_not_in_sync if s['status'].lower() == 'offline'] - out_of_sync_screens = [s for s in screens_not_in_sync if s['status'].lower() != 'offline'] + offline_screens = [s for s in screens_not_in_sync if s['screen_statuses']['status'].lower() == 'offline'] + out_of_sync_screens = [s for s in screens_not_in_sync if s['screen_statuses']['status'].lower() != 'offline'] if offline_screens: print(f"Skipping {len(offline_screens)} offline screen(s) (cannot sync while unreachable):") @@ -79,7 +79,7 @@ def wait_for_screens_to_sync(): print(f"...waiting for {len(out_of_sync_screens)} screen(s) to sync:") for screen in out_of_sync_screens: - print(f" OUT OF SYNC: {screen['name']}({screen['hostname']}) — {screen['status'].lower()}") + print(f" OUT OF SYNC: {screen['name']}({screen['hostname']}) — {screen['screen_statuses']['status'].lower()}") raise AssertionError("Not all online screens synchronized") @@ -243,14 +243,14 @@ def main(): print(f"Warning: {error}. Fetching final screen status...") try: final_screens = get_screens() - not_synced = [s for s in final_screens if not s['in_sync']] - offline = [s for s in not_synced if s['status'].lower() == 'offline'] - out_of_sync = [s for s in not_synced if s['status'].lower() != 'offline'] + not_synced = [s for s in final_screens if not s['screen_statuses']['in_sync']] + offline = [s for s in not_synced if s['screen_statuses']['status'].lower() == 'offline'] + out_of_sync = [s for s in not_synced if s['screen_statuses']['status'].lower() != 'offline'] print(f"Final status: {len(offline)} offline, {len(out_of_sync)} out of sync after timeout:") for s in offline: print(f" OFFLINE: {s['name']}({s['hostname']})") for s in out_of_sync: - print(f" OUT OF SYNC: {s['name']}({s['hostname']}) — {s['status'].lower()}") + print(f" OUT OF SYNC: {s['name']}({s['hostname']}) — {s['screen_statuses']['status'].lower()}") except Exception as fetch_error: print(f"Could not fetch final screen status: {fetch_error}") From 1d414e09034b0f1f0877a8822186af10a30f61c4 Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 09:47:23 -0700 Subject: [PATCH 08/15] Add temporary debug step to check Screenly API auth --- .../workflows/automated-quality-control.yml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/automated-quality-control.yml b/.github/workflows/automated-quality-control.yml index 69b6d7b..4554c45 100644 --- a/.github/workflows/automated-quality-control.yml +++ b/.github/workflows/automated-quality-control.yml @@ -18,6 +18,27 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt + - name: Screenly API whoami + env: + SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} + API_BASE_URL: ${{ vars.API_BASE_URL }} + run: | + set -euo pipefail + API_BASE_URL="${API_BASE_URL:-https://api.screenlyapp.com}" + current_user=$( + curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ + "${API_BASE_URL}/api/v4.1/users" \ + | jq -r '.[0] | "\(.first_name) \(.last_name) <\(.email)>"' + ) + echo "Current user: ${current_user}" + current_team=$( + curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ + "${API_BASE_URL}/api/v4.1/teams" \ + | jq -r '.[] | select(.is_current == true) + | "\(.name) (\(.domain)) — role: \(.role), permissions: \(.permissions)"' + ) + echo "Current team: ${current_team}" + - name: Run automated QC script env: SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} From f5c5b60c998c320b896d32ec624c02540e90169d Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 09:58:08 -0700 Subject: [PATCH 09/15] Remove temporary Screenly API whoami debug step --- .../workflows/automated-quality-control.yml | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/.github/workflows/automated-quality-control.yml b/.github/workflows/automated-quality-control.yml index 4554c45..69b6d7b 100644 --- a/.github/workflows/automated-quality-control.yml +++ b/.github/workflows/automated-quality-control.yml @@ -18,27 +18,6 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt - - name: Screenly API whoami - env: - SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} - API_BASE_URL: ${{ vars.API_BASE_URL }} - run: | - set -euo pipefail - API_BASE_URL="${API_BASE_URL:-https://api.screenlyapp.com}" - current_user=$( - curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ - "${API_BASE_URL}/api/v4.1/users" \ - | jq -r '.[0] | "\(.first_name) \(.last_name) <\(.email)>"' - ) - echo "Current user: ${current_user}" - current_team=$( - curl -fsSL -H "Authorization: Token ${SCREENLY_API_TOKEN}" \ - "${API_BASE_URL}/api/v4.1/teams" \ - | jq -r '.[] | select(.is_current == true) - | "\(.name) (\(.domain)) — role: \(.role), permissions: \(.permissions)"' - ) - echo "Current team: ${current_team}" - - name: Run automated QC script env: SCREENLY_API_TOKEN: ${{ secrets.SCREENLY_API_TOKEN }} From 9ea8d86f80598d84d87abaef66c80b9faf0175ba Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 10:55:21 -0700 Subject: [PATCH 10/15] Refactor screen_statuses field access to use local variables --- automated_quality_control.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index ef23134..a8a2537 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -66,8 +66,14 @@ def wait_for_screens_to_sync(): screens_not_in_sync = [screen for screen in screens if not screen['screen_statuses']['in_sync']] - offline_screens = [s for s in screens_not_in_sync if s['screen_statuses']['status'].lower() == 'offline'] - out_of_sync_screens = [s for s in screens_not_in_sync if s['screen_statuses']['status'].lower() != 'offline'] + offline_screens = [] + out_of_sync_screens = [] + for screen in screens_not_in_sync: + screen_statuses = screen['screen_statuses'] + if screen_statuses['status'].lower() == 'offline': + offline_screens.append(screen) + else: + out_of_sync_screens.append(screen) if offline_screens: print(f"Skipping {len(offline_screens)} offline screen(s) (cannot sync while unreachable):") @@ -79,7 +85,9 @@ def wait_for_screens_to_sync(): print(f"...waiting for {len(out_of_sync_screens)} screen(s) to sync:") for screen in out_of_sync_screens: - print(f" OUT OF SYNC: {screen['name']}({screen['hostname']}) — {screen['screen_statuses']['status'].lower()}") + screen_statuses = screen['screen_statuses'] + status = screen_statuses['status'].lower() + print(f" OUT OF SYNC: {screen['name']}({screen['hostname']}) — {status}") raise AssertionError("Not all online screens synchronized") @@ -243,14 +251,22 @@ def main(): print(f"Warning: {error}. Fetching final screen status...") try: final_screens = get_screens() - not_synced = [s for s in final_screens if not s['screen_statuses']['in_sync']] - offline = [s for s in not_synced if s['screen_statuses']['status'].lower() == 'offline'] - out_of_sync = [s for s in not_synced if s['screen_statuses']['status'].lower() != 'offline'] + not_synced = [screen for screen in final_screens if not screen['screen_statuses']['in_sync']] + offline = [] + out_of_sync = [] + for s in not_synced: + screen_statuses = s['screen_statuses'] + if screen_statuses['status'].lower() == 'offline': + offline.append(s) + else: + out_of_sync.append(s) print(f"Final status: {len(offline)} offline, {len(out_of_sync)} out of sync after timeout:") for s in offline: print(f" OFFLINE: {s['name']}({s['hostname']})") for s in out_of_sync: - print(f" OUT OF SYNC: {s['name']}({s['hostname']}) — {s['screen_statuses']['status'].lower()}") + screen_statuses = s['screen_statuses'] + status = screen_statuses['status'].lower() + print(f" OUT OF SYNC: {s['name']}({s['hostname']}) — {status}") except Exception as fetch_error: print(f"Could not fetch final screen status: {fetch_error}") From 1f166aa9cb60120d84c3a2c0095a2dec8043b31e Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 12:22:13 -0700 Subject: [PATCH 11/15] Address Copilot review comments in automated_quality_control.py --- automated_quality_control.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index a8a2537..934ce97 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -27,13 +27,14 @@ def get_ten_random_assets(): ) response.raise_for_status() - asset_count = len(response.json()) + assets = response.json() + asset_count = len(assets) # Pick 10 random assets asset_list = [] for i in range(10): random_index = random.randint(0, asset_count - 1) - asset_list.append(response.json()[random_index]["id"]) + asset_list.append(assets[random_index]["id"]) return asset_list @@ -64,13 +65,16 @@ def wait_for_screens_to_sync(): print(f"Unable to fetch screens: {error}") sys.exit(1) - screens_not_in_sync = [screen for screen in screens if not screen['screen_statuses']['in_sync']] + screens_not_in_sync = [ + screen for screen in screens + if not screen.get('screen_statuses', {}).get('in_sync', False) + ] offline_screens = [] out_of_sync_screens = [] for screen in screens_not_in_sync: - screen_statuses = screen['screen_statuses'] - if screen_statuses['status'].lower() == 'offline': + screen_statuses = screen.get('screen_statuses', {}) + if screen_statuses.get('status', '').lower() == 'offline': offline_screens.append(screen) else: out_of_sync_screens.append(screen) @@ -85,8 +89,8 @@ def wait_for_screens_to_sync(): print(f"...waiting for {len(out_of_sync_screens)} screen(s) to sync:") for screen in out_of_sync_screens: - screen_statuses = screen['screen_statuses'] - status = screen_statuses['status'].lower() + screen_statuses = screen.get('screen_statuses', {}) + status = screen_statuses.get('status', 'unknown').lower() print(f" OUT OF SYNC: {screen['name']}({screen['hostname']}) — {status}") raise AssertionError("Not all online screens synchronized") @@ -251,12 +255,15 @@ def main(): print(f"Warning: {error}. Fetching final screen status...") try: final_screens = get_screens() - not_synced = [screen for screen in final_screens if not screen['screen_statuses']['in_sync']] + not_synced = [ + screen for screen in final_screens + if not screen.get('screen_statuses', {}).get('in_sync', False) + ] offline = [] out_of_sync = [] for s in not_synced: - screen_statuses = s['screen_statuses'] - if screen_statuses['status'].lower() == 'offline': + screen_statuses = s.get('screen_statuses', {}) + if screen_statuses.get('status', '').lower() == 'offline': offline.append(s) else: out_of_sync.append(s) @@ -264,8 +271,8 @@ def main(): for s in offline: print(f" OFFLINE: {s['name']}({s['hostname']})") for s in out_of_sync: - screen_statuses = s['screen_statuses'] - status = screen_statuses['status'].lower() + screen_statuses = s.get('screen_statuses', {}) + status = screen_statuses.get('status', 'unknown').lower() print(f" OUT OF SYNC: {s['name']}({s['hostname']}) — {status}") except Exception as fetch_error: print(f"Could not fetch final screen status: {fetch_error}") From a383a03f6dc6164f68bca19d0e104b72c1a864bf Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 14:09:06 -0700 Subject: [PATCH 12/15] Add temporary retry logic to create_qc_playlist --- automated_quality_control.py | 1 + 1 file changed, 1 insertion(+) diff --git a/automated_quality_control.py b/automated_quality_control.py index 934ce97..9b369a9 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -180,6 +180,7 @@ def assign_playlist_to_all_screens(playlist_id): response.raise_for_status() +@retry(requests.HTTPError, tries=3, delay=5) def create_qc_playlist(): """ Create a new QC playlist, populate it with random assets, From c3e211e68d51ba5a5d2d1f73d01ec78dd749bde1 Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 14:16:10 -0700 Subject: [PATCH 13/15] Add temporary retry logic to create_qc_playlist --- automated_quality_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index 9b369a9..d3c118f 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -180,7 +180,7 @@ def assign_playlist_to_all_screens(playlist_id): response.raise_for_status() -@retry(requests.HTTPError, tries=3, delay=5) +@retry((requests.HTTPError,), tries=3, delay=5) def create_qc_playlist(): """ Create a new QC playlist, populate it with random assets, From ecad7e8095bab704431ec8721f70d3cfe2935ee7 Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 14:19:00 -0700 Subject: [PATCH 14/15] Add temporary retry logic to create_qc_playlist --- automated_quality_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index d3c118f..ec1c867 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -180,7 +180,7 @@ def assign_playlist_to_all_screens(playlist_id): response.raise_for_status() -@retry((requests.HTTPError,), tries=3, delay=5) +@retry((requests.HTTPError,), tries=20, delay=5) def create_qc_playlist(): """ Create a new QC playlist, populate it with random assets, From 0424f1c4331a6722b6b28fd11cba2496a80310b0 Mon Sep 17 00:00:00 2001 From: Nico Miguelino Date: Tue, 16 Jun 2026 14:27:04 -0700 Subject: [PATCH 15/15] Revert temporary retry logic from create_qc_playlist --- automated_quality_control.py | 1 - 1 file changed, 1 deletion(-) diff --git a/automated_quality_control.py b/automated_quality_control.py index ec1c867..934ce97 100644 --- a/automated_quality_control.py +++ b/automated_quality_control.py @@ -180,7 +180,6 @@ def assign_playlist_to_all_screens(playlist_id): response.raise_for_status() -@retry((requests.HTTPError,), tries=20, delay=5) def create_qc_playlist(): """ Create a new QC playlist, populate it with random assets,