Memo de grep com expressões regulares para extrair URLs do YouTube de texto contínuo e depois usar yt-dlp
Boa noite, sou um incompetente.
Ao despejar postagens do Mastodon, fica assim:
/\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\"
E eu quero extrair apenas as URLs do YouTube dessa sequência contínua de caracteres.
grep -oP ‘youtube.com\/watch\?v=…………’ outbox.json > mstv.txt
grep -oP ‘youtube.com\/shorts\/…………’ outbox.json > mstv2.txt
Por enquanto, é chato distinguir entre com e sem www, então vou apenas corresponder a partir de youtube.com e substituir depois.
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\
Ainda não olhei em detalhes, mas por algum motivo, alguns têm um caractere cortado e uma barra invertida \, então vou removê-los com 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 fica assim, vou tentar contar os caracteres da string da URL correta.
echo “youtube.com/watch?v=g5HQFrSk4OA” | wc -c
32
Parece ter 32 caracteres.
Então, vou extrair apenas os de 32 caracteres.
grep -oP ‘^.{32}$’ mstv.txt > mstvtmp.txt
Está escrito como se tivesse tido sucesso, mas quando re-verifiquei, não funcionou. Funcionou quando mudei 32 para 31. Por que? Alguém pode me dizer?
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 há duplicações assim...
Vou remover as linhas duplicadas com uniq.
uniq mstvtmp.txt > newmstv.txt
Por precaução, vou procurar por itens não duplicados e adicioná-los.
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
Ok.
Então, vou tentar fazer o download com yt-dlp.
Desta vez, vou salvar no 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
No ponto acima, estou substituindo por URLs com www.
Alguns podem dizer: "Ah, é só usar ^ para o início da string de busca!", mas pessoalmente, gosto mais dessa abordagem porque substituir a partir do meio da string parece ter maior reprodutibilidade.
Além disso, como há barras /, estou usando | para delimitar no sed. Não precisa ser |, mas é o que estou usando.
E então, vamos nomeá-lo no formato .sh.
mv newmstv.txt ytdl.sh
vi ytdl.sh
E adicionamos #!/bin/bash.
Vamos dar permissão de execução.
chmod +x ./ytdl.sh
(Aqui, o homem que de repente pensou "Tenho que fazer com ./!" e o faz agora. Não muda nada sem ele, mas se não colocar, é desqualificado como homem.)
Depois disso, é só executar e está ok.
A propósito, deve haver uma maneira de extrair perfeitamente a string da URL na fase inicial do grep. Ainda sou muito amador, então, por favor, me perdoem. Ainda nem investiguei o porquê, então acho que estou fazendo as coisas de uma maneira complicada, mas esta é uma sessão para se divertir digitando vários comandos.
Fim.