Skip to content

[plugin.video.ciscolive] 2.1.1#4750

Merged
romanvm merged 1 commit intoxbmc:omegafrom
martap79:plugin.video.ciscolive
Mar 7, 2026
Merged

[plugin.video.ciscolive] 2.1.1#4750
romanvm merged 1 commit intoxbmc:omegafrom
martap79:plugin.video.ciscolive

Conversation

@martap79
Copy link
Copy Markdown

@martap79 martap79 commented Feb 16, 2026

Cisco Live On-Demand v2.1.1

Browse and stream 14,000+ Cisco Live on-demand session recordings.

Changes from previous submission

  • Removed authentication requirement. All videos are freely accessible, no Cisco account needed.
  • Removed auth.py, login_server.py, and bundled qrcode library (~4,700 lines removed).
  • Simplified playback: direct Brightcove resolution only.

Features

  • 6,500+ sessions (2022-2026) + 8,400+ legacy (2018-2021)
  • Browse by Event with per-event counts
  • Multi-select filtering (Technology, Level, keyword)
  • Full-text search
  • Watch history
  • Wall view for TV remote navigation

Technical

  • RainFocus API with sections-based event browsing
  • Brightcove HLS/DASH/MP4 streaming via inputstream.adaptive
  • 6-hour response caching
  • Kodi 21+ (Omega)

Replaces #4746 (closed due to branch issue).

@kodiai
Copy link
Copy Markdown

kodiai Bot commented Feb 16, 2026

Kodiai Review Summary

What Changed

Major plugin rewrite removing authentication requirements and simplifying video playback. All 14,000+ videos are now freely accessible without Cisco account login. Removed ~4,700 lines including auth.py, login_server.py, and bundled qrcode library.

Reviewed: core logic, docs

Strengths

  • ✅ Clean separation of concerns with dedicated modules (rainfocus.py for API, brightcove.py for video resolution, history.py for watch tracking)
  • ✅ Proper caching implementation with 6-hour TTL reduces API load and improves performance (rainfocus.py:145-182)
  • ✅ Comprehensive input validation for pagination limits prevents API abuse (rainfocus.py:225-230, 348-349)

Observations

Impact

[CRITICAL] plugin.video.ciscolive/resources/lib/rainfocus.py (206-209): Unhandled RuntimeError crashes addon
The _api_post function catches network errors and re-raises as RuntimeError, but multiple callers (search_sessions:246, discover_event_sections:280-282, search_event_sessions:370, get_session:398) don't handle this exception. Network failures (timeouts, connection errors, DNS failures) will crash the addon instead of showing a user-friendly error message.

[MAJOR] plugin.video.ciscolive/resources/lib/brightcove.py (23, 32-34): Thread-unsafe global policy key caching
Global variable _POLICY_KEY at line 23 is accessed and modified without synchronization in _fetch_policy_key(). If multiple threads call best_stream() concurrently during startup (e.g., when Kodi pre-loads multiple list items), they could race to fetch and set the policy key, potentially causing duplicate network requests or inconsistent state.

[MAJOR] plugin.video.ciscolive/addon.py (726-736): Incomplete null check allows crash
Line 726 calls brightcove.best_stream() which can return (None, None) when video resolution fails. The null check at line 728 (if not stream_url) occurs after line 727 uses stream_url in a string operation check ("m3u8" in stream_url), but this is actually safe because line 728 is the first operation. However, the real issue is that the error notification and early return happen too late - if best_stream() returns None due to network error or invalid video ID, the user sees a generic error instead of specific failure reason.

Verdict

🔴 Address before merging -- 3 blocking issue(s) found (2 CRITICAL/MAJOR items under Impact could cause crashes in production)

