Hola comunidad. ¿Un poco poético el título no? Pues nada, que hoy quiero compartir con ustedes mi método para hacer listas aleatorias para reproductores mp3.

mp3_icon2

Resulta que hace un tiempo me regalaron un reproductor de mp3 de los que reproduce todas las canciones que copias en su memoria. Me encanta escuchar música variada, pero escogerla ya es otro tema. Como casi todo programador soy bastante vago, así que decidí pasar el trabajo de escoger la música una sola vez. Tengo en mi computadora una carpeta que tiene muchísima música y no quería ir disco por disco diciendo que quería escuchar así que decidí hacer un script que lo hiciera por mi. Como ya podrán imaginar por el título del artículo vamos a programar en Python. Así que manos a la obra.

python_logo

Paso 1

Decirle a nuestro script de donde va a sacar la música. Decidí hacer esto haciendo una lista de carpetas para que nos permite copiar música de diferentes orígenes.

folders = ['/media/data/musica/AC-DC/','/media/data/musica/Led Zeppelin/', '/media/data/musica/The Rolling Stones/']

Paso 2

Inicializamos algunos parámetros

allmp3 = []    #lista de canciones resultado del algoritmo
limit = 300    #cantidad de canciones que queremos copiar
destination = '/media/akiel/music/'    #lugar donde queremos copiar las canciones
count = limit  #contador para poner el número del orden a las canciones en el destino

Paso 3

Ahora buscaremos en las carpetas seleccionadas todos los archivos mp3 para rellenar la lista allmp3

for folder in folders:
    for root, dirs, files in os.walk(folder):
        for i in files:
            if splitext(i)[1].upper() == '.MP3':
                allmp3.append(root+sep+i)

print len(allmp3), 'mp3 files found'

Paso 4

Ya que tenemos todas las canciones en nuestra lista así que vamos a copiar los archivos aleatoriamente hacia nuestro dispositivo. Utilizaremos la función sample de Python para que nos devuelva un iterador con una muestra aleatoria de nuestra lista de música e iremos copiando una a una hacia el destino (destination)

for i in sample(allmp3,limit):
    print 'copy', i, destination+str(count)+' - '+basename(i)
    copyfile(i, destination+str(count)+' - '+basename(i))
    count -= 1

Código Completo

Y eso fue todo. Aquí les dejo el código completo del script para que lo modifiquen a su gusto. Espero que resulte instructivo y como siempre: Happy Hacking!!!

# -*- coding: UTF-8 -*-
import os
from os.path import splitext, basename, sep
from random import sample
from shutil import copyfile

folders = ['/media/data/musica/AC-DC/','/media/data/musica/Led Zeppelin/', '/media/data/musica/The Rolling Stones/']
allmp3 = []
limit = 300
destination = '/media/akiel/music/'
count = limit

for folder in folders:
    for root, dirs, files in os.walk(folder):
        for i in files:
            if splitext(i)[1].upper() == '.MP3':
                allmp3.append(root+sep+i)

print len(allmp3), 'mp3 files found'

for i in sample(allmp3,limit):
    print 'copy', i, destination+str(count)+' - '+basename(i)
    copyfile(i, destination+str(count)+' - '+basename(i))
    count -= 1