add home to repo

This commit is contained in:
valere
2025-11-15 09:59:44 +01:00
parent 170ede89f8
commit 463540770a
85 changed files with 1051 additions and 0 deletions

15
home/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
}
]
}

View File

@@ -0,0 +1,246 @@
#!/usr/bin/env python3
import os
import sys
import time
import shlex
import subprocess
import tempfile
from pathlib import Path
from typing import List, Tuple, Optional
# --- Configuration ---
HOME = Path.home()
SOURCES = [
HOME / "Music",
HOME / "Downloads",
]
DEST_ON_PHONE = "/sdcard/Music"
# Model tag as seen in `adb devices -l` (e.g., ... model:AGM_M7 ...)
ADB_MODEL_MATCH = ["AGM_M7", "AGM", "M7"]
POLL_INTERVAL_SEC = 60
SIZE_LIMIT_BYTES = 7 * 1024 ** 3 # 7 GiB
MUSIC_EXTS = {".mp3", ".m4a", ".ogg", ".aac", ".opus", ".alac", ".flac"}
# If you have a static Wi-Fi ADB endpoint, set it here (e.g., "192.168.1.50:5555").
ADB_IP_PORT: Optional[str] = None
# --- Helpers ---
def run(cmd: List[str], check: bool = False, text: bool = True, timeout: Optional[int] = None) -> subprocess.CompletedProcess:
try:
return subprocess.run(cmd, check=check, text=text, capture_output=True, timeout=timeout)
except Exception as e:
return subprocess.CompletedProcess(cmd, returncode=1, stdout="", stderr=str(e))
def ensure_adb_server() -> None:
run(["adb", "start-server"]) # best-effort
def list_adb_devices() -> List[str]:
proc = run(["adb", "devices", "-l"]) # do not check, we parse regardless
if proc.returncode != 0:
return []
lines = [ln.strip() for ln in proc.stdout.splitlines()]
# skip header line: "List of devices attached"
if lines and lines[0].lower().startswith("list of devices"):
lines = lines[1:]
return [ln for ln in lines if ln]
def adb_connect_if_needed():
if not ADB_IP_PORT:
return
devices = list_adb_devices()
if any(ADB_IP_PORT in ln for ln in devices):
return # already connected
run(["adb", "connect", ADB_IP_PORT])
def is_agm_connected() -> bool:
devices = list_adb_devices()
for ln in devices:
if "device" in ln and not ln.endswith("offline"):
if any(tag in ln for tag in ADB_MODEL_MATCH):
return True
return False
def gather_music_files() -> List[Tuple[Path, Path, float, int]]:
# Returns list of tuples: (root_dir, file_path, mtime, size)
entries: List[Tuple[Path, Path, float, int]] = []
for root in SOURCES:
try:
if not root.exists():
continue
for dirpath, _, filenames in os.walk(root):
dpath = Path(dirpath)
for fn in filenames:
p = dpath / fn
if p.suffix.lower() not in MUSIC_EXTS:
continue
try:
st = p.stat()
entries.append((root, p, st.st_mtime, st.st_size))
except Exception:
continue
except Exception:
continue
# newest first by mtime
entries.sort(key=lambda t: t[2], reverse=True)
return entries
def select_up_to_size(entries: List[Tuple[Path, Path, float, int]], limit_bytes: int) -> List[Tuple[Path, Path, int]]:
selected: List[Tuple[Path, Path, int]] = []
total = 0
for root, p, _mt, sz in entries:
if total >= limit_bytes:
break
selected.append((root, p, sz))
total += sz
return selected
def adb_shell(cmd: str) -> subprocess.CompletedProcess:
# Single string executed via adb shell
return run(["adb", "shell", cmd])
def remote_size(adb_path: str) -> Optional[int]:
# Uses stat if available; returns None if missing
# Escape path for shell
qpath = shlex.quote(adb_path)
proc = adb_shell(f"stat -c %s {qpath}")
if proc.returncode != 0 or not proc.stdout.strip():
return None
out = proc.stdout.strip()
if "No such file" in out or "not found" in out:
return None
try:
return int(out.splitlines()[-1].strip())
except Exception:
return None
def ensure_remote_dir(adb_path: str) -> None:
# mkdir -p dirname
dirname = os.path.dirname(adb_path)
if not dirname:
return
adb_shell(f"mkdir -p {shlex.quote(dirname)}")
def have_ffmpeg() -> bool:
proc = run(["ffmpeg", "-version"])
return proc.returncode == 0
def transcode_flac_to_mp3(src: Path) -> Optional[Path]:
try:
tmp = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False)
tmp_path = Path(tmp.name)
tmp.close()
except Exception:
return None
cmd = [
"ffmpeg",
"-y",
"-i",
str(src),
"-vn",
"-c:a",
"libmp3lame",
"-q:a",
"2",
str(tmp_path),
]
proc = run(cmd)
if proc.returncode != 0:
try:
tmp_path.unlink(missing_ok=True) # type: ignore[arg-type]
except Exception:
pass
return None
return tmp_path
def push_file(local_path: Path, remote_path: str, size: int) -> bool:
# Skip if same size exists
rsz = remote_size(remote_path)
if rsz is not None and rsz == size:
print(f"[=] Skip (same size): {local_path} -> {remote_path}")
return True
ensure_remote_dir(remote_path)
proc = run(["adb", "push", "-p", str(local_path), remote_path])
if proc.returncode == 0:
print(f"[+] Pushed: {local_path} -> {remote_path}")
return True
else:
print(f"[!] Push failed: {local_path}\n{proc.stderr}")
return False
def sync_latest_batch():
entries = gather_music_files()
if not entries:
print("[i] No music files found.")
return
batch = select_up_to_size(entries, SIZE_LIMIT_BYTES)
print(f"[i] Selected {len(batch)} files up to {SIZE_LIMIT_BYTES/(1024**3):.2f} GiB")
for root, p, sz in batch:
try:
rel = p.relative_to(root)
except Exception:
rel = p.name # fallback
if p.suffix.lower() == ".flac":
if not have_ffmpeg():
print(f"[!] ffmpeg not available, skipping: {p}")
continue
mp3_tmp = transcode_flac_to_mp3(p)
if not mp3_tmp:
print(f"[!] Transcode failed, skipping: {p}")
continue
try:
if isinstance(rel, Path):
rel_mp3 = rel.with_suffix(".mp3")
remote = f"{DEST_ON_PHONE.rstrip('/')}/{rel_mp3.as_posix()}"
else:
remote = f"{DEST_ON_PHONE.rstrip('/')}/{Path(rel).with_suffix('.mp3').as_posix()}"
msz = mp3_tmp.stat().st_size
push_file(mp3_tmp, remote, msz)
finally:
try:
mp3_tmp.unlink()
except Exception:
pass
else:
remote = f"{DEST_ON_PHONE.rstrip('/')}/{rel.as_posix()}"
push_file(p, remote, sz)
def main():
print("[i] adb-music-sync daemon starting...")
ensure_adb_server()
connected_prev = False
while True:
try:
ensure_adb_server()
adb_connect_if_needed()
connected = is_agm_connected()
if connected and not connected_prev:
print("[+] AGM M7 connected. Starting sync of latest ~7 GiB...")
sync_latest_batch()
elif not connected and connected_prev:
print("[-] AGM M7 disconnected.")
connected_prev = connected
time.sleep(POLL_INTERVAL_SEC)
except KeyboardInterrupt:
print("[i] Exiting on user interrupt.")
sys.exit(0)
except Exception as e:
print(f"[!] Error in main loop: {e}")
time.sleep(POLL_INTERVAL_SEC)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,78 @@
#!/usr/bin/env bash
set -euo pipefail
SILENT=false
LOG_PREFIX="[adb-music-sync]"
PYTHON_SCRIPT="$HOME/.linux-env/adb-music-sync/adb-music-sync.py"
INSTALL_TARGET="$HOME/.local/bin/adb-music-sync.py"
AUTOSTART_DIR="$HOME/.config/autostart"
AUTOSTART_FILE="$AUTOSTART_DIR/adb-music-sync.desktop"
log() {
if [ "$SILENT" = true ]; then return; fi
echo "$LOG_PREFIX $*"
}
check_and_install_deps() {
# Minimal dependency: adb
if ! command -v adb >/dev/null 2>&1; then
if command -v apt >/dev/null 2>&1; then
log "[+] Installation d'adb (apt) ..."
sudo apt update -y && sudo apt install -y adb
elif command -v dnf >/dev/null 2>&1; then
log "[+] Installation d'adb (dnf) ..."
sudo dnf install -y android-tools
elif command -v pacman >/dev/null 2>&1; then
log "[+] Installation d'adb (pacman) ..."
sudo pacman -Sy --noconfirm android-tools
else
log "[!] adb introuvable et gestionnaire de paquets inconnu. Installez adb manuellement."
fi
fi
}
install_script() {
check_and_install_deps
log "[+] Copie du script Python..."
mkdir -p "$(dirname "$INSTALL_TARGET")"
cp "$PYTHON_SCRIPT" "$INSTALL_TARGET"
chmod +x "$INSTALL_TARGET"
log "[+] Création du fichier autostart..."
mkdir -p "$AUTOSTART_DIR"
cat > "$AUTOSTART_FILE" <<EOF
[Desktop Entry]
Type=Application
Exec=$INSTALL_TARGET
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=ADB Music Sync
Comment=Lance la synchronisation de ~5GiB de musique vers l'AGM M7 à la connexion ADB
EOF
log "[✓] Installation terminée. Le script se lancera automatiquement à l'ouverture de session."
}
uninstall_script() {
log "[+] Suppression du script Python et autostart..."
rm -f "$INSTALL_TARGET"
rm -f "$AUTOSTART_FILE"
log "[✓] Désinstallation terminée."
}
case "${1:-}" in
uninstall)
uninstall_script
;;
silent)
SILENT=true
uninstall_script &>/dev/null || true
install_script &>/dev/null
;;
*)
install_script
;;
esac

