Skip to content

Commit b42b9e8

Browse files
authored
Option to get widevine from lacros image (#558)
* Get Widevine for ARM Linux from Lacros image, if libzstd is available * Move repo specific code into repo.py * Fix/Improve tests
1 parent 8fa0c0a commit b42b9e8

File tree

16 files changed

+726
-95
lines changed

16 files changed

+726
-95
lines changed

.github/workflows/ci.yml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,20 @@ jobs:
4343
continue-on-error: true
4444
- name: Start proxy server
4545
run: python -m proxy --threaded --hostname 127.0.0.1 --log-level DEBUG &
46-
- name: Run unit tests
47-
run: coverage run -m unittest discover
46+
- name: Run unit tests for API
47+
run: coverage run -m unittest tests/test_api.py
48+
- name: Run unit tests for Android ARM
49+
run: coverage run -m unittest tests/test_ishelper_android_arm.py
50+
- name: Run unit tests for Linux ARM
51+
run: coverage run -m unittest tests/test_ishelper_linux_arm.py
52+
- name: Run unit tests for Linux x64
53+
run: coverage run -m unittest tests/test_ishelper_linux_x64.py
54+
- name: Run unit tests for MacOS x64
55+
run: coverage run -m unittest tests/test_ishelper_macos_x64.py
56+
- name: Run unit tests for Windows x64
57+
run: coverage run -m unittest tests/test_ishelper_windows_x64.py
58+
- name: Run unit tests for proxy
59+
run: coverage run -m unittest tests/test_proxy.py
4860
- name: Run addon using cli
4961
run: coverage run -a default.py
5062
- name: Upload code coverage to CodeCov

lib/inputstreamhelper/__init__.py

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44

55
from __future__ import absolute_import, division, unicode_literals
66
import os
7+
import json
78

89
from . import config
910
from .kodiutils import (addon_version, browsesingle, delete, exists, get_proxies, get_setting, get_setting_bool, get_setting_float, get_setting_int, jsonrpc,
1011
kodi_to_ascii, kodi_version, listdir, localize, log, notification, ok_dialog, progress_dialog, select_dialog,
1112
set_setting, set_setting_bool, textviewer, translate_path, yesno_dialog)
1213
from .utils import arch, download_path, http_download, parse_version, remove_tree, store, system_os, temp_path, unzip, userspace64
13-
from .widevine.arm import dl_extract_widevine, extract_widevine, install_widevine_arm
14-
from .widevine.widevine import (backup_path, cdm_from_repo, choose_widevine_from_repo, has_widevinecdm, ia_cdm_path, install_cdm_from_backup, latest_widevine_available_from_repo,
15-
latest_widevine_version, load_widevine_config, missing_widevine_libs, widevines_available_from_repo, widevine_config_path, widevine_eula, widevinecdm_path)
14+
from .widevine.arm import dl_extract_widevine_chromeos, extract_widevine_chromeos, install_widevine_arm
15+
from .widevine.arm_lacros import cdm_from_lacros, latest_lacros
16+
from .widevine.widevine import (backup_path, has_widevinecdm, ia_cdm_path,
17+
install_cdm_from_backup, latest_widevine_version,
18+
load_widevine_config, missing_widevine_libs, widevine_config_path,
19+
widevine_eula, widevinecdm_path)
20+
from .widevine.repo import cdm_from_repo, choose_widevine_from_repo, latest_widevine_available_from_repo
1621
from .unicodes import compat_path
1722

1823
# NOTE: Work around issue caused by platform still using os.popen()
@@ -179,6 +184,10 @@ def _install_widevine_from_repo(bpath, choose_version=False):
179184
cdm = choose_widevine_from_repo()
180185
else:
181186
cdm = latest_widevine_available_from_repo()
187+
188+
if not cdm:
189+
return cdm
190+
182191
cdm_version = cdm.get('version')
183192

184193
if not exists(download_path(cdm.get('url'))):
@@ -243,7 +252,7 @@ def install_widevine(self, choose_version=False):
243252
def install_widevine_from(self):
244253
"""Install Widevine from a given URL or file."""
245254
if yesno_dialog(None, localize(30066)): # download resource with widevine from url? no means specify local
246-
result = dl_extract_widevine(get_setting("image_url"), backup_path())
255+
result = dl_extract_widevine_chromeos(get_setting("image_url"), backup_path())
247256
if not result:
248257
return result
249258

@@ -256,7 +265,7 @@ def install_widevine_from(self):
256265
return False
257266

258267
image_version = os.path.basename(image_path).split("_")[1]
259-
progress = extract_widevine(backup_path(), image_path, image_version)
268+
progress = extract_widevine_chromeos(backup_path(), image_path, image_version)
260269
if not progress:
261270
return False
262271

@@ -293,6 +302,29 @@ def _first_run():
293302
return True
294303
return False
295304

305+
@staticmethod
306+
def get_current_wv():
307+
"""Returns which component is used (widevine/chromeos/lacros) and the current version"""
308+
wv_config = load_widevine_config()
309+
component = 'Widevine CDM'
310+
current_version = '0'
311+
312+
if not wv_config:
313+
log(3, 'Widevine config missing. Could not determine current version, forcing update.')
314+
elif cdm_from_repo():
315+
current_version = wv_config['version']
316+
elif cdm_from_lacros():
317+
component = 'Lacros image'
318+
try:
319+
current_version = wv_config['img_version'] # if lib was installed from chromeos image, there is no img_version
320+
except KeyError:
321+
pass
322+
else:
323+
component = 'Chrome OS'
324+
current_version = wv_config['version']
325+
326+
return component, current_version
327+
296328
def _update_widevine(self):
297329
"""Prompts user to upgrade Widevine CDM when a newer version is available."""
298330
from time import localtime, strftime, time
@@ -308,21 +340,9 @@ def _update_widevine(self):
308340
log(2, 'Widevine update check was made on {date}', date=strftime('%Y-%m-%d %H:%M', localtime(last_check)))
309341
return
310342

311-
wv_config = load_widevine_config()
312-
if not wv_config:
313-
log(3, 'Widevine config missing. Could not determine current version, forcing update.')
314-
current_version = '0'
315-
elif cdm_from_repo():
316-
component = 'Widevine CDM'
317-
current_version = wv_config['version']
318-
latest_version = latest_widevine_available_from_repo().get('version')
319-
else:
320-
component = 'Chrome OS'
321-
current_version = wv_config['version']
322-
latest_version = latest_widevine_version()
323-
if not latest_version:
324-
log(3, 'Updating Widevine CDM failed. Could not determine latest version.')
325-
return
343+
component, current_version = self.get_current_wv()
344+
345+
latest_version = latest_widevine_version()
326346

327347
log(0, 'Latest {component} version is {version}', component=component, version=latest_version)
328348
log(0, 'Current {component} version installed is {version}', component=component, version=current_version)
@@ -459,9 +479,11 @@ def info_dialog(self):
459479
else:
460480
wv_updated = 'Never'
461481
text += localize(30821, version=self._get_lib_version(widevinecdm_path()), date=wv_updated) + '\n'
462-
if arch() == 'arm' or arch() == 'arm64' and system_os() != 'Darwin': # Chrome OS version
482+
if not cdm_from_repo():
463483
wv_cfg = load_widevine_config()
464-
if wv_cfg:
484+
if wv_cfg and cdm_from_lacros(): # Lacros image version
485+
text += localize(30825, image="Lacros", version=wv_cfg['img_version']) + '\n'
486+
elif wv_cfg: # Chrome OS version
465487
text += localize(30822, name=wv_cfg['hwidmatch'].split()[0].lstrip('^'), version=wv_cfg['version']) + '\n'
466488
if get_setting_float('last_check', 0.0):
467489
wv_check = strftime('%Y-%m-%d %H:%M', localtime(get_setting_float('last_check', 0.0)))
@@ -487,7 +509,11 @@ def rollback_libwv(self):
487509
notification(localize(30004), localize(30041))
488510
return
489511

490-
installed_version = load_widevine_config()['version']
512+
try:
513+
installed_version = load_widevine_config()['img_version']
514+
except KeyError:
515+
installed_version = load_widevine_config()['version']
516+
491517
del versions[versions.index(installed_version)]
492518

493519
if cdm_from_repo():

lib/inputstreamhelper/config.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,16 @@
102102
'trogdor',
103103
]
104104

105+
CHROMEOS_BLOCK_SIZE = 512
106+
107+
LACROS_DOWNLOAD_URL = "https://gsdview.appspot.com/chromeos-localmirror/distfiles/chromeos-lacros-{arch}-squash-zstd-{version}"
108+
109+
LACROS_LATEST = "https://chromiumdash.appspot.com/fetch_releases?channel=Stable&platform=Lacros&num=1"
110+
105111
MINIMUM_INPUTSTREAM_VERSION_ARM64 = {
106112
'inputstream.adaptive': '20.3.5',
107113
}
108114

109-
CHROMEOS_BLOCK_SIZE = 512
110-
111115
HLS_MINIMUM_IA_VERSION = '2.0.10'
112116

113117
ISSUE_URL = 'https://github.com/emilsvennesson/script.module.inputstreamhelper/issues'

0 commit comments

Comments
 (0)