A la cool : Bricolage autour de youtube-dl

Salut les filles,

Bon j’ai décidé de me faire un article à la cool, je suis crevé (boulot, petit, grève dans les transports), soyez indulgent svp.

J’ai besoin de vous en mode « on tape la discut ». J’ai Madame qui devient de plus en plus demandeuse de séries/émissions télé. Tout le monde connait le replay télé et à peu près tout le monde connait youtube-dl. Pour rappel youtube-dl gère bien plus que YouTube et il y a une interface graphique (youtube-dl-gui) si ça vous intéresse.

J’ai aussi mon beau-père qui sur ma recommandation s’est mis à Captvty car il consomme beaucoup de replay également. Beau papa est actuellement sur Windows mais bidouille de l’Arduino et s’intèresse beaucoup à GNU/Linux quand je lui en parle. Il va y venir hé hé hé.

Mon idée était la suivante :
1/ Créer un bookmarklet qui copie l’URL de la page où on se trouve (YouTube, francetv pluzz, ARTE+7, etc.) et l’envoie dans un fichier texte sur mon server@home
2/ Coller ce bookmarklet sur Firefox de femme, beau papa et moi
3/ Petit script youtube-dl et cron qui téléchargent les vidéos durant la nuit sur mon server@home
4/ Je ramène ensuite une clé USB à beau papa ou mieux je partage le dossier de vidéos grâce à Syncthing avec lui
5/ Je deviens le gendre parfait, il me fait un chèque pour acheter une île, je mv gentilbébédamour vendredi, je vis d’amour et d’eau fraiche au soleil avec ma petite famille

Le plan était parfait. Madame et beau papa n’ont qu’un clic à faire afin que je récupère l’URL de la vidéo qu’ils désirent et moi derrière j’automatise le truc sur mon server@home avec youtube-dl. Je pourrais aller plus loin car youtube-dl a le bon goût de laisser la possibilité de spécifier un downloader externe : aria2c, axel, curl, httpie, wget. Bref une fois ce bookmarklet en place je peux tout faire avec du curl, wget, youtube-dl, aria2 derrière.

Mais le plan n’est pas si parfait que ça puisque j’échoue à la première étape lol. Pour rappel un bookmarklet c’est comme un favori mais ça exécute du code (en général JavaScript sur les navigateurs). La page de Mozilla sur le sujet me semble un bon point de départ pour comprendre ce que c’est.

Alors maintenant je vais peut-être dire des bêtises mais à ce que j’ai compris avec du JavaScript on ne peut pas écrire dans un fichier local. Je me suis tourné vers PHP évidemment mais je galère (et j’ai eu peu de temps hier), je veux bien un coup de main de mes généreux lecteurs.

A l’heure actuelle, j’arrive à écrire dans un fichier sur le serveur mais je ne sais pas comment m’y prendre pour lui envoyer une URL et qu’il me l’écrive dans le fichier texte. Le code PHP ci-dessous est placé sur le serveur.

<?php
$text = 'C'est mon texte';
$filename = 'Liste.txt';
$fp = fopen($filename, 'w');
fwrite($fp, $text);
fclose($fp);
?>

La solution de repli c’est un fichier texte éditable comme ici (voir la page d’accueil très chouette), c’est un peu moins pratique mais je pense que ça sera quand-même utilisé par Madame et beau papa.

A titre d’info, voici les options les plus intéressantes de youtube-dl (on peut les mettre dans le fichier de configuration ~/.config/youtube-dl/config et pour rappel youtube-dl prend par défaut la vidéo de meilleure qualité).

-U, --update Update this program to latest version.  Make sure that you have sufficient permissions (run with sudo if needed)
-r, --rate-limit LIMIT Maximum download rate in bytes per second (e.g.  50K or 4.2M)
-a, --batch-file FILE File containing URLs to download ('-' for stdin)
-F, --list-formats List all available formats of requested videos
-f, --format FORMAT Video format code, see the "FORMAT SELECTION" for all the info
-o, --output "/home/babar/Vidéos/%(title)s.%(ext)s"

Merci de votre aide et de vos bonnes idées ! Évidemment si vous avez mieux je prends !

