Examen
Durée de l’examen : 3h
Consignes
L’objectif de ce TP est de mobiliser les notions abordées lors des TPs.
L’accès à Internet est autorisé pour consulter la documentation Python, mais il est interdit de communiquer avec d’autres personnes ou d’utiliser des outils d’IA ou des chatbots tels que ChatGPT. En cas de triche, la note de 0 sera attribuée.
Les conventions de nommage ainsi que toutes les règles de bonnes pratiques seront prises en compte dans la notation. Au moins, une classe doit être documentée.
Gestion d’un système de musique et de podcasts
Sophia O’Riordan, la responsable du département informatique du label de musique EchoWave Records, vous demande de créer une application de gestion de musique. Cette application doit pouvoir gérer les écoutes des chansons, des playlists ainsi que des podcasts.
classDiagram
%% Classe abstraite Media
class Media {
<<abstract>>
+ title: str
+ duration: int
- current: int
# play_count: int
+ __str__() str
+ play(seconds: int) void
+ record_play() void
}
%% Classe Song
class Song {
+ genre: str
+ popularity: int
+ play(seconds: int) void
+ is_popular() bool
}
Media <|-- Song
%% Classe Podcast
class Podcast {
+ host: str
+ episodes: int
# ratings: List[int]
+ play(seconds: int) void
+ rate_podcast(rating: int) void
+ average_rating() float
+ skip_ads() void
}
Media <|-- Podcast
%% Classe Artist
class Artist {
+ name: str
+ genre: str
+ __str__() str
}
%% Classe Album
class Album {
+ title: str
+ duration: int
+ artists: List[Artist]
+ songs: List[Song]
+ __str__() str
+ add_artist(artist: Artist) void
+ add_song(song: Song) void
+ get_total_duration() int
}
Artist --o Album
Album *-- Song
%% Classe Playlist
class Playlist {
+ title: str
+ songs: List[Song]
+ duration: int
+ __len__() int
+ add_song(song: Song) void
+ remove_song(song: Song) void
+ calculate_duration() int
}
Playlist o-- Song
%% Classe User
class User {
+ username: str
# email: str
+ playlists: List[Playlist]
+ favorites: List[Song, Album]
+ add_playlist(title: str, songs: List[Song]) void
+ delete_playlist(playlist: Playlist) void
+ add_favorite(song: Song) void
+ remove_favorite(song: Song) void
}
User o-- Playlist
User o-- Song
User o-- Album
Media
Attributs
-
title
: le titre du média. -
duration
: la durée du média en secondes. -
current
: la position actuelle du média (nombre de secondes écoulées, par défaut 0). -
play_count
: le nombre de fois que le média a été écouté.
Méthodes
-
__str__()
: une méthode spéciale abstraite qui affiche les informations d’une chanson. -
play()
: une méthode abstraite permettant de jouer le média. -
record_play()
: une méthode permettant de calculer le nombre de fois que le média a été écouté. À chaque fois que le média est écouté, cette méthode est appelée et incrémente le nombre de lectures.
Podcasts
Attributs
-
title
: le titre du podcast. -
duration
: la durée du podcast en secondes. -
current
: la position actuelle du podcast (nombre de secondes écoulées, par défaut 0). -
play_count
: le nombre de fois que le podcast a été écouté. -
host
: le nom de l’animateur.rice du podcast. -
episodes
: le nombre d’épisodes du podcast. -
ratings
: une liste des notes attribuées au podcast.
Méthodes
-
__str__()
: une méthode spéciale permettant d’afficher les informations du podcast au format suivantPodcast title by host_name has number_episodes (duration seconds)
par exempleY'a plus de saisons by Swann Périssé has 12 episodes (92501 seconds)
. -
play(seconds: int)
: une méthode permettant de lire le podcast- Si
seconds
est spécifié par l’utilisateur, ajouterseconds
àcurrent
. - Sinon ajouter 10 minutes à la variable
current
(10 minutes = 600 secondes)
- Si
-
rate_podcast(rating: int)
: permet de noter (entre 1 et 5) le podcast.- Ajoute une note (
rating
) dans la liste de notes (ratings
). - Si la note est inférieure à 1 ou supérieure à 5, une exception
InvalidRatingError
doit être levée.
- Ajoute une note (
-
average_rating()
: retourne la note moyenne du podcast, vous pouvez utiliser la méthodemean
du modulestatistics
. -
skip_ads()
: ignore les publicités en avançantcurrent
de 10 secondes.
Chansons
Attributs
-
title
: le titre de la chanson. -
duration
: la durée de la chanson en secondes. -
current
: la position actuelle de la chanson (nombre de secondes écoulées, par défaut 0). -
play_count
: le nombre de fois que le média a été écouté. -
genre
: le genre musical de la chanson. -
popularity
: un entier représentant la popularité de la chanson (de 1 à 100).
Méthodes
-
__str__()
: une méthode spéciale permettant d’afficher les informations de la chanson au formatSong title has a popularity of popularity % (duration seconds)
par exemplePaparazzi has a popularity of 90% (210 seconds)
. -
play(seconds: int)
: une méthode permettant de jouer la chanson- Si
seconds
est spécifié par l’utilisateur, ajouterseconds
àcurrent
. - Sinon ajouter 30 secondes à la variable
current
.
- Si
-
is_popular()
: une méthode permettant de vérifier si la chanson est populaire (booléen).- Une chanson est populaire si sa popularité est supérieure à 50.
- Sinon, elle n’est pas considérée comme populaire.
Albums
Attributs
-
title
: le titre de l’album. -
duration
: la durée totale de l’album en secondes. -
artists
: la liste des artistes de l’album. -
songs
: la liste des chansons de l’album.
Méthodes
-
__str__()
: une méthode spéciale permettant d’afficher les informations de l’album au format suivantAlbum title by artist_name (duration seconds)
par exempleHit Me Hard And Soft by Billie Eilish (1803 seconds)
. -
add_artist(artist: Artist)
: une méthode permettant d’ajouter un artiste à l’album. -
add_song(song: Song)
: une méthode permettant d’ajouter une chanson à l’album. -
get_total_duration()
: retourne la durée totale de l’album (en secondes).
Artistes
Attributs
-
name
: le nom de l’artiste. -
genre
: le genre musical de l’artiste.
Méthodes
-
__str__()
: une méthode spéciale permettant d’afficher les informations de l’artiste au format suivantArtist name plays genre music
par exempleLady Gaga plays pop music
.
Playlists
Attributs
-
title
: le titre de la playlist. -
songs
: la liste des chansons de la playlist. -
duration
: la durée totale de la playlist en secondes.
Méthodes
-
__len__()
: une méthode spéciale permettant de récupérer le nombre de chansons dans la playlist. -
add_song(song: Song)
: une méthode permettant d’ajouter une chanson à la playlist. -
remove_song(song: Song)
: une méthode permettant de retirer une chanson de la playlist. -
calculate_duration()
: une méthode permettant de calculer la durée totale de la playlist.
Utilisateurs
Attributs
-
username
: le nom d’utilisateur. -
email
: l’adresse email de l’utilisateur. -
playlists
: la liste des playlists de l’utilisateur. -
favorites
: la liste des chansons et albums favoris de l’utilisateur.
Méthodes
-
add_playlist(title: str, songs: list[Song])
: une méthode permettant d’ajouter une playlist à la liste des playlists de l’utilisateur. -
delete_playlist(playlist: Playlist)
: une méthode permettant de supprimer une playlist. -
add_favorite(song: Song)
: une méthode permettant d’ajouter une chanson aux favoris de l’utilisateur. -
remove_favorite(song: Song)
: une méthode permettant de retirer une chanson des favoris de l’utilisateur.
Fonctionnalités
- Créer la classe
Media
. - Créer la classe
Podcast
. - Créer la classe
Song
. - Créer la classe
Album
. - Créer la classe
Artist
. - Créer la classe
Playlist
. - Créer la classe
User
. - Créer un fichier principal
main.py
permettant d’interagir avec les différentes classes et de tester les différentes fonctionnalités.- Créer plusieurs artistes :
- Lady Gaga (genre : pop)
- Bruno Mars (genre : pop)
- Måneskin (genre : rock)
- Créer des chansons pour chaque artiste.
-
Die With A Smile
- Genre : pop
- Durée : 180 secondes
- Popularité : 80
-
Paparazzi
- Genre : pop
- Durée : 210 secondes
- Popularité : 90
-
Locked Out of Heaven
- Genre : pop
- Durée : 190 secondes
- Popularité : 85
-
The Loneliest
- Genre : rock
- Durée : 240 secondes
- Popularité : 85
-
Baby Said
- Genre : rock
- Durée : 250 secondes
- Popularité : 80
-
Kool Kids
- Genre : rock
- Durée : 220 secondes
- Popularité : 45
-
- Créer les albums suivants :
-
Die With A Smile
- Artistes : Lady Gaga et Bruno Mars
- Chansons : Die With A Smile
-
The Fame
- Artistes : Lady Gaga
- Chansons : Paparazzi
-
Unorthodox Jukebox
- Artistes : Bruno Mars
- Chansons : Locked Out of Heaven
-
Rush
- Artistes : Måneskin
- Chansons : The Loneliest, Baby Said, Kool Kids
-
- Afficher le titre de l’album
Die With A Smile
. - Afficher la durée totale de l’album
Rush
. - Afficher si les chansons
Die With A Smile
etKool Kids
sont populaires. - Créer une playlist nommée
Pop Songs
et y ajouter les chansons de Lady Gaga et Bruno Mars. - Créer une playlist nommée
Rock Songs
et y ajouter les chansons de Måneskin. - Afficher la durée et le nombre de chansons de la playlist
Pop Songs
. - Créer un utilisateur avec les informations suivantes :
- Nom d’utilisateur :
jane
- Email :
jane@email.com
- Playlists :
Pop Songs
etRock Songs
- Chansons en favori :
Die With A Smile
etBaby Said
- Albums en favori :
The Fame
etRush
- Nom d’utilisateur :
- Supprimer la playlist
Rock Songs
des favoris de Jane. - Ajouter la chanson
Paparazzi
aux favoris de Jane. - Créer un podcast nommé
Chez Sally
animé par Sally, durant au total 25 heures (25 heures = 90000 secondes) avec 35 épisodes et les notes suivantes : 5, 4, 3, 5, 4, 2, 5, 4, 5, 3, 4, 5, 4, 5, 1, 3. - Jouer le podcast
Chez Sally
- Noter le podcast avec une note de 4.
- Afficher la note moyenne du podcast.
- Écouter 30 secondes du podcast.
- Ignorer la publicité.
- Afficher les informations du podcast
Chez Sally
.
- Créer plusieurs artistes :