Baixar músicas com python + shell script
Eu queria baixar minhas músicas do osu! há um tempo, mas sempre soube que por serem muitas ia demorar para fazer manualmente. Então usei o python e um pouco de shell script para fazer isso.
Primeiro, tirei print de todas as músicas que queria baixar. Elas são assim:
[print]
Na parte superior tem o titulo da música e o artista, então usei o pytesseract para pegar essas informações de cada print tirada e gravar todas em um arquivo:
from PIL import Image
from pytesseract import pytesseract
import os
#Define path to tessaract.exe
path_to_tesseract = '/usr/bin/tesseract'
#Define path to image
path_to_image = '/mnt/Games/osu/Screenshots/screenshot031.jpg'
#Point tessaract_cmd to tessaract.exe
pytesseract.tesseract_cmd = path_to_tesseract
path_to_images = '/mnt/Games/osu/Screenshots/'
with open('osusongslist', 'w') as f:
f.write('')
for root, dirs, file_names in os.walk(path_to_images):
#Iterate over each file_name in the folder
for file_name in file_names:
#Open image with PIL
img = Image.open(path_to_images + file_name)
#crop it
width, height = img.size
left = 43
top = 0
right = 1700
bottom = 33
im1 = img.crop((left, top, right, bottom))
#im1.show()
#Extract text from image
text = pytesseract.image_to_string(im1)
sept = '['
ntext = text.split(sept, 1)[0]
with open('osusongslist', 'a') as f:
f.write(text)
#f.write('\n')
print(text)
#pegar de onde eu tirei esse script
Depois com esse arquivo formatei o que tinha de resultado com grep + sed para tirar tudo depois [ e só manter as linhas que tinham ‘artista - musica’:
sed 's|\[.*||g' osusongslist | grep -oP ".* - .*" >> osusongslist
E finalmente, usei um pouco de shell script + ytdl para baixar as músicas:
#!/bin/bash
cat osusongslist | while read line
do
youtube-dl -i -o "%(title)s-%(id)s.%(ext)s" --embed-thumbnail --add-metadata -x -f bestaudio --audio-quality 0 --audio-format mp3 --default-search auto "$line"
done
Sei que poderia ter criado uma condição no python para colocar a linha no arquivo formatada, mas o objetivo era ser rápido, e como já estou acostumado com sed/grep, foi o que acabei usando.
Tempo para criar o script (com pesquisa, instalação do tesseract, etc) = 15 minutos
Tempo que o script demorou para baixar as músicas = 1h45m (143 músicas)