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.

  1. mpv: Un lettore video a riga di comando minimale e potentissimo.

  2. yt-dlp: Il motore che permette a mpv di leggere i link web ed estrarre i flussi video al volo.

🛠️ Passaggio 1: Creare lo Script

  1. Apri il tuo editor di testo preferito (es. Nano, Gedit, VS Code) e crea un nuovo file chiamato guarda_video.sh.

  2. 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"

  1. 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 usarlo

Ogni 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 n per 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:

Assicurati che entrambi siano accessibili da PowerShell tramite i comandi mpv e yt-dlp. Puoi verificarlo aprendo PowerShell e digitando:

mpv --version
yt-dlp --version

Se 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

  1. Apri il Blocco note di Windows.

  2. Copia e incolla tutto il codice riportato qui sotto.

  3. Seleziona File → Salva con nome.

  4. Scegli il Desktop come destinazione.

  5. Nel campo del nome del file scrivi guarda_video.ps1.

  6. Nel campo Salva come seleziona Tutti i file.

  7. 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 $url

4. 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 n per 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