Python can process data from an HLS (.m3u8) video stream, such as the one used on the Fălticeni webcam page (which loads the stream through index.m3u8).

Python tutorials with source code, examples, guides, and tips and tricks for Windows and Linux development.

pip install manim
...
Successfully installed audioop-lts-0.2.2 av-16.1.0 cloup-3.0.8 glcontext-3.0.0 isosurfaces-0.1.2 manim-0.20.1 manimpango-0.6.1 mapbox-earcut-2.0.0 moderngl-5.12.0 moderngl-window-3.1.1 pycairo-1.29.0 pydub-0.25.1 pyglet-2.1.13 pyglm-2.8.3 screeninfo-0.8.1 skia-pathops-0.9.2 srt-3.5.3import subprocess
import sys
import datetime
log_file = "upgrade_log.txt"
def log(msg):
with open(log_file, "a", encoding="utf-8") as f:
f.write(msg + "\n")
print(msg)
def get_installed_packages():
result = subprocess.run(
[sys.executable, "-m", "pip", "list", "--format=freeze"],
capture_output=True,
text=True
)
lines = result.stdout.strip().split("\n")
packages = []
for line in lines:
if "@" in line: # skip direct URL installs
pkg = line.split("@")[0]
else:
pkg = line.split("==")[0]
packages.append(pkg)
return sorted(packages)
def upgrade_package(package):
log(f"\n=== Updating: {package} ===")
try:
subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", package])
log(f"[OK] Updated: {package}")
except subprocess.CalledProcessError:
log(f"[FAILED] Could not update: {package}")
def main():
log(f"\n--- Upgrade started at {datetime.datetime.now()} ---\n")
packages = get_installed_packages()
log(f"Found {len(packages)} packages.\n")
for pkg in packages:
upgrade_package(pkg)
log(f"\n--- Upgrade finished at {datetime.datetime.now()} ---\n")
if __name__ == "__main__":
main()python -m pip install build123d
Collecting build123d
Downloading build123d-0.10.0-py3-none-any.whl.metadata (6.7 kB)
...
Successfully installed anytree-2.13.0 asttokens-3.0.1 build123d-0.10.0 cadquery-ocp-7.8.1.1.post1 cadquery_ocp_proxy-7.9.3.1 cadquery_vtk-9.3.1 decorator-5.2.1 executing-2.2.1 ezdxf-1.4.3 ipython-9.10.0 ipython-pygments-lexers-1.1.1 lib3mf-2.5.0 matplotlib-inline-0.2.1 ocp_gordon-0.2.0 ocpsvg-0.5.0 pure-eval-0.2.3 stack_data-0.6.3 svgelements-1.9.6 svgpathtools-1.7.2 traitlets-5.14.3 trianglesolver-1.2 webcolors-24.8.0
import os
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QUrl
import py3Dmol
SEROTONIN_SMILES = "C1=CC2=C(C=C1)C(=CN2)CCN"
def generate_html(smiles):
view = py3Dmol.view(width=800, height=600)
view.addModel(smiles, "smiles")
view.setStyle({"stick": {}})
view.zoomTo()
return view._make_html()
class MoleculeViewer(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Structura 3D – Serotonină")
layout = QVBoxLayout(self)
self.browser = QWebEngineView()
html = generate_html(SEROTONIN_SMILES)
# IMPORTANT: QUrl, nu string!
self.browser.setHtml(html, baseUrl=QUrl("https://localhost/"))
layout.addWidget(self.browser)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MoleculeViewer()
window.resize(900, 700)
window.show()
sys.exit(app.exec())


C:\Python313_64bit>python
Python 3.13.0 (tags/v3.13.0:60403a5, Oct 7 2024, 09:38:07) [MSC v.1941 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import sys
(r-search `os') import os


import time
import sys
import logging
import argparse
import msvcrt # Windows keyboard input
from rich.console import Console
from rich.table import Table
from rich.panel import Panel
from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn
from rich.syntax import Syntax
from rich.layout import Layout
from rich.live import Live
from rich.theme import Theme
from rich.logging import RichHandler
# ---------------------------------------------------------
# 1. DARK THEME
# ---------------------------------------------------------
dark_theme = Theme({
"info": "bold cyan",
"warning": "bold yellow",
"error": "bold red",
"success": "bold green",
"title": "bold magenta",
"data": "bold white",
})
console = Console(theme=dark_theme)
# ---------------------------------------------------------
# 2. LOGGING (RichHandler)
# ---------------------------------------------------------
logging.basicConfig(
level="INFO",
format="%(message)s",
datefmt="[%H:%M:%S]",
handlers=[RichHandler(console=console)]
)
log = logging.getLogger("CLI")
# ---------------------------------------------------------
# 3. CLI ARGUMENTS
# ---------------------------------------------------------
def parse_args():
parser = argparse.ArgumentParser(
description="Rich CLI + Dashboard + Menu + Buttons"
)
parser.add_argument("--demo", action="store_true", help="Run the demo")
parser.add_argument("--dashboard", action="store_true", help="Start the dashboard")
return parser.parse_args()
# ---------------------------------------------------------
# 4. WINDOWS KEY READER
# ---------------------------------------------------------
def get_key():
if msvcrt.kbhit():
return msvcrt.getch().decode(errors="ignore")
return None
# ---------------------------------------------------------
# 5. MENU + BUTTONS
# ---------------------------------------------------------
menu_items = ["Statistics", "Processes", "Settings", "Exit"]
selected = 0
def render_menu():
table = Table(show_header=False, expand=True)
for i, item in enumerate(menu_items):
if i == selected:
table.add_row(f"[black on cyan] {item} [/]")
else:
table.add_row(f"[cyan] {item} [/]")
return Panel(table, title="Menu", border_style="cyan")
def render_content():
if menu_items[selected] == "Statistics":
return Panel("CPU: 37%\nRAM: 62%\nDisk: 128MB/s", title="System Statistics")
elif menu_items[selected] == "Processes":
return Panel("proc1\nproc2\nproc3", title="Running Processes")
elif menu_items[selected] == "Settings":
return Panel("Settings will appear here", title="Settings")
elif menu_items[selected] == "Exit":
return Panel("[red]Press ENTER to exit[/red]", title="Exit")
# ---------------------------------------------------------
# 6. DASHBOARD LAYOUT (original + menu added)
# ---------------------------------------------------------
def build_dashboard():
layout = Layout()
layout.split(
Layout(name="header", size=3),
Layout(name="body", ratio=1),
Layout(name="footer", size=3),
)
layout["body"].split_row(
Layout(name="left", size=30),
Layout(name="right")
)
layout["header"].update(
Panel("[title]LIVE DASHBOARD — Rich Dark Mode[/title]", style="bold magenta")
)
layout["left"].update(render_menu())
layout["right"].update(render_content())
layout["footer"].update(
Panel("[info]Status: Running in real time[/info]")
)
return layout
# ---------------------------------------------------------
# 7. DEMO (unchanged from first script)
# ---------------------------------------------------------
def run_demo():
console.print("[success]Rich Dark Mode Demo Started[/success]")
table = Table(title="Example Table", expand=True)
table.add_column("ID", style="yellow")
table.add_column("Name", style="cyan")
table.add_column("Status", style="green")
table.add_row("1", "Catalin", "Active")
table.add_row("2", "Rich CLI", "OK")
table.add_row("3", "Dashboard", "Ready")
console.print(table)
log.info("This is an INFO message")
log.warning("This is a WARNING message")
log.error("This is an ERROR message")
with Progress(
SpinnerColumn(),
BarColumn(),
TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
console=console,
) as progress:
task = progress.add_task("Processing...", total=100)
for _ in range(100):
time.sleep(0.02)
progress.update(task, advance=1)
code = """
def greet(name):
return f"Hello, {name}!"
print(greet("Catalin"))
"""
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(Panel(syntax, title="Syntax Highlight"))
# ---------------------------------------------------------
# 8. MAIN LOOP
# ---------------------------------------------------------
if __name__ == "__main__":
args = parse_args()
if args.demo:
run_demo()
if args.dashboard:
with Live(build_dashboard(), refresh_per_second=10) as live:
while True:
key = get_key()
if key == "w":
selected = (selected - 1) % len(menu_items)
elif key == "s":
selected = (selected + 1) % len(menu_items)
elif key == "\r":
if menu_items[selected] == "Exit":
break
live.update(build_dashboard())