¿Cómo crear un simulador de playlist de canciones?
La programación no tiene por qué ser un mar de instrucciones sin fin. Con planificación y creatividad, podemos desarrollar soluciones divertidas y prácticas, como un simulador de playlist de canciones. Este proyecto implica el uso de colas (queues) para gestionar la reproducción de canciones. Vamos a explorar cómo puedes implementarlo y qué aprendizajes puedes extraer de ello.
¿Por qué usar una estructura queue?
En este proyecto, se nos pide específicamente utilizar una cola. Las colas son estructuras de datos que operan bajo el principio de First In, First Out (FIFO), lo cual significa que el primer elemento en entrar es el primero en salir. Este enfoque es ideal para la simulación de playlists, ya que refleja cómo normalmente consumimos música: en el orden en que las canciones fueron añadidas.
¿Cómo se implementa la clase Track?
La clase Track se crea para definir los atributos de las canciones en nuestra playlist. A continuación, se muestra un ejemplo de cómo podría estructurarse esta clase:
from random import randint
classTrack:def__init__(self, title=None): self.title = title if title else"Unknown" self.duration = randint(5,6)# Duración aleatoria entre 5 y 6 segundos
En este ejemplo, cada canción tiene un título y una duración aleatoria de entre 5 y 6 segundos.
¿Qué es la clase MediaPlayerQueue?
La clase MediaPlayerQueue hereda de una estructura de cola basada en nodos. Incluye métodos para añadir y reproducir canciones:
import time
classMediaPlayerQueue(Queue):def__init__(self):super().__init__()defadd_track(self, track): self.enqueue(track)defplay(self):print(f"Hay {self.count()} canciones en la cola.")while self.head isnotNone: current_track = self.dequeue()print(f"Now playing: {current_track.title}") time.sleep(current_track.duration)# Simula la duración de la canción
La funcionalidad de la cola asegura que las canciones se reproduzcan en el orden de llegada.
¿Cómo instancio y pruebo el simulador de playlist?
# Importamos las clases necesariasfrom music_player import Track, MediaPlayerQueue
# Creamos instancias de las cancionestrack1 = Track("Highway to Hell")track2 = Track("Bohemian Rhapsody")track3 = Track("Like a Rolling Stone")track4 = Track("Hotel California")track5 = Track("Stairway to Heaven")track6 = Track("How to Disappear Completely")# Creamos la instancia de MediaPlayerQueueplayer = MediaPlayerQueue()# Añadimos las canciones a la colaplayer.add_track(track1)player.add_track(track2)player.add_track(track3)player.add_track(track4)player.add_track(track5)player.add_track(track6)# Reproducimos las cancionesplayer.play()
Este script genera un simulador básico de reproductor de música que reproduce canciones en el orden de inserción, ilustrando el funcionamiento de una cola.
¿Qué más se puede hacer?
Aunque este ejemplo básico cumple su función, siempre puedes extender la funcionalidad del reproductor:
Navegación avanzada: Implementar métodos para conocer cuál será la próxima canción.
Playlists dinámicas: Permitir la adición y eliminación de canciones en tiempo real.
Estadísticas de reproducción: Generar estadísticas sobre las canciones más reproducidas.
¿Qué aprendizaje puedes obtener?
Este ejercicio es una excelente oportunidad para cimentar conocimientos en estructuras de datos, programación orientada a objetos y manipulación de colas en Python. Además, te anima a ser creativo y considerar cómo las estructuras de datos pueden resolver problemas del mundo real. ¡Sigue explorando y aprendiendo, cada línea de código que escribes es un paso más hacia convertirte en un experto!
Mi solución al reto.
Utilice la estructura Queue basada en listas.
Creeu na clase MusicPlaylist con 4 métodos.
-Un método para agregar canciones mediante una tupla con su nombre, y duración(add_songs)
-Un método para reproducir solo una canción(play_song)
-Un método para reproducir todas las canciones dentro de la playlist
-Y un método para visualizar todas las canciones dentro de la playlist(all_songs)
import time
classListQueue: def __init__(self): self.items=[] self.size=0 def enqueue(self, data): self.items.insert(0, data) self.size+=1 def dequeue(self):if self.size<=0:return0 data = self.items.pop() self.size-=1return data
classMusicPlaylist(ListQueue): def __init__(self):super().__init__() def add_songs(self,song: tuple): self.enqueue(song) def play_song(self): song = self.dequeue()ifsong:print(f'Playing: {song[0]} for {song[1]} min') time.sleep(song[1])else:print('There are no more songs') def play_songs(self):while self.items: self.play_song() def all_songs(self):if self.items:print('The songs in the playlist are:')for i, song inenumerate(self.items[::-1],start=1):print(f'Song {i}: {song[0]}, Time: {song[1]}')print(f'There are {self.size} songs')return self.sizeif __name__ =='__main__': playlist =MusicPlaylist() playlist.add_songs(("REMEMBER",5.19)) playlist.add_songs(("comfy vibes",3.12)) playlist.add_songs(("Into the blue's",4.03)) playlist.add_songs(("E.M.A",4.16)) playlist.all_songs()print() playlist.play_songs()print() playlist.play_song() playlist.all_songs()
Outputs
The songs in the playlist are:Song1:REMEMBER,Time:5.19Song2: comfy vibes,Time:3.12Song3:Into the blue's,Time:4.03Song4:E.M.A,Time:4.16There are 4 songs
Playing:REMEMBERfor5.19 min
Playing: comfy vibes for3.12 min
Playing:Into the blue's for4.03 min
Playing:E.M.Afor4.16 min
There are no more songs
There are 0 songs
Terminado !!!
Use una estrucutra de DoubleWayNodes para hacer el Queue, me parece que estan hechos los DoubleWayNodes para estos tipos de usos, sencillos, rápidos y fácil de usar e implementar.
Ademas del metodo de agregar y "reproducir" canciones, agrege uno para poner en random la playlist, agregando los nodos al head o al tail.
Para resolver el reto cree una clase canción en la cual el usuario agrega el nombre, el cantante, el tiempo y en cualquier caso si canta con alguien más (ft).
Luego desarrolle una clase PlayList basada en nodos, ya que es mi forma de datos favorita de momento.
Tiene métodos para reproducir, agregar, buscar y reproducir, y reproducir toda la playlist sin eliminarla.
Mi GitHub del código: Python Playlist
No puedo creer todo lo que he aprendido en tan poco tiempo 🤩
Esta es mi solución:
classPlaylist: def __init__(self): self.canciones=[] self.lista_canciones=0 def insertar_cancion(self,data): self.canciones.insert(0,data) self.lista_canciones+=1 def reproducir_cancion(self): cancion = self.canciones.pop() self.lista_canciones-=1return cancion
def lista_canciones_completas(self): play_list_completo = self.lista_cancionesfor item inrange(play_list_completo):print(self.canciones[item])lista =Playlist()lista.insertar_cancion("Hey Jude")lista.insertar_cancion("Yellow Submarine")lista.insertar_cancion("Let it be")print("Cancion que se esta reproduciendo en el momento: ")print(lista.reproducir_cancion())print("Canciones que quedan en la lista de reproducción ")lista.lista_canciones_completas()
Print playlist:
Add to queue (Spotify):
If neccesary add in node_based_queue:
Reto
classTwoWayNode(object): def __init__(self, song_name =None, next =None, previous =None): self.song_name= song_name
self.next= next
self.previous= previous
classQueue: def __init__(self): self.head=None self.tail=None self.count=0 self.current= self.head def Add_song(self, song_name): new_node =TwoWayNode(song_name,None,None)if self.head is None: self.head= new_node
self.tail= self.headelse: new_node.previous= self.tail self.tail.next= new_node
self.tail= new_node
self.count+=1 def Reproduce(self):if self.head is None:print('No hay más canciones en la cola') self.current=NonereturnNone node2remove = self.headif self.count==1: self.count-=1 self.head=None self.tail=None elif self.count>1: self.head= self.head.next self.head.previous=None self.count-=1 self.current= node2remove
if self.head is None: self.current=Noneprint(f'reproduciendo {node2remove.song_name}')return node2remove.song_name
# Simulador de playlist musical
# Este programa simula una cola de reproducción de canciones con títulos y duraciones aleatorias.# Importar libreríasfrom random import randint # Para generar duraciones aleatorias de canciones
from time import sleep # Para simular el tiempo de reproducción de cada canción
# ClaseNode:Representa un nodo individual en la cola
classNode: def __init__(self, data): self.data= data # Datos almacenados en el nodo(en este caso, un objeto Track) self.next=None # Enlace al siguiente nodo en la cola
# ClaseQueue:Implementación básica de una cola basada en nodos
classQueue: def __init__(self): self.front=None # Apuntador al inicio de la cola
self.rear=None # Apuntador al final de la cola
self._count=0 # Contador interno de elementos en la cola
# Método para agregar un elemento al final de la cola
def enqueue(self, item): new_node =Node(item) # Crear un nuevo nodo con el item
if self.rear is None: # Si la cola está vacía
self.front= self.rear= new_node
else: # Si ya hay elementos, añadir al final
self.rear.next= new_node
self.rear= new_node
self._count+=1 # Incrementar el contador de elementos
# Método para eliminar y devolver el elemento del inicio de la cola
def dequeue(self):if self.front is None: # Si la cola está vacía, no hay nada que devolver
returnNone temp = self.front # Guardar el nodo del inicio
self.front= self.front.next # Mover el inicio al siguiente nodo
if self.front is None: # Si la cola queda vacía, ajustar el final
self.rear=None self._count-=1 # Decrementar el contador de elementos
return temp.data # Devolver los datos del nodo eliminado
# Propiedad para obtener la cantidad de elementos en la cola
@property
def count(self):return self._count # Retornar el número de elementos
# Método para verificar si la cola está vacía
def is_empty(self):return self.front is None # True si no hay elementos
# ClaseTrack:Representa una canción con título y duración
classTrack: def __init__(self, title=None): self.title= title # Título de la canción
self.length=randint(5,6) # Duración aleatoria entre 5 y 6segundos(simulando minutos) def __str__(self):return f"{self.title}" # Representación en cadena del título de la canción
# ClaseMediaPlayerQueue:Cola de reproducción que hereda de QueueclassMediaPlayerQueue(Queue): def __init__(self):super().__init__() # Inicializar la clase padre(Queue) # Método para agregar una canción a la cola de reproducción
def add_track(self, track): self.enqueue(track) # Usar enqueue de la clase padre para agregar la canción
# Método para reproducir todas las canciones en la cola
def play(self): # Mostrar la cantidad de canciones en la cola antes de reproducir
print(f"Total tracks in queue: {self.count}") # Reproducir mientras haya canciones en la cola
while not self.is_empty(): # Seguir hasta que la cola esté vacía
# Obtener la canción actual sacándola de la cola
current_track = self.dequeue() # Mostrar qué canción se está reproduciendo
print(f"Now playing: {current_track}") # Simular la duración de la canción con una pausa
sleep(current_track.length)# Instanciar la cola de reproducción
media_player =MediaPlayerQueue()# Agregar canciones a la cola de reproducción
media_player.add_track(Track("The Beatles - Let It Be"))media_player.add_track(Track("Queen - Bohemian Rhapsody"))media_player.add_track(Track("Lynyrd Skynyrd - Sweet Home Alabama"))# Reproducir la cola de reproducción
media_player.play()```*# Simulador de playlist musical# Este programa simula una cola de reproducción de canciones con títulos y duraciones aleatorias.**# Importar librerías*from random import randint *# Para generar duraciones aleatorias de canciones*from time import sleep *# Para simular el tiempo de reproducción de cada canción**# ClaseNode:Representa un nodo individual en la cola*classNode: def \_\_init\_\_(self, data): self.data= data *# Datos almacenados en el nodo(en este caso, un objeto Track)* self.next=None*# Enlace al siguiente nodo en la cola**# ClaseQueue:Implementación básica de una cola basada en nodos*classQueue: def \_\_init\_\_(self): self.front=None*# Apuntador al inicio de la cola* self.rear=None*# Apuntador al final de la cola* self.\_count =0*# Contador interno de elementos en la cola**# Método para agregar un elemento al final de la cola* def enqueue(self, item):new\_node =Node(item)*# Crear un nuevo nodo con el item*if self.rear is None:*# Si la cola está vacía* self.front= self.rear=new\_node else:*# Si ya hay elementos, añadir al final* self.rear.next=new\_node self.rear=new\_node self.\_count +=1*# Incrementar el contador de elementos**# Método para eliminar y devolver el elemento del inicio de la cola* def dequeue(self):if self.front is None:*# Si la cola está vacía, no hay nada que devolver*returnNone temp = self.front*# Guardar el nodo del inicio* self.front= self.front.next*# Mover el inicio al siguiente nodo*if self.front is None:*# Si la cola queda vacía, ajustar el final* self.rear=None self.\_count -=1*# Decrementar el contador de elementos*return temp.data*# Devolver los datos del nodo eliminado**# Propiedad para obtener la cantidad de elementos en la cola* @property def count(self):return self.\_count *# Retornar el número de elementos**# Método para verificar si la cola está vacía* def is\_empty(self):return self.front is None*# True si no hay elementos**# ClaseTrack:Representa una canción con título y duración*classTrack: def \_\_init\_\_(self, title=None): self.title= title *# Título de la canción* self.length=randint(5,6)*# Duración aleatoria entre 5 y 6segundos(simulando minutos)* def \_\_str\_\_(self):return f"{self.title}"*# Representación en cadena del título de la canción**# ClaseMediaPlayerQueue:Cola de reproducción que hereda de Queue*classMediaPlayerQueue(Queue): def \_\_init\_\_(self):super().\_\_init\_\_()*# Inicializar la clase padre(Queue)**# Método para agregar una canción a la cola de reproducción* def add\_track(self, track): self.enqueue(track)*# Usar enqueue de la clase padre para agregar la canción**# Método para reproducir todas las canciones en la cola* def play(self):*# Mostrar la cantidad de canciones en la cola antes de reproducir*print(f"Total tracks in queue: {self.count}")*# Reproducir mientras haya canciones en la cola*while not self.is\_empty():*# Seguir hasta que la cola esté vacía**# Obtener la canción actual sacándola de la cola* current\_track = self.dequeue()*# Mostrar qué canción se está reproduciendo*print(f"Now playing: {current\_track}")*# Simular la duración de la canción con una pausa*sleep(current\_track.length)*# Instanciar la cola de reproducción*media\_player =MediaPlayerQueue()*# Agregar canciones a la cola de reproducción*media\_player.add\_track(Track("The Beatles - Let It Be"))media\_player.add\_track(Track("Queen - Bohemian Rhapsody"))media\_player.add\_track(Track("Lynyrd Skynyrd - Sweet Home Alabama"))*# Reproducir la cola de reproducción*media\_player.play()
reto cumplido
from time import sleep
classNode:def__init__(self, data, child=None, parent=None): self.data = data
self.child:Node = child
self.parent:Node = parent
def__repr__(self):ifisinstance(self.child, Node):returnf"<Node({self.data}) {hex(id(self))}> -> Node({self.child.data})"else:returnf"<Node({self.data}) {hex(id(self))}> -> {self.child}"def__str__(self):ifisinstance(self.child, Node):returnf"Node({self.data}) -> {self.child.__str__()}"else:returnf"Node({self.data}) -> {self.child}"deflink_child(self, node):"""
tanto mi nodo hijo como tu nodo padre se relacionaran
""" self.child = node
node.parent = self
deflink_parent(self, node):"""
tanto mi nodo padre como tu nodo hijo se relacionaran
""" self.parent = node
node.child = self
defunlink_child(self):"""
tanto mi nodo padre como tu nodo hijo, rompen relacion y te lo devuelvo
""" child = self.child
child.parent =None self.child =Nonereturn child
defunlink_parent(self):"""
tanto mi nodo padre como tu nodo hijo, rompen relacion y te lo devuelvo
""" parent = self.parent
parent.child =None self.parent =Nonereturn parent
classQueue:def__init__(self): self.front:Node =None#head self.rear:Node =None#tail self.size =0def__repr__(self):returnf"<Queue({self.size}) {hex(id(self))}>"def__str__(self):if self.front:return self.front.__str__()else:return"None"def__iter__(self): probe = self.front
while probe:yield probe
probe = probe.child
defis_empty(self):returnnot(self.front and self.size >0)defenqueue(self, data):"""
agrego un nuevo elemento al final de la queue
""" new_node = Node(data)if self.rear: self.rear.link_child(new_node)else: self.front = self.rear = new_node
self.rear = new_node
self.size +=1defdequeue(self):"""
devuelvo el primer elemento agregado
"""if self.front ==None:returnNone remove_item = self.front
if remove_item.child: self.front = remove_item.unlink_child()else: self.front = self.rear =None self.size -=1return remove_item.data
classSong:def__init__(self, name:str, time:int=0): self.name = name
self.time = time
def__repr__(self):returnf"<Song({self.name}) {hex(id(self))}>"def__str__(self):returnf"cancion: {self.name}\n tiempo: {self.time} s"defminutes(self): minutos = self.time //60 segundos_restantes = self.time %60return minutos, segundos_restantes
playlist = Queue()playlist.enqueue(Song('Sebastián Yatra, Dalmata - Sutra',3*60+36))playlist.enqueue(Song('Sebastián Yatra - Traicionera',4*60+2))playlist.enqueue(Song('Reik, Maluma - Amigos Con Derechos',4*60+49))playlist.enqueue(Song('Cali Y El Dandee - Por Fin Te Encontré ft. Juan Magan, Sebastian Yatra',4*60+43))playlist.enqueue(Song('Joey Montana - Moribundo ft. De La Ghetto',4*60+5))defplay():whilenot playlist.is_empty(): song:Song = playlist.dequeue()min, seg = song.minutes()print(f"Reproduciendo({min}m {seg}s): {song.name}") sleep(song.time)play()
Mi solucion al reto 🤯▶️
(Añadir en el header # -*- coding: utf-8 -*- para mostrar caracteres especiales como el simbolo de play cuando se esta reproduciendo una canción)
import time
classSong():def__init__(self, name, artist,next=None, prev=None): self.name = name
self.artist = artist
self.next=next self.prev = prev
defshow(self): title =(self.name +" - "+ self.artist)return(title)classPlaylist():def__init__(self): self.head =None self.tail =None self.size =0defadd_song(self, name, artist): song = Song(name, artist)if self.head ==None: self.head = song
self.tail = song
else: song.prev = self.tail
self.tail.next= song
self.tail = song
self.size +=1defquit_song(self): current = self.head
if self.size <1:print("The playlist is empty")elif self.size ==1: self.head =None self.tail =None self.size -=1print(current.show()+" was deleted")return current
elif self.size >1: self.head = self.head.next self.head.prev =None self.size -=1print(current.show()+" was deleted")return current
defplay(self): i = self.size
played = self.head
while i >0:print("▶ "+ played.show()) played = played.next i -=1 time.sleep(2)```import time
classSong():def \_\_init\_\_(*self*,*name*,*artist*,*next*=None,*prev*=None):*self*.name =*name**self*.artist =*artist**self*.next=*next**self*.prev =*prev*defshow(*self*): title =(*self*.name +" - "+*self*.artist)return(title)classPlaylist():def \_\_init\_\_(*self*):*self*.head =None*self*.tail =None*self*.size =0def add\_song(*self*,*name*,*artist*): song = Song(*name*,*artist*)if*self*.head ==None:*self*.head = song *self*.tail = song else: song.prev =*self*.tail *self*.tail.next= song *self*.tail = song *self*.size +=1def quit\_song(*self*): current =*self*.head if*self*.size <1:print("The playlist is empty")elif*self*.size ==1:*self*.head =None*self*.tail =None*self*.size -=1print(current.show()+" was deleted")return current elif*self*.size >1:*self*.head =*self*.head.next*self*.head.prev =None*self*.size -=1print(current.show()+" was deleted")return current defplay(*self*): i =*self*.size played =*self*.head while i >0:print("▶ "+ played.show()) played = played.next i -=1 time.sleep(2)
Buen dia, resultado en el repositorio de GitHub.
enter link description here
Gran parte del resultado fue…
reto de crear la playlist
Mi solución al reto
from colas_queue importListQueueclassSong: def __init__(self, title, artist, duration): self.title= title
self.artist= artist
self.duration= duration
def __str__(self):return f"{self.title} - {self.artist}: {self.duration}"classPlaylist: def __init__(self): self.queue=ListQueue() def add_song(self, song): self.queue.enqueue(song) def show_playlist(self):print("Playlist:")for song inrange(self.queue.size):print(f"{self.queue.size - song}. {self.queue.items[song]}") def play(self):while self.queue.size>0:print(f"Playing: {self.queue.dequeue()}")playlist =Playlist()playlist.add_song(Song("Tren al Sur","Los prisioneros","2:51"))playlist.add_song(Song("La voz de los 80","Los prisioneros","4:16"))playlist.add_song(Song("Perfecta","Miranda","3:01"))playlist.add_song(Song("Quieren Dinero","Los prisioneros","2:55"))playlist.add_song(Song("Eligiendo una reina","Los chanchos en Piedra","3:19"))playlist.add_song(Song("Mateo","Tronic","1:55"))playlist.show_playlist()playlist.play()playlist.show_playlist()
Este es mi trabajo:
from random import randint
from time import sleep
from node_based_queue import Queue
class Track:
def __init__(self, title=None):
self.title = title
self.length = randint(1, 10)
class MediaPlayer(Queue):
def __init__(self):
super(MediaPlayer, self).__init__()
def add_track(self, track):
self.enqueue(track)
def play(self):
print(f"count: {self.count}")
while self.count > 0 and self.head is not None:
current_track_node = self.dequeue()
current_track = current_track_node.title # Acceder al título de la pista
print(f"Now playing: {current_track}")
sleep(current_track_node.length)
track1 = Track("Highway to Hell")
track2 = Track("go")
track3 = Track("Light years")
track4 = Track("The Great Gatsby")
track5 = Track("Breath me")
track6 = Track("Los pollitos")
media_player = MediaPlayer()
media_player.add_track(track1)
media_player.add_track(track2)
media_player.add_track(track3)
media_player.add_track(track4)
media_player.add_track(track5)
media_player.add_track(track6)
media_player.play()
resultados count: 6
Now playing: Highway to Hell
Now playing: go
Now playing: Light years
Now playing: The Great Gatsby
Now playing: Breath me
Now playing: Los pollitos
~/python103$
Hice un queue basado en listas 😬 les puse nombres a las canciones y toda la cosa. Aclaración: ya sé que es un poco raro poner tantos comentarios, los pongo para saber bien lo que estoy haciendo. Cuando tenga más práctica la idea es colocar los menos posibles. Heres the code:
Aquí mi humilde código:
songs =[{'name':'song1','duration':'3:00','artist':'artist1','album':'album1',},{'name':'song2','duration':'3:00','artist':'artist2','album':'album2',},{'name':'song3','duration':'3:00','artist':'artist3','album':'album3',},{'name':'song4','duration':'3:00','artist':'artist4','album':'album4',},{'name':'song5','duration':'3:00','artist':'artist5','album':'album5',}]classPlayList: def __init__(self, name): self.queue=[] self.history=[] self.name= name
self.size=0 def add_song(self, song): self.queue.insert(0, song) self.size+=1 def playing_song(self):if not self.queue:print("Queue is empty.")returnNone song = self.queue.pop()print("Now playing:", song['name'],'-', song['artist']) self.history.append(song) self.size-=1return song
def play_previous_song(self):if not self.history:print("History is empty.")returnNone song = self.history.pop() self.queue.append(song) self.size+=1return song
def play_queue(self):if not self.queue:print("Queue is empty.")returnfor song in self.queue:print(song['name'],'-', song['artist']) def remove_song(self, song):if song in self.queue: self.queue.remove(song) self.size-=1else:print("Song not found in the queue.")
classQueue: def __init__(self): self.items=[] def is_empty(self):returnlen(self.items)==0 def enqueue(self, item): self.items.append(item) def dequeue(self):if self.is_empty(): raise IndexError("Queue is empty")return self.items.pop(0) def front(self):if self.is_empty(): raise IndexError("Queue is empty")return self.items[0] def size(self):returnlen(self.items)classMusicPlaylist: def __init__(self): self.playlist=Queue() def add_songs(self, songs):for song insongs: self.playlist.enqueue(song) def play_song(self):if self.playlist.is_empty():print("No songs in the playlist")else: song = self.playlist.dequeue()print("Now playing:", song[0]) def play_all_songs(self):if self.playlist.is_empty():print("No songs in the playlist")else:print("Playing all songs:")while not self.playlist.is_empty(): song = self.playlist.dequeue()print(song[0]) def all_songs(self):if self.playlist.is_empty():print("No songs in the playlist")else:print("Songs in the playlist:")for song in self.playlist.items:print(song[0])'''
En esta implementación, la clase Queuerepresenta la estructura de cola basada en listas.Mientras que la clase MusicPlaylist utiliza la cola para simular la lista de reproducción musical.El método add_songs(songs)recibe una tupla de canciones y las agrega a la lista de reproducción utilizando el método enqueuede la cola.El método play_song()reproducir la canción en la parte frontal de la lista de reproducción utilizando el método dequeuede la cola.El método play_all_songs()para reproducir todas las canciones en la lista de reproducción utilizando un bucle whilehasta que la lista de reproducción esté vacía.El método all_songs()muestra todas las canciones en la lista de reproducción utilizando el atributo itemsde la cola.Ten en cuenta que las canciones se reproducen en el orden en que se agregan a la lista de reproducción, siguiendo el principio FIFO(FirstIn,FirstOut).Espero que esto te ayude a desarrollar el simulador de playlist musical utilizando la
estructura Queue basada en listas en Python.Si tienes más preguntas, no dudes en preguntar.'''
#Implementacón# Crear una instancia de la clase MusicPlaylistmy_playlist =MusicPlaylist()# Agregar canciones a la playlist
songs =[("Song 1","3:45"),("Song 2","4:20"),("Song 3","2:55")]my_playlist.add_songs(songs)# Visualizar todas las canciones en la playlist
my_playlist.all_songs()# Reproducir una canción
my_playlist.play_song()# Reproducir todas las canciones en la playlist
my_playlist.play_all_songs()