# 1️⃣ Vypnout USB autosuspend (stabilizuje Realtek čtečku)
sudo sh -c 'echo -1 > /sys/module/usbcore/parameters/autosuspend'
cat /sys/module/usbcore/parameters/autosuspend # ověření, mělo by být -1
# 2️⃣ Sleduj USB zařízení, aby ses ujistil, že čtečka zůstává aktivní
watch -n1 lsusb
IT pomocník
sobota 7. března 2026
Problém s připojením sd karty - co zabralo (detekce usb zařízení)
neděle 1. února 2026
Jede jede vláček kolejáček (TS) noty
Auth:ST
1c, 2c(-2), 3a, 4a(-2), 1G, 2G, 3c, 4H
(úvodní markery #FF0000 jako c treble, pak a treble, G open)
1a, 2a, 3G, 4G, 1G(-2), 2c, 3d, 4d
(A picked, G open opakovaně, C pressed, D stisk + picked)
1G, 2G, 3G, 4G+c, 1G(-2), 2a, 3G, 4G
(G open, akord G+c, pak A pressed, G open)
1c, 2γ, 3γ(-2), 4H, 1γ, 2a, 3a(-2)
(C pick, γ pressed, pustil a opět stiskl, H open, a pressed)
1d, 2a, 3a(-2), 4d, 1d(-2), 2G, 3C, 4E
(D pressed, a pressed, d pouští, G bass, C bass, E bass)
1G, 2H, 3d, 4a+d, 1G, 2d, 3H, 4E
(Open G, H picked, chord a+d, bass G, bass H, E bass)
1D, 2F, 3d, 4a, 1d(-2), 2c, 3a, 4a
(Bass D, bass F, chord d+a, d pustil, c pressed, nota a treble)
1c, 2H, 3a, 4a, 1a(-2), 2G, 3G, 4c
(C treble, H pick, a treble, pustil a, treble G pressed, c pick)
1d, 2G, 3G, 4G, 1G, 2G, 3G, 4G
(D pressed, open G opakovaně)
1G, 2G, 3G, 4a+d, 1a, 2d, 3f, 4c
(Treble G opakovaně, chord a+d, d picked, f pressed, c picked)
1d, 2c, 3G+c+E, 4C+E+c+γ(-4)
(D pressed, c pressed, basová melodie G+C,E, závěrečný akord s vibratem)/ / / S časy / / /
~7.2 s
1c, 2c(-2), 3a, 4a(-2), 1G, 2G, 3c, 4H
~10.4 s
1a, 2a, 3G, 4G, 1G(-2), 2c, 3d, 4d
~14.1 s
1G, 2G, 3G, 4G+c, 1G(-2), 2a, 3G, 4G
~16.3 s
1c, 2γ, 3γ(-2), 4H, 1γ, 2a, 3a(-2)
~20.1 s
1d, 2a, 3a(-2), 4d, 1d(-2), 2G, 3C, 4E
~24.0 s
1G, 2H, 3d, 4a+d, 1G, 2d, 3H, 4E
~28.2 s
1D, 2F, 3d, 4a, 1d(-2), 2c, 3a, 4a
~32.3 s
1c, 2H, 3a, 4a, 1a(-2), 2G, 3G, 4c
~35.4 s
1d, 2G, 3G, 4G, 1G, 2G, 3G, 4G
~41.7 s – ~45.6 s
1G, 2G, 3G, 4a+d, 1a, 2d, 3f, 4c
~53.8 s – ~56.1 s
1d, 2c, 3G+c+E, 4C+E+c+γ(-4)
(basové outro + závěrečný dlouhý akord s vibratem)* * *VČETNĚ INFORMACÍ KDY STISKL A KDY PUSTIL:~07.2 s
1c+, 2c+, 3H, 4H, 1a+, 2a+, 3G+, 4G+
~09.6 s
1a-, 2a+, 3G-, 4c+, 1H, 2a+, 3a-, 4G+
~12.8 s
1G+, 2c+, 3c+, 4G+c, 1G-, 2a+, 3G+, 4G+
~16.3 s
1c-, 2d+, 3G+, 4G+, 1G+c, 2G+, 3c+, 4c(-2)
~19.2 s
1c+, 2d+, 3c-, 4c(-2), 1γ+, 2γ-, 3H, 4γ+
~22.4 s
1a+, 2a(-2), 3d+, 4a-, 1d(-2), 2a+, 3a(-2), 4d+
~26.1 s
1d-, 2d+, 3d-, 4F+, 1F-, 2c+, 3d+, 4d-
~28.4 s
1c+, 2c(-2), 3d-, 4G+, 1C+, 2E+, 3G, 4H
~30.3 s
1d+, 2a+d, 3G+, 4d, 1H, 2E, 3D, 4F
~33.6 s
1d+a, 2d-, 3c+, 4a, 1c(-2), 2H, 3a+, 4a
~36.4 s
1a-, 2G+, 3G, 4c, 1G, 2G, 3G, 4G+
~39.2 s
1a+, 2a-, 3G, 4G, 1G, 2G, 3G, 4c+
~42.3 s
1a+, 2a-, 3G+, 4G, 1c, 2d+, 3G+, 4G
~45.4 s
1G, 2G, 3G, 4G, 1c(-2), 2G+, 3G, 4G
~48.6 s
1G, 2G, 3G, 4a+d, 1a, 2d, 3f+, 4c+
~53.4 s
1d+, 2c+, 3d, 4c(-2), 1G+c+E, 2C+E+c+γ(-4)
(basové outro + dlouhý závěrečný akord s vibratem) První číslo je doba. Do závorky je délka trvání noty.
sobota 31. ledna 2026
Python script: Změna časů chainů a markerů mlt souboru pro zdrojové video 2x zrychlené
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
fix_times_one_script_fixed.py
Opravená verze — škáluje jen to, co se smí (bez double-scalingu a bez škálování length média)
"""
from xml.etree import ElementTree as ET
from pathlib import Path
from decimal import Decimal, getcontext, ROUND_HALF_UP
import re, shutil, sys
# ======= NASTAVENÍ =======
INPUT_FILE = Path("./Jede vlak.mlt")
OUTPUT_FILE = Path("./Jede vlak_fixed.mlt")
SCALE = Decimal("0.5") # 0.5 = polovina času
RESOURCE_FROM = "/1/" # nebo None
RESOURCE_TO = "/2/"
# ==================================================
getcontext().prec = 28
getcontext().rounding = ROUND_HALF_UP
TIME_RE = re.compile(r'^(?P<h>\d{2}):(?P<m>\d{2}):(?P<s>\d{2})(?:\.(?P<frac>\d+))?$')
def parse_time_to_decimal(text):
if text is None:
return None, 0
t = text.strip()
m = TIME_RE.match(t)
if not m:
return None, 0
h = int(m.group('h'))
mm = int(m.group('m'))
ss = int(m.group('s'))
frac = m.group('frac') or ""
frac_len = len(frac)
frac_dec = Decimal("0." + frac) if frac_len > 0 else Decimal(0)
total = Decimal(h)*3600 + Decimal(mm)*60 + Decimal(ss) + frac_dec
return total, frac_len
def format_decimal_seconds(total_seconds: Decimal, frac_len: int = 3):
if total_seconds < 0:
total_seconds = Decimal(0)
hours = int(total_seconds // 3600)
rem = total_seconds - Decimal(hours)*3600
minutes = int(rem // 60)
sec_dec = rem - Decimal(minutes)*60
if frac_len > 0:
q = Decimal(1).scaleb(-frac_len)
sec_q = sec_dec.quantize(q, rounding=ROUND_HALF_UP)
if sec_q >= 60:
sec_q -= 60
minutes += 1
if minutes >= 60:
minutes -= 60
hours += 1
frac_part = f"{sec_q - int(sec_q):.{frac_len}f}"[1:]
sec_str = f"{int(sec_q):02d}{frac_part}"
else:
sec_str = f"{int(sec_dec):02d}"
return f"{hours:02d}:{minutes:02d}:{sec_str}"
def scale_time_text(txt, scale):
total, frac_len = parse_time_to_decimal(txt)
if total is None:
return None
new_total = total * scale
target_frac = frac_len if frac_len > 0 else 3
return format_decimal_seconds(new_total, target_frac)
def backup_file(p: Path):
bak = p.with_suffix(p.suffix + ".bak")
if not bak.exists():
shutil.copy2(p, bak)
return bak
def main():
if not INPUT_FILE.exists():
print("Chyba: vstupní soubor nenalezen:", INPUT_FILE)
sys.exit(1)
xml = INPUT_FILE.read_text(encoding="utf-8")
root = ET.fromstring(xml)
counts = {"tractor":0, "chain_out":0, "playlist_entry":0, "markers":0, "resource_repl":0}
samples = []
# 1. playlist entry in/out
for playlist in root.findall(".//playlist"):
for entry in playlist.findall("entry"):
for a in ("in", "out"):
v = entry.get(a)
new = scale_time_text(v, SCALE) if v else None
if new:
entry.set(a, new)
counts["playlist_entry"] += 1
samples.append(("playlist_entry", entry.get("producer"), a, v, new))
# 2. tractor in/out
for tractor in root.findall(".//tractor"):
for a in ("in", "out"):
v = tractor.get(a)
new = scale_time_text(v, SCALE) if v else None
if new:
tractor.set(a, new)
counts["tractor"] += 1
samples.append(("tractor", tractor.get("id"), a, v, new))
# 3. chains: ŠKÁLUJEME POUZE out atribut (NE length property!)
for chain in root.findall(".//chain"):
for a in ("in", "out"): # in obvykle není, ale pro jistotu
v = chain.get(a)
new = scale_time_text(v, SCALE) if v else None
if new:
chain.set(a, new)
counts["chain_out"] += 1
samples.append(("chain_out", chain.get("id"), a, v, new))
# ŽÁDNÉ škálování <property name="length"> !!!
# resource replacement (pokud chceš)
if RESOURCE_FROM:
for prop in chain.findall("property[@name='resource']"):
if prop.text:
old = prop.text
newres = old.replace(RESOURCE_FROM, RESOURCE_TO)
if newres != old:
prop.text = newres
counts["resource_repl"] += 1
samples.append(("resource", chain.get("id"), old, newres))
# 4. markery – jen jednou!
for props in root.findall(".//properties[@name='shotcut:markers']"):
for marker in props.findall("properties"):
for prop_name in ("start", "end"):
prop = marker.find(f"property[@name='{prop_name}']")
if prop is not None and prop.text:
new = scale_time_text(prop.text, SCALE)
if new:
prop.text = new
counts["markers"] += 1
samples.append((f"marker_{prop_name}", marker.get("name"), prop.text, new))
# ZÁLOHA + ZÁPIS
bak = backup_file(INPUT_FILE)
print("Záloha:", bak)
OUTPUT_FILE.write_text(ET.tostring(root, encoding="utf-8", method="xml").decode("utf-8"), encoding="utf-8")
print("Uloženo:", OUTPUT_FILE)
# Souhrn
print("\nZměny:")
for k, v in counts.items():
print(f" - {k}: {v}")
print("\nUkázka (prvních 30):")
for s in samples[:30]:
print(s)
if __name__ == "__main__":
main()
sobota 24. ledna 2026
Python: Návrh stránky pro kytaristy - rozpočet priorit
přidal jsem do skriptu simulaci přes rok (měsíc = 15 sekund pro myšlenkový model, běží rychle bez skutečných pauz). Co jsem udělal:
-
Vytvořil jsem 4 skupiny: elektrická, akustická, basová, klasická.
-
Každá skupina dosáhne 5 členů (startují se 2, během měsíců se přidávají 1–2 nové osoby/měsíc), včetně tebe — Radek je v sekci klasické kytary jako majitel (vždy první, vyjmut z pohybu mezi stránkami).
-
Pro každou skupinu jsem naplánoval 3 dárce (částky 50–250 Kč) rozprostřené v průběhu roku; dary se chovají podle pravidla: body = částka, každý kompletní měsíc se body sníží o
amount / months_count(months_count = 1 pro <=100 Kč, jinak 4 podle zadání). -
Simulace generuje měsíční shrnutí (pro každý měsíc): kdo je na které stránce (page 1/2/3), font a velikost thumbnailu (page1 velké, page2 thumbnail, po půl roce page3 s malým fontem a thumb 64×100). Radek zůstává trvale na page 1.
-
Výstupy jsou zobrazeny jako tabulky: snapshoty pro začátek, půlrok a konec (měsíc 0, 5, 11) a detailní seznam pro poslední měsíc.
# Fixed simulation script (syntax errors corrected). Re-run the same simulation and present results.
from __future__ import annotations
from dataclasses import dataclass, field
from typing import List, Optional, Dict, Tuple
import datetime as dt
import random
import pandas as pd
random.seed(42)
# ---------- CONFIG ----------
SIM_START = dt.date(2026, 1, 24) # baseline date (user timezone Prague)
MONTHS_TO_SIM = 12 # simulate one year
MONTH_SECONDS = 15 # nominal "seconds per month" (not used for sleeping here)
REAL_TIME = False # set True to actually sleep MONTH_SECONDS per month (not recommended here)
# Page layout rules
VISIBLE_ON_FIRST_PAGE = 3
PAGE2_THUMBNAIL = (100, 150) # thumbnail size for page 2 (w,h)
PAGE1_THUMBNAIL = (240, 320) # larger for page 1
PAGE3_THUMBNAIL = (64, 100) # small for page 3 after 6 months
PAGE1_FONT = "size:3"
PAGE3_FONT = "Arial 8"
# ---------- DATA CLASSES ----------
def full_months_elapsed(start: dt.date, end: dt.date) -> int:
if end < start:
return 0
months = (end.year - start.year) * 12 + (end.month - start.month)
if end.day < start.day:
months -= 1
return max(0, months)
@dataclass
class Donation:
amount: float
months_count: int
start_date: dt.date
def monthly_reduction(self) -> float:
if self.months_count <= 0: return float('inf')
return self.amount / self.months_count
def points_at(self, at_date: dt.date) -> float:
elapsed = full_months_elapsed(self.start_date, at_date)
elapsed = min(elapsed, max(0, self.months_count))
remaining = max(0.0, self.amount - elapsed * self.monthly_reduction())
return round(remaining, 2)
@dataclass
class Member:
id: int
name: str
category: str
join_date: dt.date
owner: bool = False
donations: List[Donation] = field(default_factory=list)
def total_points_at(self, at_date: dt.date) -> float:
if self.owner:
return 9999.0
return round(sum(d.points_at(at_date) for d in self.donations), 2)
def add_donation(self, amount: float, months_count: int, date: dt.date):
self.donations.append(Donation(amount=amount, months_count=months_count, start_date=date))
# ---------- Helper functions ----------
czech_names = {
'elektrická': ["Jan", "Petr", "Tomáš", "Lukáš", "Marek", "Václav", "Ondřej", "Filip", "Jaroslav", "Roman"],
'akustická': ["Jana", "Klára", "Lucie", "Magda", "Eva", "Barbora", "Adéla", "Martina", "Zuzana", "Petra"],
'basová': ["Karel", "Prokop", "Stanislav", "Milan", "Viktor", "Jindřich", "Bohdan", "Daniel", "Aleš", "Rudolf"],
'klasická': ["Radek", "Nikola", "Veronika", "Helena", "Ivana", "Marta", "Aneta", "Soňa", "Radka", "Simona"]
}
def pick_name(category: str, used: set) -> str:
for n in czech_names[category]:
if n not in used:
used.add(n)
return n
i = 1
while f"{category}_{i}" in used:
i += 1
name = f"{category}_{i}"
used.add(name)
return name
def determine_months_count_from_amount(amount: float) -> int:
return 1 if amount <= 100 else 4
# ---------- Simulation state ----------
categories = ['elektrická', 'akustická', 'basová', 'klasická']
members_by_cat: Dict[str, List[Member]] = {c: [] for c in categories}
used_names = set()
member_id_seq = 1
def seed_initial_members(start_date: dt.date):
global member_id_seq
for cat in categories:
if cat == 'klasická':
name = "Radek"
used_names.add(name)
m = Member(id=member_id_seq, name=name, category=cat, join_date=start_date, owner=True)
members_by_cat[cat].append(m)
member_id_seq += 1
name2 = pick_name(cat, used_names)
m2 = Member(id=member_id_seq, name=name2, category=cat, join_date=start_date)
members_by_cat[cat].append(m2)
member_id_seq += 1
else:
name1 = pick_name(cat, used_names)
m1 = Member(id=member_id_seq, name=name1, category=cat, join_date=start_date)
members_by_cat[cat].append(m1)
member_id_seq += 1
name2 = pick_name(cat, used_names)
m2 = Member(id=member_id_seq, name=name2, category=cat, join_date=start_date)
members_by_cat[cat].append(m2)
member_id_seq += 1
seed_initial_members(SIM_START)
# Planned donations per category (3 donors among the final 5, scheduled across months)
planned_donations_by_cat = {}
for cat in categories:
chosen_pos = random.sample(range(5), 3)
months = sorted(random.sample(range(0, MONTHS_TO_SIM), 3))
amounts = [round(random.uniform(50, 250), 2) for _ in range(3)]
planned_donations_by_cat[cat] = list(zip(chosen_pos, months, amounts))
monthly_summaries = []
for month_idx in range(MONTHS_TO_SIM):
# compute simulation date for this month (keeping day same when possible)
base = (SIM_START.replace(day=1) + pd.DateOffset(months=month_idx)).date()
try:
current_date = base.replace(day=SIM_START.day)
except Exception:
# clamp to last day
last_day = (base + pd.DateOffset(months=1) - pd.DateOffset(days=1)).day
current_date = base.replace(day=min(SIM_START.day, last_day))
# Add 1-2 new members per category until each reaches 5
for cat in categories:
current_count = len(members_by_cat[cat])
if current_count < 5:
to_add = min(5 - current_count, random.choice([1,2]))
for _ in range(to_add):
name = pick_name(cat, used_names)
m = Member(id=member_id_seq, name=name, category=cat, join_date=current_date)
members_by_cat[cat].append(m)
member_id_seq += 1
# Apply planned donations scheduled for this month
for cat in categories:
plan = planned_donations_by_cat[cat]
for pos_in_final, donation_month, amount in plan:
if donation_month == month_idx:
# if the intended member exists now (by final pos), give donation to that member
if pos_in_final < len(members_by_cat[cat]):
member = members_by_cat[cat][pos_in_final]
months_count = determine_months_count_from_amount(amount)
member.add_donation(amount=amount, months_count=months_count, date=current_date)
else:
# If not yet present, try to attach donation to the last member (best-effort)
if len(members_by_cat[cat]) > 0:
member = members_by_cat[cat][-1]
months_count = determine_months_count_from_amount(amount)
member.add_donation(amount=amount, months_count=months_count, date=current_date)
# Random small chance of donation when joining
for cat in categories:
for m in members_by_cat[cat]:
if m.join_date == current_date and not m.donations and not m.owner:
if random.random() < 0.10:
amt = round(random.uniform(50, 250), 2)
months_count = determine_months_count_from_amount(amt)
m.add_donation(amount=amt, months_count=months_count, date=current_date)
# Summarize this month
rows = []
for cat in categories:
members = members_by_cat[cat]
members_sorted = sorted(members, key=lambda mm: mm.total_points_at(current_date), reverse=True)
if cat == 'klasická':
members_sorted = sorted(members, key=lambda mm: (0 if mm.owner else 1, -mm.total_points_at(current_date)))
for rank, mm in enumerate(members_sorted, start=1):
pts = mm.total_points_at(current_date)
months_since_join = full_months_elapsed(mm.join_date, current_date)
if mm.owner:
page = 1; font = PAGE1_FONT; thumb = PAGE1_THUMBNAIL
else:
if rank <= VISIBLE_ON_FIRST_PAGE and months_since_join < 6:
page = 1; font = PAGE1_FONT; thumb = PAGE1_THUMBNAIL
else:
if months_since_join >= 6:
page = 3; font = PAGE3_FONT; thumb = PAGE3_THUMBNAIL
else:
page = 2; font = "default"; thumb = PAGE2_THUMBNAIL
rows.append({
"month_index": month_idx,
"date": current_date,
"category": cat,
"member_id": mm.id,
"name": mm.name,
"join_date": mm.join_date,
"points": pts,
"rank": rank,
"page": page,
"font": font,
"thumbnail": f"{thumb[0]}x{thumb[1]}",
"owner": mm.owner
})
monthly_summaries.append(rows)
# Build DataFrame for all months
df_all = pd.DataFrame([r for month in monthly_summaries for r in month])
# Present concise snapshots: months 0, 5, 11
snapshots = []
for sm in [0,5,11]:
df_sm = df_all[df_all['month_index']==sm].sort_values(['category','rank'])
rows = []
for cat in categories:
df_cat = df_sm[df_sm['category']==cat]
members_text = []
for _, r in df_cat.iterrows():
owner_tag = " (majitel)" if r['owner'] else ""
members_text.append(f"#{int(r['rank'])} {r['name']}{owner_tag} — {r['points']} CZK — page{int(r['page'])}")
rows.append({"month_index": sm, "date": df_sm['date'].iloc[0], "category": cat, "members": " | ".join(members_text)})
snapshots.append(pd.DataFrame(rows))
# Final month detailed table
final_df = df_all[df_all['month_index']==11].sort_values(['category','rank']).reset_index(drop=True)
# Try to display with interactive table helper
try:
from caas_jupyter_tools import display_dataframe_to_user
display_dataframe_to_user("Snapshots (start, mid-year, end)", pd.concat(snapshots, ignore_index=True))
display_dataframe_to_user("Final month detailed listing (month 11)", final_df)
except Exception:
print("=== Snapshots (start, mid-year, end) ===")
for snap in snapshots:
print(snap.to_string(index=False))
print()
print("=== Final month detailed listing (month 11) ===")
print(final_df.to_string(index=False))
print("\nSimulation finished. If you want: export CSV, real-time run (with sleeps), or REST endpoint (Flask).")
středa 21. ledna 2026
Python: Mapování polských souborů pomocí českého překladu, vytvoření playlistu pro nalezený soubor
- Mapování polských souborů pomocí mapy s českým překladem.
- fuzzywuzzy najde v českém překladu podobný název.
- Následně se vybere správný soubor s polským názvem.
- Podle toho se vytvoří playlist .m3u s tímto videem a jeho zpomalenou verzí
- Tento playlist se otevře ve vlc a přehrává se první video.
#!/usr/bin/env python3
import os
import subprocess
import sys
from fuzzywuzzy import process, fuzz # Potřebuješ nainstalovat fuzzywuzzy: pip install fuzzywuzzy python-Levenshtein
# Mapování českých názvů na polské názvy souborů (bez 'Tatiana Stachak - ' a '.mkv')
# Přeložené české názvy na základě polských originálů
mapping = {
"Pohádka jiskřičky": "Bajka iskierki (Sparkle\\'s tale - Das Märchen des Funkens)",
"Byla jednou malá žabička": "Była sobie żabka mała",
"Byl jednou král": "Był sobie król (There once was a king - Es war einmal ein König)",
"Černý beran": "Czarny baran (A black ram - Schwarzes Schaf)",
"Jedou, jedou děti cestou": "Jadą, jadą dzieci drogą",
"Jede vlak": "Jedzie pociąg (Train is coming - Aus der Ferne kommt ein Zug)",
"Kukačka": "Kukułka (Cuckoo - Der Kuckuck)",
"Tři kuřátka": "Kurki trzy (Twinkle, twinkle little star - Blinde, blinke kleiner Sterm)",
"My jsme trpaslíci": "Mujesteśmy krasnoludki (We arę little dwarfs - Wir sind kleine Zwerge)",
"Na mostě v Avignonu": "Na moście w Avignon (Sur le pont d\\'Avignon)",
"Padá sníh": "Pada śnieg (Jingle bells)",
"Pane Janie": "Panie Janie (Frère Jacques)",
"Sedí si zajíc": "Siedzi sobie zając (There\\'s a Hare - Sitzender Hase)",
"Šedý mráček": "Siwa chmurka (A grey cloud - Graues Wölkchen)",
"Starý Donald": "Stary Donald (Old MacDonald)",
"Starý medvěd tvrdě spí": "Stary niedźwiedź mocno śpi",
"Zlá zima": "Zła zima (Bad winter - Böser Winter)"
}
def find_polish_name(czech_input):
# Použijeme fuzzy matching pro nalezení nejlepší shody (na část nebo celý název)
czech_names = list(mapping.keys())
best_match, score = process.extractOne(czech_input, czech_names, scorer=fuzz.partial_ratio)
if score >= 70: # Minimální skóre pro shodu, můžeš upravit
return mapping[best_match]
else:
print(f"Žádná shoda pro '{czech_input}' nalezena.")
sys.exit(1)
def create_m3u_playlist(polish_name, directory):
# Předpokládáme, že soubory jsou v aktuálním adresáři nebo specifikovaném
original_file = f"Tatiana Stachak - {polish_name}.mkv"
slowed_file = os.path.join("4", f"Tatiana Stachak - {polish_name}.mkv")
if not os.path.exists(original_file):
print(f"Originální soubor '{original_file}' neexistuje.")
sys.exit(1)
if not os.path.exists(slowed_file):
print(f"Zpomalený soubor '{slowed_file}' neexistuje.")
sys.exit(1)
playlist_name = "temp_playlist.m3u"
with open(playlist_name, 'w', encoding='utf-8') as f:
f.write("#EXTM3U\n")
f.write(f"#EXTINF:-1,Originál\n{os.path.abspath(original_file)}\n")
f.write(f"#EXTINF:-1,Zpomalená verze\n{os.path.abspath(slowed_file)}\n")
return playlist_name
def open_in_vlc(playlist):
try:
subprocess.call(['vlc', playlist])
except FileNotFoundError:
print("VLC není nainstalováno nebo není v PATH.")
finally:
# Smazat dočasný playlist po otevření (volitelně)
os.remove(playlist)
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Použití: python script.py 'český název nebo část'")
sys.exit(1)
czech_input = ' '.join(sys.argv[1:])
polish_name = find_polish_name(czech_input)
playlist = create_m3u_playlist(polish_name, os.getcwd())
open_in_vlc(playlist)
Jak funguje FuzzyWuzzy?
from fuzzywuzzy import fuzz, process
mapping = {
"My jsme trpaslíci": "Mujesteśmy krasnoludki",
"Jede vlak": "Jedzie pociąg",
}
vstup = "trpaslíci"
nejlepsi, skore = process.extractOne(vstup, mapping.keys(), scorer=fuzz.partial_ratio)
print(f"Nalezeno: {nejlepsi} (skóre {skore})")
print(f"Polský soubor: {mapping[nejlepsi]}") Má vrátit podobný výstup:
Nalezeno: My jsme trpaslíci (skóre 86)
Polský soubor: Mujesteśmy krasnoludkiPopis skriptu
- script.py Jedou
- script.py jedou
- script.py děti
- script.py vlak
- script.py král
- script.py zajíc
- script.py sníh
- script.py donald
Příklady reálného chování (testováno na podobných datech):
Zadáno | Pravděpodobně najde | Skóre (přibližně) |
|---|---|---|
Jedou | Jedou, jedou děti cestou | 100 % |
jede | Jede vlak | 100 % |
děti | Jedou, jedou děti cestou | 100 % |
vlak | Jede vlak | 100 % |
král | Byl jednou král | 100 % |
zajíc | Sedí si zajíc | 100 % |
sníh | Padá sníh | 100 % |
donald | Starý Donald | 100 % |
kuka | Kukačka | ~86–100 % |
medvěd | Starý medvěd tvrdě spí | 77–100 % |
zima | Zlá zima | 100 % |
if score >= 60: # ← změň z 70 na 60 nebo i 50
return mapping[best_match]def find_polish_name(czech_input):
czech_input = czech_input.lower().strip()
czech_names = list(mapping.keys())
# Nejprve zkusíme přesnou podřetězcovou shodu (case-insensitive)
for name in czech_names:
if czech_input in name.lower():
return mapping[name]
# Pokud nic nenajde → fuzzy
best_match, score = process.extractOne(czech_input, czech_names, scorer=fuzz.partial_ratio)
if score >= 65:
return mapping[best_match]
print(f"Nenašel jsem shodu pro: '{czech_input}' (nejlepší byl '{best_match}' se skóre {score})")
sys.exit(1)
Problém s připojením sd karty - co zabralo (detekce usb zařízení)
# 1️⃣ Vypnout USB autosuspend (stabilizuje Realtek čtečku) sudo sh -c 'echo -1 > /sys/module/usbcore/parameters/autosuspend' cat...
Štítky
-
PRETEXT Důvod proč chci z md5sums extrahovat jen informace o .xml je, že další soubory jako dokumentace .gz a obrázky .png apod. by bylo ho...
-
Adresář includes pokračování functions_content.php (includes) gen_sort_selects(&$limit_days, &$sort_by_text, &$sort_days, ...