Notas de grep con expresiones regulares para extraer URLs de YouTube de texto continuo y luego descargarlas con yt-dlp
Buenas noches, soy un inútil.
Cuando se descargan las publicaciones de Mastodon, se ven así.
/\u003e\u003ca href=\"https://youtube.com/watch?v=jL4NZ913v8E\u0026amp;feature=share\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003e\u003cspan class=\"invisible\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"ellipsis\"
Y quiero extraer solo las URLs de YouTube de esta cadena de texto continua.
grep -oP ‘youtube.com\/watch\?v=…………’ outbox.json > mstv.txt
grep -oP ‘youtube.com\/shorts\/…………’ outbox.json > mstv2.txt
Por ahora, es molesto distinguir entre con y sin "www", así que solo haré coincidir desde "youtube.com" en adelante y lo reemplazaré más tarde.
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p\
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p\
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg\
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg\
Todavía no lo he mirado de cerca, pero por alguna razón, algunas entradas tienen un carácter cortado y una barra invertida `\` insertada, así que lo eliminaré con sed -i.
sed -i ‘s/\\//g’ mstv.txt
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8p
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=W7G-QtbTWg
Como queda así, intentaré contar los caracteres de la cadena URL correcta.
echo “youtube.com/watch?v=g5HQFrSk4OA” | wc -c
32
Parece que tiene 32 caracteres.
Así que extraeré solo los de 32 caracteres.
grep -oP ‘^.{32}$’ mstv.txt > mstvtmp.txt
Está escrito como si hubiera tenido éxito, pero cuando lo volví a verificar, no funcionó. Funcionó cuando cambié 32 a 31. ¿Por qué? ¿Alguien puede decírmelo?
grep -oP ‘^.{31}$’ mstv.txt > mstvtmp.txt
youtube.com/watch?v=g5HQFrSk4OA
youtube.com/watch?v=g5HQFrSk4OA
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=RIqxyO3S8pc
Como se duplica así...
Eliminaré las líneas duplicadas con uniq.
uniq mstvtmp.txt > newmstv.txt
Por si acaso, buscaré los que no estén duplicados y los añadiré.
uniq -u mstvtmp.txt >> newmstv.txt
youtube.com/watch?v=jL4NZ913v8E
youtube.com/watch?v=g5HQFrSk4OA
youtube.com/watch?v=RIqxyO3S8pc
youtube.com/watch?v=W7G-QtbTWgs
youtube.com/watch?v=DRVp_cmW3Nw
¡Está bien!
Así que intentaré descargarlos con yt-dlp.
Esta vez, los guardaré en formato mp4.
sed -i ‘s|youtube|yt-dlp -o “/media/ncp/yt/n/%(title)s” -f “bv[ext=mp4]+ba[ext=m4a]” --merge-output-format mp4 https://www.youtube|g’ newmstv.txt
En el punto anterior, estoy reemplazando con URLs que tienen "www".
Algunos podrían decir: "¡Por qué no usar simplemente ^ para el inicio de la cadena de búsqueda!", pero personalmente, prefiero este método porque reemplazar desde una cadena en el medio parece tener una mayor reproducibilidad.
Además, como hay una `/`, estoy usando `|` para delimitar en sed. Aunque no tiene por qué ser `|`.
Y luego, vamos a nombrarlo en formato .sh.
mv newmstv.txt ytdl.sh
vi ytdl.sh
Y añadir #!/bin/bash.
Vamos a darle permisos de ejecución.
chmod +x ./ytdl.sh
(Aquí, de repente pensé "¡Debo hacerlo con ./!" y lo hice ahora. No cambia nada sin él, pero no incluirlo me convierte en un fracaso como hombre.)
Después de eso, ejecutarlo y listo.
Por cierto, debe haber una forma de extraer la cadena URL limpiamente en la primera etapa de grep. Todavía soy muy aficionado, así que por favor, perdónenme. Ni siquiera he investigado por qué, así que creo que estoy haciendo las cosas de una manera complicada, pero esta es una sesión sobre lo divertido que es escribir varios comandos.
Fin.