Files
Tesi/peertube/statnerd/statistiche.ipynb
2024-09-03 22:51:33 +02:00

213 lines
7.4 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "27784c31-2579-4c9f-802a-de9b9e1471d1",
"metadata": {},
"source": [
"# Statistiche per Nerd homebrew"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5d3f30ae-baa7-4703-870f-921829fd8c34",
"metadata": {},
"outputs": [],
"source": [
"import schedule\n",
"import signal\n",
"import json\n",
"import time\n",
"import socket\n",
"from bs4 import BeautifulSoup as bs\n",
"from selenium import webdriver\n",
"from selenium.webdriver.chrome.options import Options\n",
"from selenium.webdriver.common.by import By\n",
"from selenium.webdriver import ActionChains\n",
"from selenium.webdriver.support.wait import WebDriverWait\n",
"from selenium.webdriver.support import expected_conditions as ec\n",
"from IPython.display import display, DisplayHandle, Image"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aa49216c",
"metadata": {},
"outputs": [],
"source": [
"def interrupt_handler(signum, driver: webdriver.Chrome):\n",
" print(f'Handling signal {signum} ({signal.Signals(signum).name}).')\n",
"\n",
" schedule.clear()\n",
" driver.quit()\n",
" %reset_selective -f driver\n",
" raise SystemExit"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "db04c5f7",
"metadata": {},
"outputs": [],
"source": [
"def setupChromeDriver():\n",
" chrome_options = Options()\n",
" chrome_options.add_argument(\"--headless\")\n",
" chrome_options.add_argument(\"--no-sandbox\")\n",
" chrome_options.add_argument(\"--mute-audio\")\n",
" chrome_options.add_argument(\"--window-size=1280,720\")\n",
" chrome_options.add_argument(\"--disable-dev-shm-usage\")\n",
" chrome_options.add_argument(\"--disable-features=WebRtcHideLocalIpsWithMdns\")\n",
" chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'en,en_US'})\n",
" #chrome_options.add_extension('./qryn-webrtc-exporter.crx')\n",
"\n",
" driver = webdriver.Chrome(options=chrome_options)\n",
" #driver = webdriver.Remote(command_executor='http://localhost:4444', options=chrome_options)\n",
" return driver"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9c6ed068",
"metadata": {},
"outputs": [],
"source": [
"def saveStats(stats: dict):\n",
" try:\n",
" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n",
" sock.sendto(json.dumps(stats).encode(), ('localhost', 8094))\n",
" sock.close()\n",
" except socket.error as e:\n",
" print(f'Got socket error: {e}')\n",
"\n",
"def downloadStats(driver: webdriver.Chrome, display_handle: DisplayHandle):\n",
" html = driver.find_element(By.CLASS_NAME ,'vjs-stats-list')\n",
" htmlBS = bs(html.get_attribute('innerHTML'), 'html.parser')\n",
"\n",
" timestampDiv = htmlBS.new_tag('div', attrs={'style': 'display: block;'})\n",
" timestampTitleDiv = htmlBS.new_tag('div')\n",
" timestampTitleDiv.string = 'Timestamp'\n",
" timestampDiv.append(timestampTitleDiv)\n",
" timestampSpan = htmlBS.new_tag('span')\n",
" timestampSpan.string = time.strftime('%Y-%m-%dT%H:%M:%S%z')\n",
" timestampDiv.append(timestampSpan)\n",
" htmlBS.div.insert_before(timestampDiv)\n",
"\n",
" peers = driver.find_element(By.CLASS_NAME ,'peers-number').text\n",
" peersDiv = htmlBS.new_tag('div', attrs={'style': 'display: block;'})\n",
" peersTitleDiv = htmlBS.new_tag('div')\n",
" peersTitleDiv.string = 'Peers'\n",
" peersDiv.append(peersTitleDiv)\n",
" peersSpan = htmlBS.new_tag('span')\n",
" peersSpan.string = peers\n",
" peersDiv.append(peersSpan)\n",
" htmlBS.div.insert_before(peersDiv)\n",
" \n",
" stats = htmlBS.find_all('div', attrs={'style': 'display: block;'})\n",
"\n",
" statsDict = {\n",
" stat.div.text: stat.span.text.replace('\\u21d3', 'down').replace('down/', 'down /').replace('\\u21d1 ', 'up').replace('\\u21d1', 'up').replace('\\u00b7', '-').strip()\n",
" for stat in stats\n",
" }\n",
" \n",
" for stat in statsDict:\n",
" if 'Buffer State' == stat:\n",
" statsDict[stat] = statsDict[stat][1:-1].split(', ')\n",
"\n",
" # statsDict = {\n",
" # 'userName': dict(\n",
" # map(\n",
" # lambda stat: (\n",
" # stat.div.text, \n",
" # stat.span.text.replace('\\u21d3', 'down').replace('down/', 'down /').replace('\\u21d1 ', 'up').replace('\\u21d1', 'up').replace('\\u00b7', '-').strip()\n",
" # ), stats\n",
" # )\n",
" # )\n",
" # }\n",
"\n",
" statsDict.update({'Timestamp': time.strftime('%Y-%m-%dT%H:%M:%S%z')})\n",
" statsDict['userName'] = 'user'\n",
"\n",
" display_handle.update(json.dumps(statsDict))\n",
"\n",
" saveStats(statsDict)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a812fea1-55f9-4c5d-87d6-d884df5ed1ba",
"metadata": {},
"outputs": [],
"source": [
"def setupStats(driver: webdriver.Chrome, url: str):\n",
" actions = ActionChains(driver)\n",
" wait = WebDriverWait(driver, 30, poll_frequency=0.2)\n",
"\n",
" driver.get(url)\n",
"\n",
" wait.until(ec.presence_of_element_located((By.CLASS_NAME, 'vjs-big-play-button')))\n",
" actions.click(driver.find_element(By.CLASS_NAME ,'video-js')).perform()\n",
" actions.context_click(driver.find_element(By.CLASS_NAME ,'video-js')).perform()\n",
" statsForNerds = driver.find_elements(By.CLASS_NAME ,'vjs-menu-item')\n",
" actions.pause(2)\n",
" actions.click(statsForNerds[-1]).perform()\n",
" wait.until(ec.text_to_be_present_in_element((By.CLASS_NAME, 'vjs-stats-list'), 'Player'))\n",
" actions.move_to_element(driver.find_element(By.CLASS_NAME ,'vjs-peertube')).perform()\n",
"\n",
" display(Image(driver.get_screenshot_as_png()))\n",
"\n",
" return driver"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "221fa21b-aaf4-493f-b344-2d1a86c85c64",
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"if __name__ == '__main__':\n",
" driver = setupChromeDriver()\n",
"\n",
" signal.signal(signal.SIGINT, lambda signum, frame: interrupt_handler(signum, driver))\n",
" \n",
" setupStats(driver, \"https://tube.kobim.cloud/w/9hAbiwai4rsbw9QnPpPkCd\")\n",
"\n",
" display_handle = display(\"Loading...\", display_id=True)\n",
" \n",
" schedule.every(1).seconds.do(downloadStats, driver, display_handle)\n",
" while True:\n",
" schedule.run_pending()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}