From 7921b4283f97bde6a8ac346d8c412b3e83ce8fca Mon Sep 17 00:00:00 2001
From: hanfi <ccc@spahan.ch>
Date: Thu, 2 Jan 2025 21:13:30 +0100
Subject: [PATCH] add some python helpers

---
 c3devices/__init__.py                         |  10 +++++
 .../__pycache__/__init__.cpython-312.pyc      | Bin 0 -> 448 bytes
 c3devices/__pycache__/install.cpython-312.pyc | Bin 0 -> 2330 bytes
 c3devices/install.py                          |  36 ++++++++++++++++++
 4 files changed, 46 insertions(+)
 create mode 100644 c3devices/__init__.py
 create mode 100644 c3devices/__pycache__/__init__.cpython-312.pyc
 create mode 100644 c3devices/__pycache__/install.cpython-312.pyc
 create mode 100644 c3devices/install.py

diff --git a/c3devices/__init__.py b/c3devices/__init__.py
new file mode 100644
index 0000000..8634386
--- /dev/null
+++ b/c3devices/__init__.py
@@ -0,0 +1,10 @@
+from ppadb.device import Device
+from ppadb.client import Client as AdbClient
+from os import makedirs
+
+INVENTORY_PATH = './inventory'
+CACHE_PATH = './apps'
+
+_client = AdbClient()
+makedirs(INVENTORY_PATH, exist_ok=True)
+makedirs(CACHE_PATH, exist_ok=True)
diff --git a/c3devices/__pycache__/__init__.cpython-312.pyc b/c3devices/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f9eca224b983ab97cea5a3dac81adf12e67c4416
GIT binary patch
literal 448
zcmX@j%ge>Uz`*eRW^(#J1_p-5APx+(KpCIY7#J9)Go&!2Fy=7iGDa~ng4j$sOu5Wa
zEMPWs4r?x36dNN$3QH7w3TqSx6GJM?YN+-oP9}y_wp8{Mwl(alnIM9U3}7)1RIy49
zP0p7f1)7Yv*j!S}GLut5Ea#le)VvZ+##<b@iP@<snMK7_+<N+%d1a}2CHX~_Rcw0t
zi3J74As`j06`92)@%h<)nq0Sd3JMZalJru*1{E<gFfhP`lEEexfjoGN(=jCpV#6(_
z{Nf^3kTO0`zc5$75dWaa_yETck6T>Mj?Nyg5H@=}ME6RD&mgD%($UYz&rQ`YE=bHs
z%+pUchFDjO#EOs4%*!l^kJl@xyv1RYo1apelWJEa$iTqB$iTo*Y|OyG@PV0;k?}5r
z{9Oi}yA0wF1mzm|Zt#jWa6RM_?$&N#zsbPSA-6!~DuX(RB{d`E8iR5XKLY~;0CZ+|
AA^-pY

literal 0
HcmV?d00001

diff --git a/c3devices/__pycache__/install.cpython-312.pyc b/c3devices/__pycache__/install.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..40bb414e96938318ae19af24a859ff9cdb8d7b2c
GIT binary patch
literal 2330
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
HD6sheG9V3Y

literal 0
HcmV?d00001

diff --git a/c3devices/install.py b/c3devices/install.py
new file mode 100644
index 0000000..4a10106
--- /dev/null
+++ b/c3devices/install.py
@@ -0,0 +1,36 @@
+from . import _client, Device, CACHE_PATH
+from os.path import isfile
+from bs4 import BeautifulSoup
+import requests
+
+
+def _download_apk(package:str):
+  print("download", package)
+  response = requests.get(f"https://f-droid.org/en/packages/{package}/")
+  soup = BeautifulSoup(response.text, 'html.parser')
+  latest = soup.find(id="latest").find(class_="package-version-download").find("a")["href"]
+  print("downloading", latest, " ",end="")
+  with requests.get(latest, stream=True) as r:
+    r.raise_for_status()
+    with open(f"{CACHE_PATH}/{package}.apk", "wb") as f:
+      for chunk in r.iter_content(chunk_size=8192):
+        f.write(chunk)
+        print(".",end="")
+  print("")
+  print("downloaded", package)
+
+
+def install_packages(packages:list[str]=[], device: Device = None):
+  print(device.get_serial_no())
+  installed = device.list_packages()
+  for package in packages:
+    if not package in installed:
+      print('need install', package)
+      if not (isfile(f'{CACHE_PATH}/{package}.apk')):
+        _download_apk(package)
+      device.install(f'{CACHE_PATH}/{package}.apk')
+
+if __name__ == '__main__':
+  with open('packages.txt') as p:
+    for line in p:
+      print(line)
-- 
GitLab