Memo de grep com expressões regulares para extrair URLs do YouTube de texto contínuo e depois usar yt-dlp

6 min

language: ja bn en es hi pt ru zh-cn zh-tw

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.