Files
Tesi/peertube/statnerd/statistiche.ipynb
2024-03-23 15:08:02 +01:00

193 lines
6.2 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",
"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, display_html, 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(\"--window-size=1280,720\")\n",
" chrome_options.add_argument(\"--mute-audio\")\n",
" driver = webdriver.Chrome(options=chrome_options)\n",
" return driver"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9c6ed068",
"metadata": {},
"outputs": [],
"source": [
"def saveStats(stats):\n",
"\n",
" with open('stats.json', 'r+') as jsonFile:\n",
" try:\n",
" data = json.load(jsonFile)\n",
" except json.JSONDecodeError:\n",
" data = []\n",
" data.append(stats)\n",
" jsonFile.seek(0)\n",
" json.dump(data, jsonFile, indent=4)\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",
" statsList = 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",
" display_handle.update(statsList)\n",
"\n",
" saveStats(statsList)"
]
},
{
"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(1)\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/gFL48Fz3doCEnYwK46BwYN\")\n",
"\n",
" display_handle = display(\"Loading...\", display_id=True)\n",
" \n",
" schedule.every(0.3).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.11.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}