View File

@@ -0,0 +1,9 @@
[Desktop Entry]
Name=Android WiFi
Comment=Mirror and control Android devices over Wi-Fi
Exec=/home/valere/.local/bin/android-wifi.sh
Icon=/home/valere/.local/share/icons/android-wifi.svg
Terminal=false
Type=Application
Categories=Utility;
StartupNotify=true

View File

@@ -0,0 +1,15 @@
#!/bin/sh
# Try to connect via scrcpy first
if ! scrcpy; then
# If scrcpy fails, try the alternative method
echo "If scrcpy fails, try the alternative method"
adb tcpip 5555 >/dev/null 2>&1 || true
MAC="0c:52:03:1e:89:9a"
for i in $(seq 1 254); do ping -c1 -W1 192.168.1.$i >/dev/null 2>&1 & done; wait
line=$(ip neigh | grep -i "$MAC" | head -n1 || true)
ip=$(printf "%s" "$line" | awk '{print $1}')
echo "${ip}:5555"
adb connect "${ip}:5555"
scrcpy
fi

View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" version="1.1">
<path style="opacity:0.2" d="m 16.846877,12 c -1.116351,0 -2.227419,0.912229 -2.015075,2 l 3.122973,16 -5.596557,11.109375 C 11.959876,41.871734 11.885244,42.336988 12.177176,43 c 0.278672,0.632897 0.998812,1 1.747448,1 H 24 34.075375 c 0.748637,0 1.468777,-0.367103 1.747448,-1 0.291932,-0.663012 0.217302,-1.128266 -0.181041,-1.890625 L 30.045225,30 33.168198,14 c 0.212344,-1.087771 -0.898724,-2 -2.015075,-2 H 24 Z"/>
<path style="fill:#cccccc" d="m 16.846877,11 c -1.116351,0 -2.227419,0.912229 -2.015075,2 l 3.122973,16 -5.596557,11.109375 C 11.959876,40.871734 11.885244,41.336988 12.177176,42 c 0.278672,0.632897 0.998812,1 1.747448,1 H 24 34.075375 c 0.748637,0 1.468777,-0.367103 1.747448,-1 0.291932,-0.663012 0.217302,-1.128266 -0.181041,-1.890625 L 30.045225,29 33.168198,13 c 0.212344,-1.087771 -0.898724,-2 -2.015075,-2 H 24 Z"/>
<rect style="opacity:0.2" width="40" height="32" x="4" y="6" rx="2" ry="2"/>
<path style="fill:#e4e4e4" d="m 4,33 v 2 c 0,1.108 0.892,2 2,2 h 36 c 1.108,0 2,-0.892 2,-2 v -2 z"/>
<path style="opacity:0.1" d="m 11.494141,15 a 1.5,1.5 0 0 0 -0.832032,0.255859 1.5,1.5 0 0 0 -0.40625,2.082032 l 3.13086,4.654297 C 10.404945,24.606192 8.4012371,28.299159 8.0019531,32.460938 7.9284599,34.000879 9.5546875,34 9.5546875,34 H 38.40625 c 0,0 1.672856,-3.38e-4 1.591797,-1.617188 -0.416529,-4.131451 -2.415618,-7.796833 -5.380859,-10.394531 l 3.126953,-4.65039 a 1.5,1.5 0 0 0 -0.40625,-2.082032 1.5,1.5 0 0 0 -1.125,-0.228515 1.5,1.5 0 0 0 -0.957032,0.634765 l -3.072265,4.566407 C 29.78649,18.814887 26.990024,18 24.001953,18 c -2.989385,0 -5.786177,0.815488 -8.183594,2.230469 l -3.074218,-4.56836 A 1.5,1.5 0 0 0 11.787109,15.027344 1.5,1.5 0 0 0 11.494141,15 Z"/>
<path style="fill:#077063" d="M 6,5 C 4.892,5 4,5.892 4,7 V 33 H 44 V 7 C 44,5.892 43.108,5 42,5 Z"/>
<path style="opacity:0.1;fill:#ffffff" d="M 6,5 C 4.892,5 4,5.892 4,7 V 8 C 4,6.892 4.892,6 6,6 h 36 c 1.108,0 2,0.892 2,2 V 7 C 44,5.892 43.108,5 42,5 Z"/>
<path style="fill:none;stroke:#30dd81;stroke-width:3;stroke-linecap:round" d="M 15.1998,21.000026 11.5,15.5"/>
<path style="fill:none;stroke:#30dd81;stroke-width:3;stroke-linecap:round" d="M 32.799764,21.000026 36.5,15.5"/>
<path style="fill:#30dd81" d="m 24.002386,17.000034 c -8.355868,0 -15.2214979,6.346843 -15.9999669,14.460906 C 7.9289259,33.000882 9.5544999,33 9.5544999,33 H 38.406003 c 0,0 1.672201,-3.35e-4 1.591142,-1.617185 C 39.182807,23.305596 32.331836,17.000034 24.002386,17.000034 Z"/>
<path style="opacity:0.2" d="m 16,25 a 1.9999959,1.9999959 0 0 0 -2,2 1.9999959,1.9999959 0 0 0 2,2 1.9999959,1.9999959 0 0 0 2,-2 1.9999959,1.9999959 0 0 0 -2,-2 z m 16,0 a 1.9999959,1.9999959 0 0 0 -2,2 1.9999959,1.9999959 0 0 0 2,2 1.9999959,1.9999959 0 0 0 2,-2 1.9999959,1.9999959 0 0 0 -2,-2 z"/>
<path style="fill:#ffffff" d="M 15.999996,24.000008 A 1.9999959,1.9999959 0 0 1 17.999992,26.000004 1.9999959,1.9999959 0 0 1 15.999996,28 1.9999959,1.9999959 0 0 1 14,26.000004 1.9999959,1.9999959 0 0 1 15.999996,24.000008 Z"/>
<path style="fill:#ffffff" d="M 31.999996,24.000008 A 1.9999959,1.9999959 0 0 1 33.999991,26.000004 1.9999959,1.9999959 0 0 1 31.999996,28 1.9999959,1.9999959 0 0 1 30,26.000004 1.9999959,1.9999959 0 0 1 31.999996,24.000008 Z"/>
<path style="fill:#ffffff;opacity:0.2" d="M 11.494141 14 A 1.5 1.5 0 0 0 10.662109 14.255859 A 1.5 1.5 0 0 0 10.115234 16.001953 A 1.5 1.5 0 0 1 10.662109 15.255859 A 1.5 1.5 0 0 1 11.494141 15 A 1.5 1.5 0 0 1 11.787109 15.027344 A 1.5 1.5 0 0 1 12.744141 15.662109 L 15.818359 20.230469 C 18.215776 18.815488 21.012568 18 24.001953 18 C 26.990024 18 29.78649 18.814887 32.183594 20.228516 L 35.255859 15.662109 A 1.5 1.5 0 0 1 36.212891 15.027344 A 1.5 1.5 0 0 1 37.337891 15.255859 A 1.5 1.5 0 0 1 37.910156 16.001953 A 1.5 1.5 0 0 0 37.337891 14.255859 A 1.5 1.5 0 0 0 36.212891 14.027344 A 1.5 1.5 0 0 0 35.255859 14.662109 L 32.183594 19.228516 C 29.78649 17.814887 26.990024 17 24.001953 17 C 21.012568 17 18.215776 17.815488 15.818359 19.230469 L 12.744141 14.662109 A 1.5 1.5 0 0 0 11.787109 14.027344 A 1.5 1.5 0 0 0 11.494141 14 z M 35.033203 21.369141 L 34.617188 21.988281 C 37.477056 24.493668 39.433905 27.993356 39.943359 31.945312 C 39.986866 31.783283 40.008864 31.598575 39.998047 31.382812 C 39.601372 27.448291 37.768055 23.938648 35.033203 21.369141 z M 12.970703 21.373047 C 10.220358 23.959215 8.3822757 27.496796 8.0019531 31.460938 C 7.9920657 31.668114 8.0150508 31.844846 8.0585938 32 C 8.5570234 28.027243 10.515755 24.509049 13.386719 21.992188 L 12.970703 21.373047 z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,11 @@
#!/bin/bash
# desktop apps
cp ~/.linux-env/applications/*/*.desktop ~/.local/share/applications/
cp ~/.linux-env/applications/*/*.sh ~/.local/bin/
cp ~/.linux-env/applications/*/*.svg ~/.local/share/icons/
chmod +x ~/.local/share/applications/*.desktop
chmod +x ~/.local/bin/*.sh
update-desktop-database ~/.local/share/applications/
gtk-update-icon-cache ~/.local/share/icons/ # inutile sauf si tu fais un vrai thème d'icônes

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,7 @@
<client name="Azureus 3.0.5.0" author="seba14.org" version="1.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 3.0.5.0;Windows XP;Java 1.6.0_05_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_Content-type: application/x-www-form-urlencoded_nl_</headers>
<peer_id prefix="-AZ3050-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitComet 1.07" author="seba14.org" version="1.0" processname="bitcomet">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;natmapped=1&amp;localip={localip}&amp;port_type=wan&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1&amp;key={key}{event}</query>
<headers>Host: {host}_nl_Connection: close_nl_Accpet: */*_nl_Accept-Encoding: gzip_nl_User-Agent: BitComet/1.7.12.3_nl_Pragma: no-cache_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-BC0107-" type="random" length="12" urlencoding="true" upperCase="true" value="" />
<key type="numeric" length="5" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitComet 1.13" author="seba14.org" version="1.0" processname="bitcomet">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;natmapped=1&amp;localip={localip}&amp;port_type=wan&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1&amp;key={key}{event}</query>
<headers>Host: {host}_nl_Connection: close_nl_Accept: */*_nl_Accept-Encoding: gzip_nl_User-Agent: BitComet/1.13.6.22_nl_Pragma: no-cache_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-BC0113-" type="random" length="12" urlencoding="true" upperCase="true" value="" />
<key type="numeric" length="5" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitTorrent 6.0.3 (8642)" author="Rebound" version="1.0" processname="bittorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: BitTorrent/6030_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="M6-0-3--" type="random" length="12" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitTyrant 1.1" author="res0r9lm" version="1.0" processname="Azureus">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}</query>
<headers>User-Agent: AzureusBitTyrant 2.5.0.0BitTyrant;Windows XP;Java 1.5.0_10_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_Proxy-Connection: keep-alive_nl_Content-type: application/x-www-form-urlencoded_nl_</headers>
<peer_id prefix="AZ2500BT" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Deluge 1.1.7" author="seba14.org" version="1.0">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;key={key}&amp;compact=1&amp;numwant={numwant}&amp;supportcrypto=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: Deluge 1.1.7_nl_Connection: close_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-DE1170-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value="" />
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,9 @@
<client name="Deluge 1.1.9" author="seba14.org" version="1.0">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;key={key}&amp;compact=1&amp;numwant={numwant}&amp;supportcrypto=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: Deluge 1.1.9_nl_Connection: close_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-DE1190-" type="printable" length="12" urlencoding="false" upperCase="false" value="" />
<key type="hex" length="8" urlencoding="false" upperCase="false" lowerCase="true" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="false"/>
<urlencoding exceptions="." />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Halite 0.3.1.1" author="seba14.org" version="2.0"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}{event}&amp;key={key}&amp;compact=1&amp;numwant={numwant}&amp;supportcrypto=1&amp;no_peer_id=1</query>
<headers>Accept-Encoding: gzip_nl_User-Agent: Halite v 0.3.1.1_nl_Host: {host}_nl_</headers>
<peer_id prefix="-HL0311-" type="printable" length="12" urlencoding="false"/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="false"/>
<urlencoding exceptions="_-()~!*."/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Transmission 1.06 (Build 5136)" author="seba14.org" version="1.0">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;corrupt=0&amp;left={left}&amp;compact=1&amp;numwant={numwant}&amp;key={key}&amp;supportcrypto=1&amp;requirecrypto=0{event}</query>
<headers>Host: {host}_nl_Connection: close_nl_User-Agent: Transmission/1.06 (5136)_nl_</headers>
<peer_id prefix="-TR1060-" type="alphanumeric" length="12" urlencoding="false" lowerCase="true" value=""/>
<key type="alphanumeric" length="10" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.2.0.2" author="seba14.org" version="1.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.2.0.2;Windows XP;Java 1.6.0_13_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4202-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,9 @@
<client name="Vuze 4.2.0.4" author="Ratiomaster" version="1.0" processname="azureus">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.2.0.4;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4204-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,9 @@
<client name="Vuze 4.2.0.8" author="KTC" version="1.0" processname="azureus">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.2.0.8;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4208-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.3.0.6" author="seba14.org" version="1.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.3.0.6;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4306-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.4.0.4" author="seba14.org" version="2.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.4.0.4;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4404-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="Vuze 4.5.0.0" author="seba14.org" version="2.0" processname="azureus"> <query>info_hash={infohash}&amp;peer_id={peerid}&amp;supportcrypto=1&amp;port={port}&amp;azudp={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0{event}&amp;numwant={numwant}&amp;no_peer_id=1&amp;compact=1&amp;key={key}&amp;azver=3</query>
<headers>User-Agent: Azureus 4.5.0.0;{osver};{javaver}_nl_Connection: close_nl_Accept-Encoding: gzip_nl_Host: {host}_nl_Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2_nl_</headers>
<peer_id prefix="-AZ4500-" type="alphanumeric" length="12" urlencoding="false" upperCase="false" value=""/>
<key type="alphanumeric" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="true"/>
<urlencoding exceptions="*-._" />
</client>

View File

@@ -0,0 +1,8 @@
<client name="BitLord 1.1" author="Ratiomaster" version="1.0" processname="bitlord">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;natmapped=1&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1&amp;key={key}{event}</query>
<headers>User-Agent: BitTorrent/3.4.2_nl_Connection: close_nl_Accept-Encoding: gzip, deflate_nl_Host: {host}_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="exbc%01%01LORDCz%03%92" type="random" length="6" urlencoding="true" upperCase="true" value="" />
<key type="numeric" length="4" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="Burst 3.1.0b" author="RatioMaster" version="1.0" processname="btdownloadheadless">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;key={key}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;compact=1{event}</query>
<headers>Host: {host}_nl_Accept-Encoding: gzip_nl_User-Agent: BitTorrent/brst1.1.3_nl_</headers>
<peer_id prefix="Mbrst1-1-3" type="hex" length="10" urlencoding="false" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="false" value=""/>
<protocol value="HTTP/1.0"/>
<hash upperCase="true"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.7.7 build (8179)" author="uk10" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1770_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1770-%f3%9f" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.1 (build 12616)" author="SpongeBob101" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1810_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1810-H1" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.1 (build 12639)" author="MurderTR" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1810_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1810-_1" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.2 (build 15227)" author="Gox" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1820-%7b%3b" type="random" length="10" urlencoding="true" upperCase="false" value="" />
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="utorrent 1.8.2 (build 14153)" author="rogeruk" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip, deflate_nl_Host: {host}_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-UT1820-I7" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="utorrent 1.8.2 (build 14458)" author="MurderTR" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip, deflate_nl_Host: {host}_nl_Cache-Control: no-cache_nl_</headers>
<peer_id prefix="-UT1820-z8" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8.2 Build (15167)" author="seba14.org" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1820_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1820-%3f%3b" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,9 @@
<client name="uTorrent 1.8.3 Build (15728)" author="seba14.org" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1830(15728)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1830-p%3d" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="_()~._-" />
</client>

View File

@@ -0,0 +1,9 @@
<client name="uTorrent 1.8.4 Build (16150)" author="seba14.org" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1840(16150)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1840-%16%3f" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="_-~!*."/>
</client>

View File

@@ -0,0 +1,8 @@
<client name="uTorrent 1.8 (build 11813)" author="SpongeBob101" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/1800_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT1800-%25." type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
</client>

View File

@@ -0,0 +1,10 @@
<client name="uTorrent 2.0.4 Build (21431)" author="CoreCore and Anon" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/2040(21431)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT2040-%b7S" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="-._~"/>
<numwant value="200" randomize="false"/>
</client>

View File

@@ -0,0 +1,10 @@
<client name="uTorrent 2.0.4 Build (21515)" author="CoreCore and Anon" version="1.0" processname="utorrent">
<query>info_hash={infohash}&amp;peer_id={peerid}&amp;port={port}&amp;uploaded={uploaded}&amp;downloaded={downloaded}&amp;left={left}&amp;corrupt=0&amp;key={key}{event}&amp;numwant={numwant}&amp;compact=1&amp;no_peer_id=1</query>
<headers>Host: {host}_nl_User-Agent: uTorrent/2040(21515)_nl_Accept-Encoding: gzip_nl_</headers>
<peer_id prefix="-UT2040-%0bT" type="random" length="10" urlencoding="true" upperCase="false" value=""/>
<key type="hex" length="8" urlencoding="false" upperCase="true" value=""/>
<protocol value="HTTP/1.1"/>
<hash upperCase="false"/>
<urlencoding exceptions="-._~"/>
<numwant value="200" randomize="false"/>
</client>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,10 @@
[Desktop Entry]
Name=RatioMaster
Comment=Ratio spoofing tool for torrents
Exec=wine /home/valere/.local/bin/RatioMaster/RM.exe
Path=/home/valere/.local/bin/RatioMaster
Icon=/home/valere/.local/bin/RatioMaster/logo.svg
Terminal=false
Type=Application
Categories=Network;P2P;
StartupNotify=true

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
width="773.29401"
height="773.29401"
viewBox="0 -28.5 247.45409 247.45409"
version="1.1"
preserveAspectRatio="xMidYMid"
id="svg3"
sodipodi:docname="logo.svg"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs3" />
<sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="0.48911087"
inkscape:cx="-24.534315"
inkscape:cy="80.758786"
inkscape:window-width="1920"
inkscape:window-height="1132"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg3" />
<g
id="g3"
transform="translate(5.5656067,239.04617)">
<rect
style="fill:#eb001b;fill-opacity:1;stroke-width:11.3833;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.3;paint-order:fill markers stroke"
id="rect3"
width="112.2394"
height="112.45076"
x="-105.21542"
y="-209.79523"
transform="rotate(45)" />
<rect
style="fill:#f79e1b;fill-opacity:1;stroke-width:11.3833;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.3;paint-order:fill markers stroke"
id="rect3-6"
width="112.2394"
height="112.45076"
x="-42.293499"
y="-272.13583"
transform="rotate(45)" />
<rect
style="fill:#ff5f00;fill-opacity:1;stroke-width:5.03456;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.3;paint-order:fill markers stroke"
id="rect3-6-5"
width="49.315277"
height="50.120525"
x="-42.293499"
y="-209.80559"
transform="rotate(45)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<ApplicationSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<textStopMinLeecher>0</textStopMinLeecher>
<updateAnnounceParamsOnStart>true</updateAnnounceParamsOnStart>
<finishedPercent>100</finishedPercent>
<uploadRate>55003.37</uploadRate>
<downloadRate>0.21</downloadRate>
<interval>1800</interval>
<TorrentClientsIndex>11</TorrentClientsIndex>
<checkLogEnabled>true</checkLogEnabled>
<checkRequestScrap>true</checkRequestScrap>
<checkShowTrayBaloon>true</checkShowTrayBaloon>
<checkTCPListen>false</checkTCPListen>
<customPort />
<customKey>WMAAIhLqVx</customKey>
<customPeersNum />
<customPeerID>-TR1060-pauut3h9agwn</customPeerID>
<textProxyHost />
<textProxyPort />
<textProxyPass />
<textProxyUser />
<comboProxyTypeIndex>0</comboProxyTypeIndex>
<checkNewVersion>true</checkNewVersion>
<checkRandomUpload>true</checkRandomUpload>
<checkRandomDownload>true</checkRandomDownload>
<RandomUploadFrom>50000</RandomUploadFrom>
<RandomUploadTo>100000</RandomUploadTo>
<RandomDownloadFrom>0</RandomDownloadFrom>
<RandomDownloadTo>4</RandomDownloadTo>
<ignoreFailureReason>false</ignoreFailureReason>
<torrentFilePath>C:\users\valere\Desktop\Downloads\l.horloger.de.saint-paul.1974.VOF RESTAUREE.1080p.BDrip.x265.FLAC-AZAZE.mkv.torrent</torrentFilePath>
<torrentHash>1164387932F4CB6B1267B3ABA7E0A4CD26593E14</torrentHash>
<stopProcessActionBox>0</stopProcessActionBox>
<stopProcessValue>1000</stopProcessValue>
<stopProcessUnitsBox>-1</stopProcessUnitsBox>
<selectedLanguage>Z:\home\valere\.local\bin\RatioMaster\lng\1english.lng</selectedLanguage>
<bindToIp>default</bindToIp>
<minimizeTotray>true</minimizeTotray>
<ignoreTimeout>false</ignoreTimeout>
<useUPnP>false</useUPnP>
<savePeerList>false</savePeerList>
</ApplicationSettings>

Binary file not shown.

106
home/bashrc/.bashrc Normal file
View File

@@ -0,0 +1,106 @@
# .linux-env
VIDEO_DIR_LOCAL="/home/valere/Downloads"
IMAGE_DIR_LOCAL="/home/valere/Downloads"
MUSIC_DIR_LOCAL="/home/valere/evilspins/web/mnt/media/files/music"
VIDEO_PATH="/home/root/media/video/autre"
IMAGE_PATH="/home/root/media/image/screenshit"
MUSIC_DIR="/home/root/media/files/music"
dlvideo() {
cd "$VIDEO_DIR" || return
pip install -U yt-dlp
yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4" --merge-output-format mp4 "$@"
}
dlimage() {
wget -P "$IMAGE_DIR" "$1"
}
dlcover() {
query_or_file="$1"
manual_url="$2"
if [ -f "$query_or_file" ]; then
file="$query_or_file"
elif echo "$query_or_file" | grep -q '%(ext)'; then
file="$query_or_file"
else
file=$(find "$MUSIC_DIR" -type f \
\( -iname "*${query_or_file}*.mp3" -o -iname "*${query_or_file}*.m4a" -o -iname "*${query_or_file}*.flac" -o -iname "*${query_or_file}*.wav" -o -iname "*${query_or_file}*.ogg" \) \
| head -n 1)
fi
if [ -z "$file" ]; then
echo "❌ Aucun fichier trouvé pour: $query_or_file"
return 1
fi
base="${file%.*}"
if [ -n "$manual_url" ]; then
curl -s "$manual_url" -o "${base}.jpg"
echo "${base}.jpg saved from manual URL (fichier: $file)"
return
fi
artist_raw=$(echo "$base" | awk -F'__' '{print $2}')
title_raw=$(echo "$base" | awk -F'__' '{for(i=3;i<=NF;i++){printf (i>3?" ":""); printf $i}}')
artist=$(echo "$artist_raw" | tr '_' ' ')
title=$(echo "$title_raw" | tr '_' ' ')
query_enc=$(jq -rn --arg s "$artist $title" '$s|@uri')
it_url="https://itunes.apple.com/search?term=${query_enc}&entity=song&limit=1"
art=$(curl -s "$it_url" | jq -r '.results[0].artworkUrl100')
if [ -n "$art" ] && [ "$art" != "null" ]; then
art_hi=$(echo "$art" | sed 's/100x100bb/1000x1000bb/')
curl -s "$art_hi" -o "${base}.jpg"
echo "${base}.jpg saved from iTunes (fichier: $file)"
return
fi
api_key="5ae5d1212599f96ffa799e21da1b2a7a38274c94bb5ae8ad26ce8d5b08528aaa"
url=$(curl -s "https://serpapi.com/search.json?engine=google&q=${query_enc}&tbm=isch&api_key=${api_key}" \
| jq -r '.images_results[0].original')
if [ -n "$url" ] && [ "$url" != "null" ]; then
curl -s "$url" -o "${base}.jpg"
echo "${base}.jpg saved from Google Images (fichier: $file)"
else
echo "❌ No cover found for $artist - $title (fichier: $file)"
fi
}
dlmusic() {
mkdir -p "$MUSIC_PATH"
NOW=$(date +"%Y%m%d%H")
URL="$1"
# Récupère le titre
TITLE=$(yt-dlp --get-title "$URL")
# Transforme le titre pour le nom de fichier
SAFE_TITLE="${TITLE// - /__}"
SAFE_TITLE="${SAFE_TITLE// /_}"
TRACK_NAME="$MUSIC_PATH/${NOW}__${SAFE_TITLE}.%(ext)s"
# Téléchargement
yt-dlp -x --audio-format mp3 -o $TRACK_NAME "$URL"
dlcover $TRACK_NAME
}
search() {
find ./ -iname "*$1*"
}
searchinside() {
grep -rwl "$1" ./
}
alias evilsync='rsync -avz --delete -e ssh $MUSIC_DIR_LOCAL root@erudi.fr:$MUSIC_DIR'
alias evildiff='rsync -avzn --delete -e ssh $MUSIC_DIR_LOCAL root@erudi.fr:$MUSIC_DIR'
# end .linux-env

4
home/bashrc/install.sh Normal file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
sed -i '/# .linux-env/,/# .linux-env/d' ~/.bashrc
cat ~/.linux-env/bashrc/.bashrc >> ~/.bashrc

View File

@@ -0,0 +1,94 @@
#!/usr/bin/env python3
import evdev
import subprocess
import time
DEVICE_NAMES = ["8BitDo NGC Modkit"]
BUTTON_MAP = {
"304": "Return", # A
"305": None, # B (non utilisé)
"311": "Alt_L", # R
"307": "Right", # X
"308": "Left", # Y
# 318 (BTN_THUMBR) sera géré à part
}
def find_device():
for path in evdev.list_devices():
try:
dev = evdev.InputDevice(path)
if any(dn in dev.name for dn in DEVICE_NAMES):
return path
except Exception:
continue
return None
def is_dolphin_running():
try:
output = subprocess.check_output(["flatpak", "ps"]).decode()
return "org.DolphinEmu.dolphin-emu" in output
except Exception:
return False
def press_key(key, press):
# press=True -> key down, press=False -> key up
action = "keydown" if press else "keyup"
subprocess.run(["xdotool", action, key])
def handle_device(dev_path):
dev = evdev.InputDevice(dev_path)
try:
for event in dev.read_loop():
if event.type != evdev.ecodes.EV_KEY:
continue
key_code = str(event.code)
# cas spécial : joystick jaune (BTN_THUMBR, code 318)
if key_code == "318" and event.value == 1: # pression
press_key("Alt_L", True)
time.sleep(0.02)
press_key("Escape", True)
time.sleep(0.05)
press_key("Escape", False)
press_key("Alt_L", False)
continue
if key_code in BUTTON_MAP:
mapped_key = BUTTON_MAP[key_code]
if mapped_key is not None:
press_key(mapped_key, event.value == 1)
except OSError:
dev.close()
raise
def main():
connected = False
time.sleep(5) # délai pour que le serveur graphique soit prêt
while True:
dev_path = find_device()
if dev_path and not connected:
print(f"[+] Manette connectée: {dev_path}")
connected = True
if not is_dolphin_running():
try:
subprocess.Popen(["flatpak", "run", "org.DolphinEmu.dolphin-emu"])
except Exception as e:
print(f"[!] Impossible de lancer Dolphin: {e}")
try:
handle_device(dev_path)
except OSError:
print("[-] Manette déconnectée")
connected = False
try:
subprocess.Popen(["flatpak", "kill", "org.DolphinEmu.dolphin-emu"])
except Exception as e:
print(f"[!] Impossible de tuer Dolphin: {e}")
elif not dev_path and connected:
print("[-] Manette déconnectée")
connected = False
time.sleep(1)
if __name__ == "__main__":
main()

77
home/gamecube-pad/install.sh Executable file
View File

@@ -0,0 +1,77 @@
#!/bin/bash
set -e
PYTHON_SCRIPT="$HOME/.local/bin/gamecube-pad.py"
AUTOSTART_DIR="$HOME/.config/autostart"
AUTOSTART_FILE="$AUTOSTART_DIR/gamecube-pad.desktop"
SILENT=false
if [[ "$1" == "silent" ]]; then
SILENT=true
fi
log() {
if [ "$SILENT" = false ]; then
echo "$@"
fi
}
check_and_install_deps() {
for pkg in evdev uinput; do
if ! python3 -c "import $pkg" &>/dev/null; then
log "[!] Dépendance manquante : $pkg. Installation avec pip..."
python3 -m pip install --user "$pkg" &>/dev/null
fi
done
for cmd in xdotool wmctrl; do
if ! command -v "$cmd" &>/dev/null; then
log "[!] Commande manquante : $cmd. Merci de linstaller via votre gestionnaire de paquets."
fi
done
}
install_script() {
check_and_install_deps
log "[+] Copie du script Python..."
mkdir -p "$(dirname "$PYTHON_SCRIPT")"
cp "$HOME/.linux-env/gamecube-pad/gamecube-pad.py" "$PYTHON_SCRIPT"
chmod +x "$PYTHON_SCRIPT"
log "[+] Création du fichier autostart..."
mkdir -p "$AUTOSTART_DIR"
cat > "$AUTOSTART_FILE" <<EOF
[Desktop Entry]
Type=Application
Exec=$PYTHON_SCRIPT
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=GameCube Pad
Comment=Lance le script GameCube Pad au démarrage
EOF
log "[✓] Installation terminée. Le script se lancera automatiquement à l'ouverture de session."
}
uninstall_script() {
log "[+] Suppression du script Python et autostart..."
rm -f "$PYTHON_SCRIPT"
rm -f "$AUTOSTART_FILE"
log "[✓] Désinstallation terminée."
}
case "$1" in
uninstall)
uninstall_script
;;
silent)
SILENT=true
uninstall_script &>/dev/null
install_script &>/dev/null
;;
*)
install_script
;;
esac

16
home/install.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
set -e
# Chemin de base : le dossier où se trouve ce script
BASE_DIR="$(dirname "$(realpath "$0")")"
echo "[+] Recherche et exécution des install.sh..."
# Boucle récursive sur tous les fichiers install.sh
find "$BASE_DIR" -type f -name "install.sh" ! -path "$BASE_DIR/install.sh" | while read -r script; do
echo "[+] Lancement : $script"
chmod +x "$script"
"$script"
done
echo "[✓] Tous les install.sh ont été exécutés."

7
pre-commit Normal file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
# install bashrc if bashrc git edited
if git diff --quiet home/bashrc/.bashrc; then
else
./home/bashrc/install.sh
fi