#!/usr/bin/python3 import os import pygame.mixer import pygame.event from .track import Track from .track_progress_timer import TrackProgress class Player: def __init__(self, app): self.app = app pygame.mixer.init() self.mixer = pygame.mixer self.music_channel = self.mixer.Channel(0) self.track_progress = TrackProgress(self.app) self.playing = False self.paused = False self.has_tracks = False self.searched = False self.current_playlist = [] self.playing_track = None self.current_playlist_index = 0 self.playing_segment = None self.playing_segment_duration = 0 def load_tracks_from_paths(self, track_paths: list[str]): """ Load tracks from list of paths. """ tracks = [] for track_path in track_paths: if os.path.isfile(track_path): tracks.append(Track(track_path, True)) self.current_playlist = tracks self.playing_track = self.current_playlist[0] self.current_playlist_index = 0 self.playing_segment = self.playing_track.sound self.playing_segment_duration = self.playing_track.duration self.has_tracks = len(self.current_playlist) > 0 def track_finished(self): self.current_playlist_index += 1 if self.current_playlist_index < len(self.current_playlist): self.playing_track = self.current_playlist[self.current_playlist_index] self.playing_segment = self.playing_track.sound self.playing_segment_duration = self.playing_track.duration self.music_channel.play(self.playing_track.sound) self.track_progress.start() self.app.gui_communication.on_track_start() self.playing = True self.paused = False else: self.current_playlist_index -= 1 self.stop() def start_playing(self): if self.has_tracks: self.music_channel.play(self.playing_track.sound) self.track_progress.start() self.paused = False self.playing = True def pause(self): self.music_channel.pause() self.track_progress.pause() self.paused = True def unpause(self): self.music_channel.unpause() self.track_progress.unpause() self.paused = False self.playing = True def next_track(self): if self.has_tracks and self.current_playlist_index < len(self.current_playlist) - 1: self.music_channel.stop() self.track_progress.stop() self.track_finished() def previous_track(self): if self.current_playlist_index > 0: self.music_channel.stop() self.current_playlist_index -= 1 self.playing_track = self.current_playlist[self.current_playlist_index] self.track_progress.stop() self.playing_segment = self.playing_track.sound self.playing_segment_duration = self.playing_track.duration self.music_channel.play(self.playing_track.sound) self.track_progress.start() self.app.gui_communication.on_track_start() self.playing = True self.paused = False def toggle_playing(self): if self.playing and self.paused: self.unpause() elif self.playing: self.pause() else: self.start_playing() def stop(self): if self.has_tracks: self.music_channel.stop() self.track_progress.stop() self.playing_segment_duration = self.playing_track.duration self.playing = False self.paused = False def seek(self, position: int): if self.has_tracks: self.searched = True self.music_channel.stop() self.track_progress.stop() (self.playing_segment, self.playing_segment_duration) = self.playing_track.remaining(position) self.music_channel.play(self.playing_segment) self.track_progress.start() self.playing = True