Déjà 20 avis pertinents dans A la cool : Bricolage autour de youtube-dl

  • On peut exécuter du PHP côté client dans le navigateur ? Première nouvelle, ou alors j’ai pas tout compris.

    Sinon, c’est PHP côté serveur, et JavaScript côté client. Rien de plus simple alors : transformer ton bout de PHP en « micro » WebService qui va prendre une requête POST qui contient l’URL et la coller dans un fichier pour que YouTube-dl fasse son taf.

    Une connerie du genre (attention, zéro sécurité) :

    
    

    Maintenant, attention, je fais ça au réveil, sans petit déjeuner, j’écris peut-être quelques grosses conneries. En tout cas, ça demande d’écouter en mode Web côté serveur, et d’avoir une requête POST à faire avec le bookmarklet côté client. Un truc pourri du style (piqué sur un site quelconque) :

    var xhr_object = null;
    if(window.XMLHttpRequest) // Firefox
    xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // Internet Explorer
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else { // XMLHttpRequest non supporté par le navigateur
    alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    return;
    }
    xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr_object.open("POST", "http://serverat.home/ytdl.php" ,false);
    data="adresse="+location.href;
    xhr_object.send(data);
    if(xhr_object.readyState == 4) alert("Requête effectuée !");
    

    Attention, tout ça toujours au réveil sans petit déjeuner, et surtout, pas du tout sûr de la partie JavaScript (mais c’est quelque chose qui m’intéresse :)

  • Bon ben il a pas aimé la partie PHP :/

    <?php
    //on controle un poil la partie $_POST quand même
    if (isset($_POST)) {
        if (isset($_POST['adresse'])) {
            $adresse = $_POST['adresse'];
        } else { die('On bricole pas SVP'); }
    } else { die('On bricole pas SVP'); }
    
    //on reprend le code d'écriture du fichier en ajoutant l'adresse récupérée
    $filename = 'Liste.txt';
    $fp = fopen($filename, 'w');
    fwrite($fp, $adresse);
    fclose($fp);
    
    ?>
  • Laurent
    Salut,

    Le temps de configurer un hôte virtuel et tester, je te propose ça mais en GET pour le bookmakrlet:

    javascript:window.open('http://www.cascador.lan?key=1234&url='+location)
    

    Tu passes donc une clé de sécurité à lire côté serveur pour autoriser ou non l’ajout de l’url passée en paramètre dans ton fichier texte.

    Côté serveur :

    
    
  • Laurent
    Tu peux reprendre le code de Seboss666 au niveau :

    
    

    L’url est automatiquement rajoutée à ton fichier sur une nouvelle ligne.
    J’ai écrit une grosse connerie (voir fwrite).

    Tu peux utiliser :

    fwrite($fp, $url."n");
    
  • Laurent
    C’est du javacript ça ? Tu as essayé avec le bootmarklet que j’ai t’ai indiqué ? Tu as l’url que je teste ?
  • Laurent
    Je pense avoir trouvé une solution.

    Contenu du bootmarklet :

    javascript:(function() {document.getElementsByTagName('head')[0].appendChild(document.createElement('script')).src='http://www.cascador.lan/youtube-dl.js';})();
    

    Donc sur une seule ligne, pour reprendre ton idée Seboss666, j’ai également utiliser une requête en ajax dont le code est déporté dans youtube-dl.js :

    var xhttp;
    
    if (window.XMLHttpRequest) {
        xhttp = new XMLHttpRequest();
        } else {
        // code for IE6, IE5
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    xhttp.open("GET", "http://www.cascador.lan", true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send("key=12345&url="+window.location);
    
    alert('Lien ajouté');
    

    J’avoue, c’est sale pour le message d’alerte, je n’attends pas le retour de la requête en ajax.

    Le lien est bien ajouté, il y a un retour vers l’utilisateur et plus de nouvel onglet ouvert pour rien. :)

  • Je me permet de déterrer un peu le sujet, après avoir testé moi-même maintenant que je commence à rebricoler autour de tout ça, plus ça va, et moins c’est fonctionnel à cause du CSP, ou du blocage de chargement HTTP sur une page HTTPS (bon ça encore je vais régler ça sous peu, mais ça n’empêche rien). Avec YouTube y’a même des chances que ça ne fonctionne pas du tout, et qu’on soit donc obligé de passer par autre chose.

    Bon après, j’ai d’autres trucs à tester, donc de mon côté, tant que j’ai SSH pour ajouter les URLs à la liste…

Les commentaires sont fermés.