Guida per riprodurre video di Mastodon su computer lenti (e sul Fediverso in generale)
Un PC vecchiotto su Mastodon e piattaforme come PeerTube (alternativa a Youtube) fa fronte a video che vanno lenti o si bloccano perché sono sopra i 720p (o sono HD o 4K, ecc.)
Se ti capita spesso di dover guardare video linkati sul web (ad esempio istanze Mastodon, Pixelfed o archivi online) ma non vuoi scaricarli per intero sul PC, né attendere che la tua CPU finisca di convertirli per poi riprodurli, rendendo la vita sul Fediverso insostenibile o noiosa, questa guida fa al caso tuo.
Ho creato tramite Gemini IA uno script Bash interattivo che permette di fare streaming immediato limitando la risoluzione a 480p (ideale per risparmiare banda e risorse oltre che a poter riprodurre un video su un PC vecchiotto). In più, lo script tiene traccia dei video aperti durante la sessione, salvandoli come file temporanei, così puoi riguardarli al volo senza reinserire il link fino al prossimo riavvio del computer, in modo da non occupare memoria sul PC.
PROCEDURA PER LINUX E MACOS (TESTATA E FUNZIONANTE AL 100%)
📋 Requisiti preliminari
Per
funzionare, lo script ha bisogno di due programmi leggeri e
popolarissimi nel mondo Linux/macOS. Se non li hai già, apri il
terminale e digita sudo
apt install mpv yt-dlp.
mpv: Un lettore video a riga di comando minimale e potentissimo.
yt-dlp: Il motore che permette a
mpvdi leggere i link web ed estrarre i flussi video al volo.
🛠️ Passaggio 1: Creare lo Script
Apri il tuo editor di testo preferito (es. Nano, Gedit, VS Code) e crea un nuovo file chiamato
guarda_video.sh.Incolla all'interno questo codice:
#!/bin/bash
CRONOLOGIA_FILE="/tmp/cronologia_video.txt"
touch "$CRONOLOGIA_FILE"
# Selezione automatica dei formati video
FORMATO_GENERICO='bv*[height<=480]+ba/b[height<=480]/bv*+ba/b'
apri_video() {
local url="$1"
local lista audio_id video_id
local audio_url video_url codice
echo
echo "======================================"
echo " Analisi dei formati video e audio"
echo "======================================"
lista=$(yt-dlp -4 -F "$url" 2>/dev/null)
# Individua una traccia audio separata, tipica di PeerTube
audio_id=$(echo "$lista" |
awk '$1 ~ /^Audio_only/ {print $1; exit}')
# Cerca il formato video più alto fino a 480p
video_id=$(echo "$lista" |
awk '$1 ~ /^[0-9]+p/ {
h=$1
sub(/p.*/, "", h)
print h, $1
}' |
sort -n |
awk '$1 <= 480 {best=$2} END {print best}')
# Se non esistono formati fino a 480p, usa il più basso disponibile
if [ -z "$video_id" ]; then
video_id=$(echo "$lista" |
awk '$1 ~ /^[0-9]+p/ {
h=$1
sub(/p.*/, "", h)
print h, $1
}' |
sort -n |
head -1 |
awk '{print $2}')
fi
# Se esistono sia video sia audio separati, recupera entrambi
if [ -n "$video_id" ] && [ -n "$audio_id" ]; then
echo "Formato video individuato: $video_id"
echo "Formato audio individuato: $audio_id"
echo
echo "Recupero degli URL diretti..."
video_url=$(yt-dlp -4 -f "$video_id" -g "$url" 2>/dev/null |
head -1)
audio_url=$(yt-dlp -4 -f "$audio_id" -g "$url" 2>/dev/null |
head -1)
if [ -n "$video_url" ] && [ -n "$audio_url" ]; then
echo "Avvio di mpv con audio separato..."
mpv \
--no-ytdl \
--audio-file="$audio_url" \
--hwdec=no \
--vd-lavc-skiploopfilter=all \
--framedrop=vo \
--sid=no \
--cache=yes \
--demuxer-max-bytes=100M \
"$video_url"
codice=$?
echo
echo "mpv terminato con codice: $codice"
read -r -p "Premi Invio per continuare..."
return
fi
echo "Non è stato possibile recuperare entrambe le tracce."
echo "Provo la riproduzione standard..."
fi
# Piano B: riproduzione tramite yt-dlp integrato in mpv
echo "Tentativo di riproduzione standard..."
mpv \
--ytdl=yes \
--ytdl-format="$FORMATO_GENERICO" \
--ytdl-raw-options="force-ipv4=,socket-timeout=60" \
--hwdec=no \
--vd-lavc-skiploopfilter=all \
--framedrop=vo \
--sid=no \
--cache=yes \
--demuxer-max-bytes=100M \
"$url"
codice=$?
echo
echo "mpv terminato con codice: $codice"
read -r -p "Premi Invio per continuare..."
}
mostra_archivio() {
if [ -s "$CRONOLOGIA_FILE" ]; then
echo "======================================"
echo " Video aperti in precedenza:"
echo "======================================"
local i=1
local -a mappa_link=()
while IFS= read -r link; do
[ -z "$link" ] && continue
printf " [%d] %s\n" "$i" "${link:0:100}"
mappa_link[$i]="$link"
i=$((i + 1))
done < "$CRONOLOGIA_FILE"
echo " [n] Inserisci un NUOVO link video"
echo "======================================"
read -r -p "Scegli un numero oppure n: " SCELTA
if [[ "$SCELTA" =~ ^[0-9]+$ ]] &&
[ -n "${mappa_link[$SCELTA]:-}" ]; then
apri_video "${mappa_link[$SCELTA]}"
return 1
elif [[ "$SCELTA" == "n" ||
"$SCELTA" == "N" ||
-z "$SCELTA" ]]; then
return 0
else
echo "Scelta non valida."
read -r -p "Premi Invio per continuare..."
return 1
fi
fi
return 0
}
# Mostra la cronologia
mostra_archivio
risultato=$?
if [ "$risultato" -eq 1 ]; then
exit 0
fi
# Richiede il link del video
echo
read -r -p "Inserisci il link del video: " VIDEO_URL
if [ -z "$VIDEO_URL" ]; then
echo "Errore: nessun link inserito."
read -r -p "Premi Invio per chiudere..."
exit 1
fi
# Salva il link senza creare duplicati
grep -qxF "$VIDEO_URL" "$CRONOLOGIA_FILE" ||
echo "$VIDEO_URL" >> "$CRONOLOGIA_FILE"
# Avvia il video
apri_video "$VIDEO_URL"
Salva e chiudi il file.
⚙️ Passaggio 2: Dare i permessi di esecuzione
I file di script appena creati non possono essere avviati subito per motivi di sicurezza. Devi dire al sistema operativo che questo file è un programma eseguibile.
Apri il terminale nella cartella in cui hai salvato il file e scrivi:
chmod +x guarda_video.sh
🚀 Passaggio 3: Come usarloOgni volta che vuoi guardare un video, avvia lo script dal terminale digitando:
./guarda_video.sh
La prima volta che lo apri: Ti chiederà semplicemente
Inserisci il link del video MP4:. Incolla l'URL del video, premi Invio e il video si aprirà istantaneamente ridimensionato a 480p.Le volte successive: Prima di chiederti un nuovo link, lo script ti mostrerà l'elenco numerato di tutti i video che hai aperto da quando hai acceso il computer. Ti basterà digitare il numero corrispondente per riguardarne uno, oppure premere
nper inserirne uno nuovo.
PROCEDURA PER WINDOWS (NON TESTATA)
Come riprodurre i video di PeerTube su Windows con MPV e yt-dlp
Questa guida spiega come creare un piccolo programma per riprodurre i video di PeerTube su Windows, utilizzando MPV e yt-dlp.
Lo script cerca di riprodurre separatamente la traccia video e quella audio, quando sono disponibili, privilegiando la risoluzione di 480p o inferiore. Se non riesce a individuare entrambe le tracce, tenta la riproduzione standard. Mantiene inoltre una cronologia dei video aperti.
1. Installare MPV e yt-dlp
Per prima cosa, installa questi due programmi:
MPV, il lettore multimediale: https://mpv.io/installation/
yt-dlp, il programma che individua i flussi audio e video: https://github.com/yt-dlp/yt-dlp/releases
Assicurati che entrambi siano accessibili da PowerShell tramite i comandi mpv e yt-dlp. Puoi verificarlo aprendo PowerShell e digitando:
mpv --version
yt-dlp --versionSe vengono visualizzate le versioni dei programmi, puoi procedere. Se Windows segnala che i comandi non sono riconosciuti, devi completare l'installazione o aggiungere le rispettive cartelle al PATH.
2. Creare lo script
Apri il Blocco note di Windows.
Copia e incolla tutto il codice riportato qui sotto.
Seleziona File → Salva con nome.
Scegli il Desktop come destinazione.
Nel campo del nome del file scrivi
guarda_video.ps1.Nel campo Salva come seleziona Tutti i file.
Salva il documento.
È importante che il file termini in .ps1, non in .txt.
3. Codice completo da incollare nel Blocco note
# ==========================================
# RIPRODUTTORE PEERTUBE CON MPV E YT-DLP
# Seleziona video e audio separati quando possibile
# ==========================================
$CronologiaFile = Join-Path $env:TEMP "cronologia_video.txt"
$FormatoGenerico = "bv*[height<=480]+ba/b[height<=480]/bv*+ba/b"
if (-not (Get-Command mpv -ErrorAction SilentlyContinue)) {
Write-Host "ERRORE: MPV non e' installato o non e' presente nel PATH."
Read-Host "Premi Invio per chiudere"
exit 1
}
if (-not (Get-Command yt-dlp -ErrorAction SilentlyContinue)) {
Write-Host "ERRORE: yt-dlp non e' installato o non e' presente nel PATH."
Read-Host "Premi Invio per chiudere"
exit 1
}
if (-not (Test-Path $CronologiaFile)) {
New-Item -ItemType File -Path $CronologiaFile -Force | Out-Null
}
function Apri-Video {
param([string]$Url)
Write-Host ""
Write-Host "======================================"
Write-Host " Analisi dei formati video e audio"
Write-Host "======================================"
Write-Host "Controllo i formati disponibili..."
$lista = (& yt-dlp -4 -F $Url 2>$null | Out-String)
# Individua la prima traccia audio separata
$audioId = $null
foreach ($riga in ($lista -split "`r?`n")) {
if ($riga -match '^\s*(Audio_only\S*)\s') {
$audioId = $Matches[1]
break
}
}
# Individua le risoluzioni video disponibili
$formatiVideo = @()
foreach ($riga in ($lista -split "`r?`n")) {
if ($riga -match '^\s*(\d+)p\s') {
$altezza = [int]$Matches[1]
$id = "$altezza" + "p"
$formatiVideo += [PSCustomObject]@{
Altezza = $altezza
Id = $id
}
}
}
# Preferisce la risoluzione più alta fino a 480p
$videoScelto = $formatiVideo |
Where-Object { $_.Altezza -le 480 } |
Sort-Object Altezza -Descending |
Select-Object -First 1
# Se non esistono formati fino a 480p, usa il più piccolo
if (-not $videoScelto) {
$videoScelto = $formatiVideo |
Sort-Object Altezza |
Select-Object -First 1
}
$videoId = $null
if ($videoScelto) {
$videoId = $videoScelto.Id
}
if ($videoId -and $audioId) {
Write-Host "Formato video individuato: $videoId"
Write-Host "Formato audio individuato: $audioId"
Write-Host ""
Write-Host "Recupero gli indirizzi delle tracce..."
$videoUrl = @(& yt-dlp -4 -f $videoId -g $Url 2>$null |
Where-Object { $_ -match '^https?://' } |
Select-Object -First 1)
$audioUrl = @(& yt-dlp -4 -f $audioId -g $Url 2>$null |
Where-Object { $_ -match '^https?://' } |
Select-Object -First 1)
if ($videoUrl.Count -gt 0 -and $audioUrl.Count -gt 0) {
Write-Host "Avvio MPV con audio e video separati..."
& mpv --no-ytdl "--audio-file=$($audioUrl[0])" `
--hwdec=no `
--vd-lavc-skiploopfilter=all `
--framedrop=vo `
--sid=no `
--cache=yes `
--demuxer-max-bytes=100M `
$videoUrl[0]
Write-Host ""
Write-Host "MPV terminato con codice: $LASTEXITCODE"
Read-Host "Premi Invio per continuare"
return
}
Write-Host "Non sono riuscito a recuperare entrambe le tracce."
Write-Host "Provo la riproduzione standard..."
}
Write-Host "Avvio la riproduzione standard con MPV..."
& mpv --ytdl=yes "--ytdl-format=$FormatoGenerico" `
"--ytdl-raw-options=force-ipv4=,socket-timeout=60" `
--hwdec=no `
--vd-lavc-skiploopfilter=all `
--framedrop=vo `
--sid=no `
--cache=yes `
--demuxer-max-bytes=100M `
$Url
Write-Host ""
Write-Host "MPV terminato con codice: $LASTEXITCODE"
Read-Host "Premi Invio per continuare"
}
# ==========================================
# CRONOLOGIA DEI VIDEO
# ==========================================
$videoPrecedenti = @(
Get-Content $CronologiaFile |
Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
)
if ($videoPrecedenti.Count -gt 0) {
Write-Host "======================================"
Write-Host " Video aperti in precedenza:"
Write-Host "======================================"
for ($i = 0; $i -lt $videoPrecedenti.Count; $i++) {
$numero = $i + 1
$link = $videoPrecedenti[$i]
if ($link.Length -gt 100) {
$link = $link.Substring(0, 100) + "..."
}
Write-Host " [$numero] $link"
}
Write-Host " [n] Inserisci un NUOVO link video"
Write-Host "======================================"
$scelta = Read-Host "Scegli un numero oppure n"
if ($scelta -match '^\d+$') {
$indice = [int]$scelta - 1
if ($indice -ge 0 -and $indice -lt $videoPrecedenti.Count) {
Apri-Video $videoPrecedenti[$indice]
exit
}
else {
Write-Host "Scelta non valida."
Read-Host "Premi Invio per chiudere"
exit 1
}
}
elseif ($scelta -and $scelta -notin @("n", "N")) {
Write-Host "Scelta non valida."
Read-Host "Premi Invio per chiudere"
exit 1
}
}
# ==========================================
# NUOVO VIDEO
# ==========================================
Write-Host ""
$url = Read-Host "Inserisci il link del video"
if ([string]::IsNullOrWhiteSpace($url)) {
Write-Host "Errore: nessun link inserito."
Read-Host "Premi Invio per chiudere"
exit 1
}
if (-not ($videoPrecedenti -contains $url)) {
Add-Content -Path $CronologiaFile -Value $url
}
Apri-Video $url4. Avviare il programma
Dopo aver salvato il file, apri PowerShell e digita questi due comandi, uno alla volta:
cd "$HOME\Desktop"
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\guarda_video.ps1"Si aprirà il programma nel terminale.
Se non hai ancora una cronologia, ti verrà chiesto di inserire il link di un video.
Se hai già aperto dei video, potrai selezionarne uno dall'elenco oppure digitare
nper inserire un nuovo link.MPV cercherà di riprodurre il video con la traccia audio separata, quando disponibile; altrimenti tenterà la modalità standard.
5. Dove viene salvata la cronologia?
La cronologia viene conservata nel file temporaneo di Windows:
%TEMP%\cronologia_video.txt
Non devi crearlo manualmente: lo script lo crea automaticamente. Se elimini questo file, perderai l'elenco dei video precedenti.
6. Problemi comuni
PowerShell dice che mpv o yt-dlp non è riconosciuto.
Il programma non è installato correttamente oppure la sua cartella non è inclusa nel PATH. Verifica prima i due comandi indicati nella sezione 1.
Il video parte senza audio oppure non parte affatto.
Non tutte le istanze PeerTube espongono i flussi allo stesso modo. Lo script prova a individuare le tracce separate e, se non riesce, passa alla riproduzione standard. Non è garantito che funzioni con ogni video o istanza.
Windows blocca l'esecuzione dello script.
Il comando di avvio riportato sopra usa -ExecutionPolicy Bypass solo per quella specifica esecuzione di PowerShell, senza modificare in modo permanente i criteri del sistema.
Nota: questo script è pensato per riprodurre i video, non per scaricarli. Per funzionare correttamente richiede una versione di yt-dlp compatibile con l'istanza PeerTube utilizzata e un'installazione funzionante di MPV.
Commenti
Posta un commento