193 lines
6.2 KiB
Plaintext
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
|
|
}
|