Review Details
  • Files reviewed: 11
  • Lines changed: +1842 -0
  • Profile: minimal (auto, lines changed: 1842)
  • Author: first-time (adapted tone)
  • Findings: 1 critical, 2 major, 0 medium, 0 minor (includes 3 from summary observations)
  • Review completed: 2026-02-16T17:22:38.611Z
  • Keyword parsing:
    • focus hints: [PLUGIN.VIDEO.CISCOLIVE]

@martap79 martap79 force-pushed the plugin.video.ciscolive branch from 882f927 to 6ed2481 Compare February 16, 2026 17:29
@martap79 martap79 changed the title [plugin.video.ciscolive] 2.1.0 [plugin.video.ciscolive] 2.1.1 Feb 16, 2026
@martap79 martap79 marked this pull request as draft February 16, 2026 17:32
@martap79 martap79 force-pushed the plugin.video.ciscolive branch from 6ed2481 to a8d3041 Compare February 16, 2026 17:34
@martap79 martap79 marked this pull request as ready for review February 16, 2026 17:48
@kodiai
Copy link
Copy Markdown

kodiai Bot commented Feb 16, 2026

Kodiai Review Summary

What Changed

This PR introduces a Kodi video plugin for browsing and streaming 14,000+ Cisco Live sessions, removing authentication requirements and simplifying the codebase by removing ~4,700 lines of auth-related code.

Reviewed: core logic, docs

Strengths

  • ✅ Well-structured caching mechanism with 6-hour TTL reduces API load and improves performance (rainfocus.py:145-183)
  • ✅ Comprehensive error handling in video playback flow with user-friendly notifications (addon.py:726-738)
  • ✅ Thread-safe policy key fetching using threading.Lock prevents race conditions (brightcove.py:24-36)

Observations

Impact

[CRITICAL] plugin.video.ciscolive/resources/lib/rainfocus.py (208): Incomplete exception handling on API network calls
The urlopen() call only catches HTTPError and URLError, but doesn't handle other common network failures like timeout errors, SSL errors, or socket errors. This can cause the plugin to crash with unhandled exceptions when network conditions are poor or SSL certificate validation fails.

[MAJOR] plugin.video.ciscolive/resources/lib/brightcove.py (107): Missing URLError exception handling in video resolution
The urlopen() call on line 107 only catches HTTPError but not URLError, timeout errors, or other connection failures. When network connectivity is lost or DNS resolution fails, this will raise an unhandled exception that crashes video playback instead of gracefully showing an error to the user.

[MAJOR] plugin.video.ciscolive/resources/lib/rainfocus.py (146): Missing exception handling for cache directory creation
The os.makedirs(CACHE_DIR, exist_ok=True) call can fail with PermissionError or OSError if the user lacks filesystem permissions or the path is invalid. Since this is called from _cache_path() which is used by all caching operations, permission errors will cause crashes throughout the plugin instead of gracefully degrading to no-cache operation.

Verdict

🔴 Address before merging -- 3 blocking issue(s) found

Review Details
  • Files reviewed: 11
  • Lines changed: +1863 -0
  • Profile: minimal (auto, lines changed: 1863)
  • Author: first-time (adapted tone)
  • Findings: 1 critical, 2 major, 0 medium, 0 minor (includes 3 from summary observations)
  • Review completed: 2026-02-16T17:50:01.823Z
  • Keyword parsing:
    • focus hints: [PLUGIN.VIDEO.CISCOLIVE]

@martap79 martap79 force-pushed the plugin.video.ciscolive branch from a8d3041 to b79e3ee Compare February 16, 2026 18:01
@martap79
Copy link
Copy Markdown
Author

@kodiai review pls

Copy link
Copy Markdown

@kodiai kodiai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kodiai response

Decision: APPROVE

Issues: none

Copy link
Copy Markdown

@romanvm romanvm Mar 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the future I'd recommend to move all the logic from the addon entrypoint to an importable module, leaving only some small launch code. This will speed-up addon startup on lower-end systems. =

@romanvm romanvm merged commit 0f52dca into xbmc:omega Mar 7, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants