示例#1
1
文件: gui.py 项目: tnason/NetSeq
 def build(self):
     """Build GUI"""
     music_player = MusicPlayer()
     gui_widget = GUI(self, music_player)
     music_player.add_gui(gui_widget)
     network_handler = NetworkHandler(music_player, gui_widget)
     music_player.add_network_handler(network_handler)
     gui_widget.add_network_handler(network_handler)
     self.gui_widget = gui_widget
     return gui_widget
示例#2
1
    def __init__(self, screen=None):
        # See if we've been given a screen to use
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen

        self.running = True
        self.clock = pygame.time.Clock()

        # Gots to have us a background and a walkable mask
        self.background = None
        self.mask = None

        # If anyone takes screenshots, they can do so with this!
        self.screenshot_counter = 0

        # Initialize our reusable robotic girl
        self.girl = Girl()

        # What is the current state of our game
        self.state = "Running"
        
        # Load our music player
        self.music_player = MusicPlayer()
        self.sound_player = SoundPlayer()
        self.girl.sound_player = self.sound_player
示例#3
1
 def __init__(self, screen = None):
     if screen is None:
         self.screen = pygame.display.set_mode((600, 600))
     else:
         self.screen = screen
     self.running = True
     
     self.music_player = MusicPlayer("palnap4.ogg")
     
     self.clock = pygame.time.Clock()
     
     self.choice = 0
示例#4
0
class Cutscene:
    def __init__(self, screen=None):
        self.cutscenes = []
        for i in range(8):
            self.cutscenes.append(pygame.image.load(data.filepath("scene" + str(i + 1) + ".png")))
        if screen is None:
            pygame.init()
            self.screen = pygame.display.set_mode((Constants.SCREEN_WIDTH, Constants.SCREEN_HEIGHT))
        else:
            self.screen = screen
        self.clock = pygame.time.Clock()
        self.running = True
        
        self.font = pygame.font.Font(None, 24)
        
        self.music_player = MusicPlayer("palnap4.ogg")
            
    def display(self, number):
        self.music_player.play()
        done = False
        while not done:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    return
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.blit(self.cutscenes[number], (0, 0))
            pygame.display.flip()
            self.clock.tick(30)
        self.music_player.stop()
示例#5
0
    async def song_request(self, message):
        try:
            user_input = message.content.replace('!sr', '').strip()
            if user_input == '':
                raise NotResultsException

            song_reference = self.music_dl.download(user_input)

            if song_reference is None:
                raise NotResultsException
            song_name = self.music_dl.get_song_name(song_reference)
            await self.music_player.add_to_playlist(song_reference, message, song_name)
        except MaxDurationException as ex:
            await send_exception(message, ex)
        except NotResultsException as ex:
            await send_exception(message, ex)
        except Exception as ex:
            print('----------')
            print(ex)
            print('----------')
            # I needed to do this because only this "fix" a weird bug
            # When the player stop and then play music again the volume change to -1 and it ignore every
            # validation that I do to change it again to the initial volume
            self.music_player = MusicPlayer(os.environ.get('DOWNLOADS_PATH'))
            print(f'[Music Player Restarted at {datetime.now()}]')
            print('----------')
示例#6
0
    def __init__(
        self,
        spam_time=600,
        spam_messages=[],
        custom_rewards=[],
        tts_engine=None,
        greeting_message=''
    ):
        super().__init__(
            irc_token=os.environ.get('TMI_TOKEN'),
            client_id=os.environ.get('CLIENT_ID'),
            nick=os.environ.get('BOT_NICK'),
            prefix=os.environ.get('BOT_PREFIX'),
            initial_channels=[os.environ.get('CHANNEL')],
            client_secret=os.environ.get('CLIENT_SECRET'))

        self.user_id = os.environ.get('TWITCH_USER_ID')
        self.ignore_users = [self.nick]
        self.only_owner_commands = ['dtts', 'atts']
        self.only_mod_commands = ['vol', 'next', 'stop']
        self.owner_nick = os.environ.get('CHANNEL').replace('#', '').lower()
        self.spam_time = spam_time
        self.spam_messages = spam_messages
        self.chatters_list = []
        self.custom_rewards = custom_rewards
        self.greeting_message = greeting_message

        self.riot_api = RiotAPI()
        self.cats_api = CatsAPI()
        self.tts_engine = tts_engine
        self.music_player = MusicPlayer(os.environ.get('DOWNLOADS_PATH'))
        self.music_dl = MusicDL(download_path=os.environ.get('DOWNLOADS_PATH'))
示例#7
0
    def __init__(self, screen=None):
        # See if we've been given a screen to use
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen

        self.running = True
        self.clock = pygame.time.Clock()

        # Gots to have us a background and a walkable mask
        self.background = None
        self.mask = None

        # If anyone takes screenshots, they can do so with this!
        self.screenshot_counter = 0

        # Initialize our reusable robotic girl
        self.girl = Girl()

        # What is the current state of our game
        self.state = "Running"

        # Load our music player
        self.music_player = MusicPlayer()
        self.sound_player = SoundPlayer()
        self.girl.sound_player = self.sound_player
示例#8
0
 def __init__(self, holder):
     super().__init__(holder)
     self._config = Config()
     self._player = MusicPlayer()
     self._load_alarms()
     self._time_pattern = re.compile('^([012]\d):(\d\d)$')
     self._old_time_str = ''
     self._alarm_is_playing = False
示例#9
0
    def __init__(self, screen=None):
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen
        self.running = True

        self.music_player = MusicPlayer("palnap4.ogg")

        self.clock = pygame.time.Clock()

        self.choice = 0
示例#10
0
    def __init__(self):
        self.hour = None
        self.minute = None
        self.time_window_hours = ConfigManager.get_config()['hours_to_check']
        self.time_window_minutes = ConfigManager.get_config(
        )['minutes_to_check']

        self.music_player = MusicPlayer()
        self.camera = Camera()
        self.model = Model()

        # for storing images
        self.counter = 0
示例#11
0
 def test_user_login(self):
     wynk = MusicPlayer(
         10, 9, 4, 'Harshi', 'WYNK08', 'premium', ['Pachai Nirame'],
         ['descpasito'], ['Tamil', 'Hindi', 'English'], 1,
         ['Premium', 'Free', 'Subscribed'],
         ['Anirudh', 'ARR', 'Ankit Tiwari'], {
             'Anirudh': ['Yaanji', 'VIP'],
             'Dhanush': ['Maruvarthai', 'Vada chennai', 'Visiri'],
             'Hindi': ['ADHM', 'Dekthe', 'Barish']
         }, ['Nostalgic', 'Love', 'English'], [])
     song = WynkSongs('mazhai kuruvi', 'MK', 4, 'ARR', 'Tamil', 'STR',
                      'CCV', '5 mins', 'xx', 10)
     check = wynk.check_signin_name('haRsH')
     self.assertEqual(check, False)
示例#12
0
 def __init__(self, screen = None):
     if screen is None:
         self.screen = pygame.display.set_mode((600, 600))
     else:
         self.screen = screen
     self.running = True
     
     self.explode_anims = []
     for i in range(4):
         self.explode_anims.append(pygame.image.load(data.filepath("explode" + str(i + 1) + ".png")))
         
     self.explode_anims *= 3
     
     self.music_player = MusicPlayer("palnap4.ogg")
示例#13
0
 def test_delete_songs(self):
     wynk = MusicPlayer(
         10, 9, 4, 'Harshi', 'WYNK08', 'premium', ['Pachai Nirame'],
         ['descpasito'], ['Tamil', 'Hindi', 'English'], 1,
         ['Premium', 'Free', 'Subscribed'],
         ['Anirudh', 'ARR', 'Ankit Tiwari'], {
             'Anirudh': ['Yaanji', 'VIP'],
             'Dhanush': ['Maruvarthai', 'Vada chennai', 'Visiri'],
             'Hindi': ['ADHM', 'Dekthe', 'Barish']
         }, ['Nostalgic', 'Love', 'English'], [])
     song = WynkSongs('mazhai kuruvi', 'MK', 4, 'ARR', 'Tamil', 'STR',
                      'CCV', '5 mins', 'xx', 10)
     download = wynk.delete_song('VIP')
     self.assertNotEqual(download, ['Pachai Nirame'])
示例#14
0
 def __init__(self, screen=None):
     self.cutscenes = []
     for i in range(8):
         self.cutscenes.append(pygame.image.load(data.filepath("scene" + str(i + 1) + ".png")))
     if screen is None:
         pygame.init()
         self.screen = pygame.display.set_mode((Constants.SCREEN_WIDTH, Constants.SCREEN_HEIGHT))
     else:
         self.screen = screen
     self.clock = pygame.time.Clock()
     self.running = True
     
     self.font = pygame.font.Font(None, 24)
     
     self.music_player = MusicPlayer("palnap4.ogg")
def main(argv):

    # 1. get input file argument
    MUSICFILE = ""

    try:
        opts, args = getopt.getopt(argv,"m:",["music_file="])
    except getopt.GetoptError:
        print ('dance.py -m <filename>')
        sys.exit(2)

    for opt, arg in opts:
        if opt == '-m':
            MUSICFILE = arg

    print("FILENAME: {}".format(MUSICFILE))
    if MUSICFILE == "":
        print("error in argument passing")
        return 1

    # 2. play
    if MUSICFILE != "bright1.mp3" and MUSICFILE != "bright2.mp3":
        print("MUSIC '{}' is not supported, or file does not exist".format(MUSICFILE))
    else:
        car, music_player = Car(), MusicPlayer()
        if MUSICFILE == "bright1.mp3":
            dance_to_bright1(car, music_player)
        if MUSICFILE == "bright2.mp3":
            dance_to_bright2(car, music_player)
    
    return 0
示例#16
0
class PlayerGUI(FloatLayout):
    player = MusicPlayer()
    songs_list = ObjectProperty()
    song_time = ObjectProperty()

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        directory_to_craw = input('Directory to craw for mp3 files >>>')
        self.player.load_playlist(path=directory_to_craw)
        self.songs_list.adapter.data.extend(self.player.get_all_songs_list())
        time_thread = Thread(target=self.print_curr_song_time, daemon=True)
        time_thread.start()

    def play_song(self):
        if self.songs_list.adapter.selection:
            selection = self.songs_list.adapter.data.index(
                self.songs_list.adapter.selection[0].text)
            self.player.play_song(selection)
            self.songs_list.adapter.selection[0].trigger_action()
        else:
            self.player.play_song()

    def pause_song(self):
        self.player.pause_song()

    def stop_song(self):
        self.player.stop_song()

    def print_curr_song_time(self):
        from time import sleep
        while True:
            sleep(0.75)
            self.song_time.text = self.player.get_curr_song_time()
示例#17
0
文件: server.py 项目: cp9ev/xiaoma
    def __init__(self):
        self.music_list = []
        self.music_player = MusicPlayer()
        self.api_map = self.init_router()

        self.start_flag = False
        self.playing_flag = False
        self.play_mode = 'loop'
        self.current_index = -1
        self.current_music = {}

        websocket_server = websockets.serve(self.service, '192.168.1.209', 8888)
        asyncio.get_event_loop().run_until_complete(websocket_server)
        asyncio.ensure_future(self.auto_next())
        asyncio.ensure_future(self.download_task())
        asyncio.get_event_loop().run_forever()
示例#18
0
 def __init__(self):
     GameState(
     )  # initialize singletons before threading to avoid race conditions
     AssetLoader()
     MusicPlayer()
     self.root = tk.Tk()
     self.windowManager = WindowManager()
     self.display = Display(self.root, self.windowManager)
     self.inputHandler = InputHandler(self.display.widget)
示例#19
0
    def __init__(self):
        # 0是全部列表
        self.current_menu_id = 0
        self.music_list = []
        self.music_player = MusicPlayer()
        self.album_manager = InstanceAsyncAlbumManager
        self.api_map = self.init_router()
        self.start_flag = False
        self.playing_flag = False
        self.play_mode = 'loop'
        self.current_index = -1
        self.current_music = {}

        websocket_server = websockets.serve(self.service, '0.0.0.0', 8888)
        asyncio.get_event_loop().run_until_complete(websocket_server)
        asyncio.ensure_future(self.auto_next())
        asyncio.ensure_future(self.download_task())
        asyncio.get_event_loop().run_forever()
示例#20
0
class StageFailure:
    """ Just a stage clear intermission screen. Nothing at all
        fancy here. """
    def __init__(self, screen = None):
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen
        self.running = True
        
        self.explode_anims = []
        for i in range(4):
            self.explode_anims.append(pygame.image.load(data.filepath("explode" + str(i + 1) + ".png")))
            
        self.explode_anims *= 3
        
        self.music_player = MusicPlayer("palnap4.ogg")

    def main(self):
        """ Display the screen. """
        self.music_player.play()
        current_frame = 0
        clock = pygame.time.Clock()
        font = pygame.font.Font(None, 24)
        try_again_text = font.render("[ press any key to try again ]", 1, (0, 255, 255))
        failure_text = font.render("You failed!", 1, (0, 255, 255))
        while True:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    return
                elif event.type == pygame.QUIT:
                    self.running = False
                    return False
            self.screen.fill((0, 0, 20))
            if current_frame < 40: 
                current_frame += 1
                self.screen.blit(self.explode_anims[(current_frame / 5)], (self.screen.get_rect().centerx - 50, self.screen.get_rect().centery - 50))
            else:
                current_frame = 0
            self.screen.blit(failure_text, (self.screen.get_rect().centerx - 50, 100))
            self.screen.blit(try_again_text, (self.screen.get_rect().centerx - 125, self.screen.get_rect().centery + 200))
            pygame.display.flip()
            clock.tick(Constants.MAX_FPS)
示例#21
0
 def initAssets(self):
     AssetLoader().loadAssets()
     AssetLoader().loadSaves()
     AssetLoader().loadSettings()
     # send events for loaded settings
     if AssetLoader().getSettings() is not None:
         for setting in AssetLoader().getSettings():
             GameState().onSettingChange(setting[0], setting[1])
     else:
         MusicPlayer().playNext(AssetLoader().getMusicPath('title'))
     self.windowManager.load()
     GameState().unlockGameMode()
    def __init__(self):
        super(MusicBrowser, self).__init__()
        
        # check network status
        self.progress_value = 0
        self.is_reload_flag = False        
        self.network_connected_flag = False
        self.update_progress_flag = True
        self.prompt_text = "正在加载数据(%d%%),如果长时间没有响应,点击此处刷新"
        
        self._player = MusicPlayer()
        self._player_interface = PlayerInterface()
        self._ttp_download = TTPDownload()
        
        self.loading_box = LoadingBox(self.prompt_text % self.progress_value, "此处", self.reload_browser)
        self.network_failed_box = NetworkConnectFailed(self.check_network_connection)
        self.check_network_connection(auto=True)

        self.webview = webkit.WebView()
        self.webview.set_transparent(True)
        
        settings = self.webview.get_settings()
        settings.set_property('enable-plugins', False)
        self.webview.set_settings(settings)
        
        self.webview.load_uri("http://musicmini.baidu.com/static/recommend/recommend.html")
        self.js_context = jscore.JSContext(self.webview.get_main_frame().get_global_context()).globalObject                        
        self.webview.connect("load-finished", self.on_webview_load_finished)

        self.webview.connect("load-progress-changed", self.on_webview_progress_changed)
        
        # message status
        self.webview.connect("script-alert", self.on_webview_script_alert)        
        self.webview.connect("console-message", self.on_webview_console_message)
        
        # resource load
        self.webview.connect("resource-load-failed", self.on_webview_resource_request)
示例#23
0
文件: main.py 项目: eerimoq/pumbaa
# Copyright (c) 2016, Erik Moqvist
# 
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use, copy,
# modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# This file is part of the Pumbaa project.
#


from music_player import MusicPlayer

music_player = MusicPlayer()
music_player.start()
示例#24
0
async def on_message(message: Message):
    if message.author.id == bot.user.id:
        return

    control_channel = get_bot_control_channel(message.server.channels)

    if not control_channel:
        return
    if control_channel.id != message.channel.id:
        return

    if not message.content:
        await bot.delete_message(message)
        return

    content = message.content.split(' ')
    command = content[0].lower()
    if len(content) > 1:
        args = content[1:]
    else:
        args = None

    if message.channel.is_private:
        if command != 'help':
            await bot.send_message(
                message.author,
                "I didn't get that. But there are available commands:")
        await bot.send_message(message.author, help_message)

        return

    m_player = bot.music_players.get(message.server.id, None)
    user_voice_channel = message.author.voice.voice_channel
    bot_voice_channel = bot.voice_channels.get(message.server.id, None)

    if command == 'summon' or command == 'summoning jutsu':
        if user_voice_channel:
            if m_player:
                await m_player.voice_client.disconnect()
                m_player.voice_client = await bot.join_voice_channel(
                    user_voice_channel)
            else:
                voice_client = await bot.join_voice_channel(user_voice_channel)
                m_player = MusicPlayer(
                    voice_client, next_song_event_generator(control_channel),
                    settings.MUSIC_DIRECTORY, settings.DEFAULT_VOLUME)

                bot.music_players.update({message.server.id: m_player})
                bot.voice_channels.update(
                    {message.server.id: user_voice_channel})

            username = message.author.nick if message.author.nick else message.author.name
            await bot.send_message(control_channel,
                                   'At your service, sir {}.'.format(username))
        else:
            await bot.send_message(control_channel,
                                   'Unable to join: unknown voice channel!')
    elif command == 'help':
        await bot.send_message(message.author, help_message)
    elif command == 'clear_messages':
        if not message.author.permissions_in(control_channel).manage_messages:
            return
        await bot.purge_from(control_channel, limit=50)
    elif command == 'update_songs':
        if not message.author.permissions_in(control_channel).manage_messages:
            return
        m_player.update_songs()
    elif m_player and user_voice_channel == bot_voice_channel:
        if command == 'bye':
            await bot.disconnect_from_server(message.server.id)
        elif command == 'play':
            success = await m_player.play()
            if not success:
                await incorrect_message(message)
        elif command == 'seek' and args:
            await m_player.seek(args[0])
        elif command == 'volume':
            if args:
                success = m_player.set_volume(args[0])
                if not success:
                    await incorrect_message(message)
                else:
                    await bot.send_message(
                        control_channel,
                        'New volume is {}%'.format(m_player.get_volume()))
            else:
                await bot.send_message(
                    control_channel,
                    'Current volume is {}%'.format(m_player.get_volume()))
        elif command == 'pause':
            m_player.pause()
        elif command == 'stop':
            await bot.change_presence(game=discord.Game(
                name='v. {}'.format(settings.BOT_VERSION)))
            m_player.reset_player()
        elif command == 'next':
            await m_player.play_next_song()
        elif command == 'prev':
            await m_player.play_previous_song()
        elif command == 'add' and args:
            success = m_player.add_to_playlist(args[0])
            if not success:
                await incorrect_message(message)
        elif command == 'delete':
            if args:
                song = await m_player.delete_from_playlist(args[0])
            else:
                song = await m_player.delete_from_playlist()

            if not song:
                await incorrect_message(message)
            else:
                # todo: execute playlist command here
                await bot.send_message(
                    control_channel,
                    '***{}.** {} was deleted from playlist!*'.format(
                        args[0], song.title))
        elif command == 'playlist':
            plist_msg = ''
            i = 1
            for song_title in m_player.get_playlist_titles():
                if m_player.current_song_id == i - 1:
                    song_title = '**' + song_title + '**'
                else:
                    song_title = '*' + song_title + '*'

                plist_msg += '**{}**. {}\n'.format(i, song_title)
                i += 1
            if plist_msg:
                await bot.send_message(control_channel, plist_msg)
            else:
                await bot.send_message(control_channel,
                                       '*The playlist is empty!*')
        elif command == 'select' and args:
            try:
                await m_player.select_song(args[0])
            except Exception:
                await incorrect_message(message)
        else:
            await incorrect_message(message)
    else:
        await incorrect_message(message)
示例#25
0
class Alarm:
    def __init__(self):
        self.hour = None
        self.minute = None
        self.time_window_hours = ConfigManager.get_config()['hours_to_check']
        self.time_window_minutes = ConfigManager.get_config(
        )['minutes_to_check']

        self.music_player = MusicPlayer()
        self.camera = Camera()
        self.model = Model()

        # for storing images
        self.counter = 0

    def set_alarm(self, hour, minute):
        self.hour = hour
        self.minute = minute
        self.stop_alarm()

    def verify_alarm(self):
        d = datetime.now()
        hour = int(d.hour)
        minute = int(d.minute)

        if self.in_time_window(hour, minute):
            is_present, image = self.verify_present()
            if is_present:
                self.launch_alarm()
            else:
                self.stop_alarm()

            self.store_image(image)

    def verify_present(self):
        image = Camera.capture_screenshot()
        predictable_image = prepare_for_prediction(image)
        prediction = self.model.predict(predictable_image)

        print("Predicted: {}".format(prediction))
        return prediction < 0.5, image

    def in_time_window(self, curr_hour, curr_minute):
        if self.hour is None or self.minute is None:
            return False

        if curr_hour is None or curr_minute is None:
            d = datetime.now()
            curr_hour = int(d.hour)
            curr_minute = int(d.minute)

        # Compare hour
        after_alarm = self.hour < curr_hour

        # CCompare minute if needed
        if not after_alarm:
            after_alarm = self.hour == curr_hour and \
                          self.minute <= curr_minute

        target_hour = self.hour + self.time_window_hours
        target_minute = self.minute + self.time_window_minutes

        # Compare hour
        before_wind_end = curr_hour < target_hour

        # Compare minute if needed
        if not before_wind_end:
            before_wind_end = curr_hour == target_hour and \
                              curr_minute <= target_minute

        return after_alarm and before_wind_end

    def launch_alarm(self):
        self.music_player.play()

    def stop_alarm(self):
        self.music_player.stop()

    def store_image(self, image):
        # activates once every 3 iterations
        self.counter = self.counter + 1
        if self.counter >= 2:
            self.counter = 0
            Camera.save_image(image)
示例#26
0
class TitleScreen:
    """ Just a stage clear intermission screen. Nothing at all
        fancy here. """
    def __init__(self, screen=None):
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen
        self.running = True

        self.music_player = MusicPlayer("palnap4.ogg")

        self.clock = pygame.time.Clock()

        self.choice = 0

    def main(self):
        """ Display the screen and a little bit of text at the bottom
            of the screen. """
        self.music_player.play()
        xasm_logo = pygame.image.load(data.filepath("xasm.png"))
        title_screen = pygame.image.load(data.filepath("title.png"))
        font = pygame.font.Font(None, 24)
        start_game = False
        alpha = 0
        fade_in = True

        logo_alpha = 0

        skip = False

        while logo_alpha < 255 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha += 3
            pygame.display.flip()
            self.clock.tick(30)

        while logo_alpha > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha -= 3
            pygame.display.flip()
            self.clock.tick(30)

        skip = False
        counter = 50
        while counter > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            text = font.render("Dedicated to the memory of Phoebe...", 1,
                               (255, 255, 255))
            text2 = font.render("We'll miss you...", 1, (255, 255, 255))
            self.screen.blit(text, (150, 300))
            self.screen.blit(text2, (225, 325))
            pygame.display.flip()
            self.clock.tick(30)
            counter -= 1

        choice = 0

        while not start_game:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP:
                        self.choice -= 1
                    elif event.key == pygame.K_DOWN:
                        self.choice += 1
                    elif event.key == pygame.K_RETURN:
                        start_game = True
                    elif event.key == pygame.K_ESCAPE:
                        self.running = False
                        return
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            if self.choice < 0:
                self.choice = 1
            elif self.choice > 1:
                self.choice = 0
            new_game = "[ new game ]"
            continue_game = "[ continue game ]"
            if self.choice == 0:
                new_game = "> " + new_game
            elif self.choice == 1:
                continue_game = "> " + continue_game
            # There's some weird-ass PyGame font bug in 1.7, so the text is
            # ant-aliased.
            text = font.render(new_game, 1, (5, 231, 96))
            text2 = font.render(continue_game, 1, (5, 231, 96))
            self.screen.blit(title_screen, (0, 0))
            self.screen.blit(text, (200, 525))
            self.screen.blit(text2, (200, 550))
            pygame.display.flip()
            self.clock.tick(30)
        self.music_player.stop()
示例#27
0
    def __init__(self):
        global main
        super().__init__()
        main = self
        self.setupUi(self)

        self.submit.clicked.connect(self.on_input)
        self.data_edit.returnPressed.connect(self.submit.click)

        self.storage_manager = StorageManager()
        self.storage_manager.start()

        self.music_player = MusicPlayer()
        self.music_player.start()

        self.scheduler = Scheduler(self)
        self.scheduler.start()

        self.log_units = [
            self.storage_manager, self.music_player, self.scheduler
        ]

        self.checkbox_list = []
        for k in range(16):
            self.checkbox_list.append(getattr(self, f'checkbox_list_item{k}'))

        def get_checkbox_handler(checkbox, k, callback):
            return lambda: callback(checkbox, k)

        for k, log_unit in enumerate(self.log_units):
            self.checkbox_list[k].setText(log_unit.log_header)
            self.checkbox_list[k].setChecked(True)
            self.checkbox_list[k].toggled.connect(
                get_checkbox_handler(self.checkbox_list[k], k,
                                     self.on_toggle_checkbox))

        self.checkbox_list_autoscroll.setChecked(True)

        self.console_log = QStringListModel()
        self.console.setModel(self.console_log)

        self.schedule_tree.setHeaderLabels(['일자', '시간', '행동'])
        for head in entire_schedule:
            header = QTreeWidgetItem([head])
            for tail_time in entire_schedule[head]:
                header.addChild(
                    QTreeWidgetItem([
                        None,
                        str(tail_time), entire_schedule[head][tail_time]
                    ]))
            self.schedule_tree.addTopLevelItem(header)
            header.setExpanded(True)
        self.schedule_tree.doubleClicked.connect(
            self.on_double_click_schedule_tree)

        for k, macro_name in enumerate(quick_macros):
            create_quick_macro_button(k, macro_name, quick_macros[macro_name])

        self.log_timer = QTimer()
        self.log_timer.setInterval(1000)
        self.log_timer.timeout.connect(self.on_check_log)
        self.log_timer.start()

        self.show()
示例#28
0
from answer_player import AnswerPlayer
from music_player import MusicPlayer
from backlight_control import BacklightControl
from translation_ru import TranslatorRU
import ups_lite
import power

audio_lang = 'en'
recognize_lang = 'en'

BacklightControl.backlight_enabled = True
eyes_bl = BacklightControl('EYES')

fsm_state = 1

m_player = MusicPlayer()
a_player = AnswerPlayer(audio_lang)
speech_recognizer = PsLiveRecognizer('./resources/', recognize_lang, 'bender')

volume_modes = {'quiet': 8, 'normal': 20, 'loud': 32}
speaker_volume = 20

IDLE_TIME = 60  # in minutes, 2 - minimum
sleep_enabled = True
is_sleeping = False
sleep_counter = 0
sleep_counter_lock = threading.Lock()
main_thread_is_running = True

UPS_TASK_ENABLED = True
UPS_TASK_INTERVAL = 2
示例#29
0
文件: main.py 项目: ssahgal/pumbaa
# Copyright (c) 2016-2017, Erik Moqvist
# 
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use, copy,
# modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# This file is part of the Pumbaa project.
#


from music_player import MusicPlayer

music_player = MusicPlayer()
music_player.start()
示例#30
0
class MusicServer:
    client_list = {}
    root_dir = './musics'
    search_tool = Search()
    download_queue = []

    def __init__(self):
        # 0是全部列表
        self.current_menu_id = 0
        self.music_list = []
        self.music_player = MusicPlayer()
        self.album_manager = InstanceAsyncAlbumManager
        self.api_map = self.init_router()
        self.start_flag = False
        self.playing_flag = False
        self.play_mode = 'loop'
        self.current_index = -1
        self.current_music = {}

        websocket_server = websockets.serve(self.service, '0.0.0.0', 8888)
        asyncio.get_event_loop().run_until_complete(websocket_server)
        asyncio.ensure_future(self.auto_next())
        asyncio.ensure_future(self.download_task())
        asyncio.get_event_loop().run_forever()

    async def service(self, websocket, path):
        client_name = self.handle_client(websocket, path)
        async for message in websocket:
            await self.router(client_name, json.loads(message))

    async def router(self, client_name, request):
        print(f'{client_name}:{request}')
        await self.api_map[request['path']](request=request,
                                            client_name=client_name)

    async def send_response(self, path, data, client_name=None):
        response = json.dumps({'api': path, 'data': data})
        if client_name:
            await self.client_list[client_name].send(response)
        else:
            offline = []
            for client, ws in self.client_list.items():
                try:
                    await ws.send(response)
                except:
                    print(f'{client} offline')
                    offline.append(client)
            for client in offline:
                self.client_list.pop(client)

    async def get_player_info(self, **kwargs):
        request = kwargs['request']
        data = {
            'mode': self.play_mode,
            'music': self.current_music,
            'play_status': self.playing_flag,
            'volume': self.music_player.get_music_volume(),
            'menu_list': await self.album_manager.get_album_list(),
            'current_menu': self.album_manager.current_album_id
        }
        await self.send_response(request['path'], data)

    async def get_all_songs(self, **kwargs):
        self.current_menu_id = 0
        request = kwargs['request']
        self.music_list = await self.album_manager.all_songs()
        data = {
            'player_status': self.start_flag,
            'music_list': self.music_list
        }
        # send_mode = kwargs['send_mode'] if kwargs.get('send_mode') else 1
        await self.send_response(request['path'], data, kwargs['client_name'])

    async def get_menu_songs(self, **kwargs):
        request = kwargs['request']
        album_id = request['query']['menu_id']
        # self.current_menu_id = menu_id
        music_list = await self.album_manager.get_album_songs(album_id)
        data = {'menu_id': album_id, 'music_list': music_list}
        await self.send_response(request['path'], data, kwargs['client_name'])

    async def search_music_list(self, **kwargs):
        request = kwargs['request']
        search_value = request['query']['search_value']
        music_list = await self.search_tool.search_song(search_value)
        data = {'player_status': self.start_flag, 'music_list': music_list}
        await self.send_response(request['path'], data, kwargs['client_name'])

    async def download_music(self, **kwargs):
        request = kwargs['request']
        music = request['query']['music']
        self.download_queue.append(music)
        await self.send_response(request['path'], self.download_queue)

    async def set_mode(self, **kwargs):
        request = kwargs['request']
        self.play_mode = request['query']['mode']
        await self.send_response(request['path'],
                                 {'play_mode': self.play_mode})

    # 前端回传song_id 和 album_id
    async def play_music(self, **kwargs):
        if not self.start_flag:
            await self.send_response(
                'music/volume',
                self.music_player.get_music_volume() * 100)

        request = kwargs['request']
        index = request['query']['index']
        song_id = request['query']['song_id']
        album_id = request['query'].get('album_id', 0)
        song = await self.album_manager.set_current_song(song_id)
        print(song)
        # 设置歌单
        await self.album_manager.set_current_play_list(album_id)
        self.album_manager.set_current_album_id(album_id)
        self.album_manager.set_next_song()
        music_file = parse_file_path(self.root_dir, song)
        # music = await self.album_manager.get_song_info(self.current_menu_id, song_id)
        self.music_player.play_click(music_file)
        self.start_flag = True
        self.playing_flag = True
        self.current_index = index
        self.current_music = song
        # self.album_manager.set_current_album_id(album_id)
        song["album_id"] = album_id

        await self.send_response(request['path'], song)

    async def pause_music(self, **kwargs):
        request = kwargs['request']
        self.music_player.pause_click()
        self.playing_flag = False
        await self.send_response(request['path'], {'play_status': 'play'})

    async def unpause_music(self, **kwargs):
        if not self.start_flag:
            await self.next_music(request={'path': 'music/next'})
        else:
            request = kwargs['request']
            self.music_player.unpause_click()
            self.playing_flag = True
            await self.send_response(request['path'], {'play_status': 'pause'})

    async def pre_music(self, **kwargs):
        request = kwargs['request']
        index = self.get_index('pre')
        await self.play_music(request={
            'path': request['path'],
            'query': {
                'index': index
            }
        })

    async def next_music(self, **kwargs):
        request = kwargs['request']
        # index = self.get_index('next')
        song = self.album_manager.next_song if self.play_mode == "loop" else self.album_manager.get_random_song(
        )
        print(song)

        # index的逻辑没有动
        await self.play_music(
            request={
                'path': request['path'],
                'query': {
                    'index': 0,
                    'song_id': song['song_id'],
                    'album_id': self.album_manager.current_album_id
                }
            })

    async def set_volume(self, **kwargs):
        request = kwargs['request']
        volume = request['query']['volume_value']
        self.music_player.set_volume(volume / 100)
        await self.send_response(request['path'], volume)

    async def add_menu(self, **kwargs):
        request = kwargs['request']
        menu_name = request['query']['menu_name']
        await self.album_manager.add_album(menu_name, '')
        await self.send_response(request['path'], await
                                 self.album_manager.get_album_list())

    async def add_song_to_menu(self, **kwargs):
        request = kwargs['request']
        menu_id = request['query']['menu_id']
        song = request['query']['song']
        await self.album_manager.add_album_song(menu_id, song)

    async def del_song_from_menu(self, **kwargs):
        request = kwargs['request']
        song = request['query']['song']
        await self.album_manager.del_album_song(song['album_id'],
                                                song['song_id'])
        self.music_list = await self.album_manager.get_album_songs(
            song['album_id'])
        await self.get_menu_songs(request={
            'path': 'music/menu',
            'query': {
                'menu_id': song['album_id']
            }
        })

    def get_index(self, click_type):
        index = 0
        if not self.start_flag:
            return index
        if self.play_mode == 'loop':
            if click_type == 'pre':
                index = -1 if self.current_index == 0 else self.current_index - 1
            if click_type == 'next':
                index = 0 if self.current_index == len(
                    self.music_list) - 1 else self.current_index + 1
        elif self.play_mode == 'random':
            index = random.randrange(0, len(self.music_list))
        return index

    async def auto_next(self):
        while True:
            if self.start_flag:
                if self.music_player.get_music_pos() == -1:
                    await self.next_music(request={'path': 'music/next'})
            await asyncio.sleep(1)

    async def download_task(self):
        while True:
            if len(self.download_queue) >= 1:
                task_wait = self.download_queue[0]
                ret = await download_mp3(task_wait)
                self.download_queue.remove(task_wait)
                await self.send_response('music/download', self.download_queue)
                if ret['code'] == 1:
                    await self.album_manager.add_song(ret['song'])
                await self.send_response('music/msg', ret['msg'])
            else:
                await asyncio.sleep(1)

    def init_router(self):
        return {
            'music/playerInfo': self.get_player_info,
            'music/local': self.get_all_songs,
            'music/menu': self.get_menu_songs,
            'music/search': self.search_music_list,
            'music/download': self.download_music,
            'music/playMode': self.set_mode,
            'music/play': self.play_music,
            'music/pause': self.pause_music,
            'music/unpause': self.unpause_music,
            'music/pre': self.pre_music,
            'music/next': self.next_music,
            'music/volume': self.set_volume,
            'music/menu/add': self.add_menu,
            'music/menu/add/song': self.add_song_to_menu,
            'music/menu/del/song': self.del_song_from_menu,
        }

    def handle_client(self, ws, path):
        client_name = path.replace('/', '')
        self.client_list[client_name] = ws
        return client_name
示例#31
0
class MainWindow(QtWidgets.QMainWindow, uic.loadUiType('data/planner.ui')[0]):
    def __init__(self):
        global main
        super().__init__()
        main = self
        self.setupUi(self)

        self.submit.clicked.connect(self.on_input)
        self.data_edit.returnPressed.connect(self.submit.click)

        self.storage_manager = StorageManager()
        self.storage_manager.start()

        self.music_player = MusicPlayer()
        self.music_player.start()

        self.scheduler = Scheduler(self)
        self.scheduler.start()

        self.log_units = [
            self.storage_manager, self.music_player, self.scheduler
        ]

        self.checkbox_list = []
        for k in range(16):
            self.checkbox_list.append(getattr(self, f'checkbox_list_item{k}'))

        def get_checkbox_handler(checkbox, k, callback):
            return lambda: callback(checkbox, k)

        for k, log_unit in enumerate(self.log_units):
            self.checkbox_list[k].setText(log_unit.log_header)
            self.checkbox_list[k].setChecked(True)
            self.checkbox_list[k].toggled.connect(
                get_checkbox_handler(self.checkbox_list[k], k,
                                     self.on_toggle_checkbox))

        self.checkbox_list_autoscroll.setChecked(True)

        self.console_log = QStringListModel()
        self.console.setModel(self.console_log)

        self.schedule_tree.setHeaderLabels(['일자', '시간', '행동'])
        for head in entire_schedule:
            header = QTreeWidgetItem([head])
            for tail_time in entire_schedule[head]:
                header.addChild(
                    QTreeWidgetItem([
                        None,
                        str(tail_time), entire_schedule[head][tail_time]
                    ]))
            self.schedule_tree.addTopLevelItem(header)
            header.setExpanded(True)
        self.schedule_tree.doubleClicked.connect(
            self.on_double_click_schedule_tree)

        for k, macro_name in enumerate(quick_macros):
            create_quick_macro_button(k, macro_name, quick_macros[macro_name])

        self.log_timer = QTimer()
        self.log_timer.setInterval(1000)
        self.log_timer.timeout.connect(self.on_check_log)
        self.log_timer.start()

        self.show()

    def closeEvent(self, c):
        print('Closing...')
        self.log_timer.stop()
        for log_unit in self.log_units:
            log_unit.close()
            log_unit.quit()

    def insert_log(self, log: str):
        row = self.console_log.rowCount()
        self.console_log.insertRow(row)
        index = self.console_log.index(row)
        print(log)
        self.console_log.setData(index, log)

    @pyqtSlot(QModelIndex)
    def on_double_click_schedule_tree(self, index):
        try:
            key = index.model().data(index, 2)
            if key is not None:
                self.parse_command(f'-{key}')
        except:
            self.insert_log(traceback.format_exc())

    @pyqtSlot()
    def on_toggle_checkbox(self, check_box, k):
        if k < len(self.log_units):
            self.log_units[k].log_enable = check_box.isChecked()

    @pyqtSlot()
    def on_input(self):
        text = self.data_edit.text()
        self.parse_command(text.lower())
        self.console.scrollToBottom()
        self.data_edit.setText('')

        for k, method_name in enumerate(quick_macros):
            button = getattr(self, f'button_list_item{k}')
            print(button.x(), button.y())

    @pyqtSlot()
    def on_check_log(self):
        logs_to_insert = []
        for k, log_unit in enumerate(self.log_units):
            if log_unit.is_empty():
                continue
            for log in log_unit.flush_log():
                logs_to_insert.append(log)
        if len(logs_to_insert) > 0:
            logs_to_insert.sort(key=lambda x: x[0])
            for log in logs_to_insert:
                self.insert_log('%02d:%02d: %s' %
                                (log[0].hour, log[0].minute, log[1].replace(
                                    os.getcwd(), '$://')))
            if self.checkbox_list_autoscroll.isChecked():
                self.console.scrollToBottom()

    @pyqtSlot(str)
    def parse_command(self, command: str):
        self.insert_log(f'>> {command}')
        try:
            if command == 'test':
                self.music_player.music_pause()
                self.music_player.play_unstoppable_music('audio/테스트.mp3')
                self.music_player.music_resume()
            elif command == 'get_musics':
                with self.storage_manager.lock:
                    log = '=================현재 기상송===============\n'
                    for file_path in self.storage_manager.files_to_play:
                        log += file_path + '\n'
                    log += '========================================='
                    self.insert_log(log)
            elif command == 'all_around_test':
                self.scheduler.all_around_test()
            elif command == 'abort_song':
                self.music_player.close()
            elif command.startswith('-'):
                self.scheduler.push_tag_command(command[1:])
            else:
                self.insert_log(f'?? {command}')

        except:
            self.insert_log(traceback.format_exc())
        self.insert_log(f'<< {command}')
示例#32
0
class MusicScreen(Screen):
    ''' Shows the popup to choose the file to play
    '''
    '''def show_load(self):
        content = LoadDialog(load=self.load, cancel=self.dismiss_popup)
        self._popup = Popup(title="Load file", content=content,
                            size_hint=(0.9, 0.9))
        self._popup.open()

    def dismiss_popup(self):
        self._popup.dismiss()'''
    def __init__(self, **kwargs):
        super(MusicScreen, self).__init__(**kwargs)
        #self.library_manager = LibraryManager()
        self.player = MusicPlayer()

        # # Getting the layout to dinamically add the buttons
        #ml_list_view = self.ids.ml_list_view

        # adding files to library
        #songs = self.library_manager.parse_library()

        # for song in songs:
        #    btn = Button(text=os.path.basename(song), font_size=14)# , on_press=self.play_station(radio)
        #    #btn.bind(on_press=self.pressed)
        #    #btn.bind(on_press=self.play_station)
        #    ml_layout.add_widget(btn)

        # list_adapter = ListAdapter(data=songs, cls=ListItemButton, selection_mode='single')
        # list_adapter.bind(on_selection_change=self.selection_change)

        # ml_list_view.adapter = list_adapter

        # songs_text = ''
        # for song in songs:
        #     songs_text = songs_text + song

        # library_text.text = songs_text#''.join('aaaa ').join('bbbb')#, 'and something else')
        #library_text.text = library_text.text.join('bbbb')

    def selection_change(self, adapter, *args):
        print "selection changed"

    def load(self, path, filename):
        pass
        #self.player.stop_audio()
        self.player.load_audio(filename[0])
        #self.dismiss_popup()

    '''Playing or pausing a song.
        1) If stopped play it again from the 'elapsed' value.
           If it's 0 play it from the beginning.
        2) If it's playing store the elapsed time and stop the song.
    '''

    def play_pause_audio(self):
        pass
        self.player.play_pause_audio()

    def pause_audio(self):
        pass
        self.player.pause_audio()

    def play_audio(self):
        pass
        self.player.play_audio()

    ''' Stopping the song.
        1) self.elapsed set to 0 so the next song (or the same)
           will be played from the beginning
        2) actually stop the song
    '''

    def stop_audio(self):
        pass
        self.player.stop_audio()

    ''' Reloading the song if it's currently playing.
        Just call self.stop_song and then self.play_pause_song        
    '''

    def reload_audio(self):
        pass
        self.player.reload_audio()

    ''' Setting the volume.
        When the value of the slider is changed, this will affect the 
        volume of the played song.
    '''

    def set_volume(self, value):
        pass
        self.player.set_volume(value)
示例#33
0
class EscortEngine:
    """ This is the main engine to be used in the game. This is the
        Lemmings-esque escort engine. Call set_stage(#) before calling main(). """
    def __init__(self, screen=None):
        # See if we've been given a screen to use
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen

        self.running = True
        self.clock = pygame.time.Clock()

        # Gots to have us a background and a walkable mask
        self.background = None
        self.mask = None

        # If anyone takes screenshots, they can do so with this!
        self.screenshot_counter = 0

        # Initialize our reusable robotic girl
        self.girl = Girl()

        # What is the current state of our game
        self.state = "Running"
        
        # Load our music player
        self.music_player = MusicPlayer()
        self.sound_player = SoundPlayer()
        self.girl.sound_player = self.sound_player

    def set_stage(self, stage_number):
        """ Set the current stage to the specified number and load the
            appropriate images. In addition, set the starting information
            for the player. Then, set the mask/image to the proper images
            and blit the background to the screen. """
        if stage_number == 1:
            self.background = pygame.image.load(data.filepath("stage8.png"))
            self.original_mask = pygame.image.load(data.filepath("stage8_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 150)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 2:
            self.background = pygame.image.load(data.filepath("stage1.png"))
            self.original_mask = pygame.image.load(data.filepath("stage1_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 525)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 3:
            self.background = pygame.image.load(data.filepath("stage5.png"))
            self.original_mask = pygame.image.load(data.filepath("stage5_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 500)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 4:
            self.background = pygame.image.load(data.filepath("stage4.png"))
            self.original_mask = pygame.image.load(data.filepath("stage4_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 5:
            self.background = pygame.image.load(data.filepath("stage2.png"))
            self.original_mask = pygame.image.load(data.filepath("stage2_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (25, 100)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 6:
            self.background = pygame.image.load(data.filepath("stage10.png"))
            self.original_mask = pygame.image.load(data.filepath("stage10_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 7:
            self.background = pygame.image.load(data.filepath("stage3.png"))
            self.original_mask = pygame.image.load(data.filepath("stage3_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 8:
            self.background = pygame.image.load(data.filepath("stage13.png"))
            self.original_mask = pygame.image.load(data.filepath("stage13_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 9:
            self.background = pygame.image.load(data.filepath("stage6.png"))
            self.original_mask = pygame.image.load(data.filepath("stage6_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 225)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 10:
            self.background = pygame.image.load(data.filepath("stage7.png"))
            self.original_mask = pygame.image.load(data.filepath("stage7_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 300)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False, True)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 11:
            self.background = pygame.image.load(data.filepath("stage14.png"))
            self.original_mask = pygame.image.load(data.filepath("stage14_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False, True)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 12:
            self.background = pygame.image.load(data.filepath("stage9.png"))
            self.original_mask = pygame.image.load(data.filepath("stage9_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 450)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 13:
            self.background = pygame.image.load(data.filepath("stage12.png"))
            self.original_mask = pygame.image.load(data.filepath("stage12_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 14:
            self.background = pygame.image.load(data.filepath("stage11.png"))
            self.original_mask = pygame.image.load(data.filepath("stage11_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 15:
            self.background = pygame.image.load(data.filepath("stage15.png"))
            self.original_mask = pygame.image.load(data.filepath("stage15_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (305, 311)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 16:
            self.background = pygame.image.load(data.filepath("stage16.png"))
            self.original_mask = pygame.image.load(data.filepath("stage16_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 17:
            self.background = pygame.image.load(data.filepath("stage17.png"))
            self.original_mask = pygame.image.load(data.filepath("stage17_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 125)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 18:
            self.background = pygame.image.load(data.filepath("stage18.png"))
            self.original_mask = pygame.image.load(data.filepath("stage18_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 140)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False, True)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 19:
            self.background = pygame.image.load(data.filepath("stage19.png"))
            self.original_mask = pygame.image.load(data.filepath("stage19_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 410)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 20:
            self.background = pygame.image.load(data.filepath("stage20.png"))
            self.original_mask = pygame.image.load(data.filepath("stage20_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (75, 110)
            
            self.music_player.load("manna_and_me.ogg")
        # All of that is done; now set up the initial environment to have the
        # player wander around in.
        self.mask = pygame.surface.Surface(self.original_mask.get_rect().size)
        self.mask.blit(self.original_mask, (0, 0))
        self.screen.blit(self.background, (0, 0))

    def grab_screenshot(self):
        """ Take a screenshot of the current screen. """
        pygame.image.save(self.screen, "screenshot" + str(self.screenshot_counter) + ".bmp")
        self.screenshot_counter += 1

    def main(self):
        """ The main game loop. Be sure to call set_stage(#) first! """
        # Initialize our player sprite group
        player_group = pygame.sprite.RenderPlain(self.girl)

        # Initialize all of our "wrenches", or in-game draggable objects
        wrenches = []
        wrench_group = GobjectGroup()
        for i in range(Constants.START_BLOCKS):
            wrenches.append(WrenchBlock())
            wrench_group.add(wrenches[i])
            
        self.music_player.play()

        # Game loop!
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_s:
                        self.grab_screenshot()
                    elif event.key == pygame.K_ESCAPE:
                        self.state = "exit"
                        self.running = False
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        wrench_group.handle_click(True)
                elif event.type == pygame.MOUSEBUTTONUP:
                    if event.button == 1:
                        wrench_group.handle_click(False)
                elif event.type == pygame.QUIT:
                    self.running = False

            # Clear all of the drawn sprites
            player_group.clear(self.screen, self.background)
            wrench_group.clear(self.screen, self.background)

            # This special little bit right here is for handling masks with the
            # draggable objects.
            wrench_group.clear(self.mask, self.original_mask)
            wrench_group.update()
            wrench_group.draw_to_mask(self.mask)

            # Update the player
            player_group.update(self.mask)

            # Draw the player and the wrenches to the screen
            player_group.draw(self.screen)
            wrench_group.draw(self.screen)

            pygame.display.flip()
            self.clock.tick(Constants.MAX_FPS)

            # If we've hit a condition to end the game, do so.
            if self.girl.done:
                self.girl.done = False
                self.state = "victory"
                self.running = False
            elif not self.girl.living:
                self.girl.living = True
                self.state = "failure"
                self.running = False

        self.music_player.stop()
示例#34
0
 def __init__(self, **kwargs):
     super(MusicScreen, self).__init__(**kwargs)
     #self.library_manager = LibraryManager()
     self.player = MusicPlayer()
示例#35
0
文件: server.py 项目: cp9ev/xiaoma
class MusicServer:
    client_list = {}
    root_dir = './musics'
    search_tool = Search()
    download_queue = []

    def __init__(self):
        self.music_list = []
        self.music_player = MusicPlayer()
        self.api_map = self.init_router()

        self.start_flag = False
        self.playing_flag = False
        self.play_mode = 'loop'
        self.current_index = -1
        self.current_music = {}

        websocket_server = websockets.serve(self.service, '192.168.1.209', 8888)
        asyncio.get_event_loop().run_until_complete(websocket_server)
        asyncio.ensure_future(self.auto_next())
        asyncio.ensure_future(self.download_task())
        asyncio.get_event_loop().run_forever()

    async def service(self, websocket, path):
        client_name = self.handle_client(websocket, path)
        async for message in websocket:
            await self.router(client_name, json.loads(message))

    async def router(self, client_name, request):
        print(f'{client_name}:{request}')
        await self.api_map[request['path']](request=request, client_name=client_name)

    async def send_response(self, path, data, client_name=None):
        response = json.dumps({'api': path, 'data': data})
        if client_name is not None:
            await self.client_list[client_name].send(response)
        else:
            offline = []
            for client, ws in self.client_list.items():
                try:
                    await ws.send(response)
                except Exception as e:
                    print(f'{client} offline')
                    offline.append(client)
            for client in offline:
                self.client_list.pop(client)

    async def get_player_info(self, **kwargs):
        request = kwargs['request']
        data = {
            'mode': self.play_mode,
            'music': self.current_music,
            'play_status': self.playing_flag,
            'volume': self.music_player.get_music_volume()
        }
        await self.send_response(request['path'], data)

    async def get_local_music_list(self, **kwargs):
        request = kwargs['request']
        self.music_list = get_local_music_list(self.root_dir)
        data = {'player_status': self.start_flag, 'music_list': self.music_list}
        send_mode = kwargs['send_mode'] if kwargs.get('send_mode') else 1
        if send_mode == 1:
            await self.send_response(request['path'], data, kwargs['client_name'])
        else:
            await self.send_response(request['path'], data)

    async def search_music_list(self, **kwargs):
        request = kwargs['request']
        search_value = request['query']['search_value']
        music_list = await self.search_tool.search_song(search_value)
        data = {'player_status': self.start_flag, 'music_list': music_list}
        await self.send_response(request['path'], data, kwargs['client_name'])

    async def download_music(self, **kwargs):
        request = kwargs['request']
        music = request['query']['music']
        self.download_queue.append(music)
        await self.send_response(request['path'], self.download_queue)

    async def set_mode(self, **kwargs):
        request = kwargs['request']
        self.play_mode = request['query']['mode']
        await self.send_response(request['path'], {'play_mode': self.play_mode})

    async def play_music(self, **kwargs):
        request = kwargs['request']
        index = request['query']['index']
        music = self.music_list[index]
        music_file = parse_file_path(self.root_dir, music)
        self.music_player.play_click(music_file)
        self.start_flag = True
        self.playing_flag = True
        self.current_index = index
        self.current_music = music
        await self.send_response(request['path'], music)

    async def pause_music(self, **kwargs):
        request = kwargs['request']
        self.music_player.pause_click()
        self.playing_flag = False
        await self.send_response(request['path'], {'play_status': 'play'})

    async def unpause_music(self, **kwargs):
        if not self.start_flag:
            await self.next_music(request={'path': 'music/next'})
        else:
            request = kwargs['request']
            self.music_player.unpause_click()
            self.playing_flag = True
            await self.send_response(request['path'], {'play_status': 'pause'})

    async def pre_music(self, **kwargs):
        request = kwargs['request']
        index = self.get_index('pre')
        await self.play_music(request={'path': request['path'], 'query': {'index': index}})

    async def next_music(self, **kwargs):
        request = kwargs['request']
        index = self.get_index('next')
        await self.play_music(request={'path': request['path'], 'query': {'index': index}})

    async def set_volume(self, **kwargs):
        request = kwargs['request']
        volume = request['query']['volume_value']
        self.music_player.set_volume(round(volume/100, 2))
        await self.send_response(request['path'], volume)

    def get_index(self, click_type):
        if not self.start_flag:
            return 0
        if self.play_mode == 'loop':
            if click_type == 'pre':
                index = -1 if self.current_index == 0 else self.current_index-1
            if click_type == 'next':
                index = 0 if self.current_index == len(self.music_list) - 1 else self.current_index + 1
        elif self.play_mode == 'random':
            index = random.randrange(0, len(self.music_list))
        return index

    async def auto_next(self):
        while True:
            if self.start_flag:
                if self.music_player.get_music_pos() == -1:
                    await self.next_music(request={'path': 'music/next'})
            await asyncio.sleep(1)

    async def download_task(self):
        while True:
            if len(self.download_queue) >= 1:
                task_wait = self.download_queue[0]
                ret = await download_mp3(task_wait)
                self.download_queue.remove(task_wait)
                await self.send_response('music/download', self.download_queue)
                if ret['code'] == 1:
                    await self.get_local_music_list(request={'path': 'music/local'}, send_mode='2')
                await self.send_response('music/msg', ret['msg'])
            else:
                await asyncio.sleep(1)

    def init_router(self):
        return {
            'music/playerInfo': self.get_player_info,
            'music/local': self.get_local_music_list,
            'music/search': self.search_music_list,
            'music/download': self.download_music,
            'music/playMode': self.set_mode,
            'music/play': self.play_music,
            'music/pause': self.pause_music,
            'music/unpause': self.unpause_music,
            'music/pre': self.pre_music,
            'music/next': self.next_music,
            'music/volume': self.set_volume
        }

    def handle_client(self, ws, path):
        client_name = path.replace('/', '')
        self.client_list[client_name] = ws
        return client_name
class MusicBrowser(gtk.VBox):
    
    def __init__(self):
        super(MusicBrowser, self).__init__()
        
        # check network status
        self.progress_value = 0
        self.is_reload_flag = False        
        self.network_connected_flag = False
        self.update_progress_flag = True
        self.prompt_text = "正在加载数据(%d%%),如果长时间没有响应,点击此处刷新"
        
        self._player = MusicPlayer()
        self._player_interface = PlayerInterface()
        self._ttp_download = TTPDownload()
        
        self.loading_box = LoadingBox(self.prompt_text % self.progress_value, "此处", self.reload_browser)
        self.network_failed_box = NetworkConnectFailed(self.check_network_connection)
        self.check_network_connection(auto=True)

        self.webview = webkit.WebView()
        self.webview.set_transparent(True)
        
        settings = self.webview.get_settings()
        settings.set_property('enable-plugins', False)
        self.webview.set_settings(settings)
        
        self.webview.load_uri("http://musicmini.baidu.com/static/recommend/recommend.html")
        self.js_context = jscore.JSContext(self.webview.get_main_frame().get_global_context()).globalObject                        
        self.webview.connect("load-finished", self.on_webview_load_finished)

        self.webview.connect("load-progress-changed", self.on_webview_progress_changed)
        
        # message status
        self.webview.connect("script-alert", self.on_webview_script_alert)        
        self.webview.connect("console-message", self.on_webview_console_message)
        
        # resource load
        self.webview.connect("resource-load-failed", self.on_webview_resource_request)
        # self.webview.connect("resource-request-starting", self.on_webview_resource_request)
        # self.webview.connect("resource-load-finished", self.on_webview_resource_request)
        
        
    def on_webview_script_alert(self, widget, frame, message):    
        self.injection_object()
        self._player.alert(message)
        
        # reject alert dialog.
        return True
    
    def on_webview_console_message(self, widget, message, line, source_id):
        return True
    
    def on_webview_resource_request(self, *args):    
        self.injection_object()
            
    def on_webview_progress_changed(self, widget, value):    
        if self.update_progress_flag:
            if self.is_reload_flag:
                self.progress_value = (100 + value ) / 200.0
            else:    
                self.progress_value = value / 200.0            
                
            self.loading_box.update_prompt_text(self.prompt_text % int(self.progress_value * 100))    
        
    def check_network_connection(self, auto=False):    
        if is_network_connected():
            self.network_connected_flag = True
            switch_tab(self, self.loading_box)
            if not auto:
                self.reload_browser()
        else:    
            self.network_connected_flag = False
            switch_tab(self, self.network_failed_box)
            
    def reload_browser(self):        
        self.is_reload_flag = False
        self.update_progress_flag = True
        self.progress_value = 0
        self.webview.reload()
            
    def injection_object(self):
        self.js_context.player = self._player
        self.js_context.window.top.ttp_download = self._ttp_download
        self.js_context.window.top.playerInterface = self._player_interface
        self.js_context.link_support = True
        self.js_context.alert = self._player.alert
        
    def injection_js(self):    
        js_e = self.js_context.document.createElement("script")
        js_e.src = "http://musicmini.baidu.com/resources/js/jquery.js"
        self.js_context.document.appendChild(js_e)
        
    def on_webview_load_finished(self, *args):    
        if not self.is_reload_flag:
            self.webview.reload()
            self.is_reload_flag = True
        elif self.is_reload_flag and self.update_progress_flag:    
            self.update_progress_flag = False
            if self.network_connected_flag:
                switch_tab(self, self.webview)
            
        # inject object.    
        self.injection_object()            
示例#37
0
class TitleScreen:
    """ Just a stage clear intermission screen. Nothing at all
        fancy here. """
    def __init__(self, screen = None):
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen
        self.running = True
        
        self.music_player = MusicPlayer("palnap4.ogg")
        
        self.clock = pygame.time.Clock()
        
        self.choice = 0

    def main(self):
        """ Display the screen and a little bit of text at the bottom
            of the screen. """
        self.music_player.play()
        xasm_logo = pygame.image.load(data.filepath("xasm.png"))
        title_screen = pygame.image.load(data.filepath("title.png"))
        font = pygame.font.Font(None, 24)
        start_game = False
        alpha = 0
        fade_in = True
        
        logo_alpha = 0
        
        skip = False
        
        while logo_alpha < 255 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha += 3
            pygame.display.flip()
            self.clock.tick(30)
        
        while logo_alpha > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha -= 3
            pygame.display.flip()
            self.clock.tick(30)
        
        skip = False
        counter = 50
        while counter > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            text = font.render("Dedicated to the memory of Phoebe...", 1, (255, 255, 255))
            text2 = font.render("We'll miss you...", 1, (255, 255, 255))
            self.screen.blit(text, (150, 300))
            self.screen.blit(text2, (225, 325))
            pygame.display.flip()
            self.clock.tick(30)
            counter -= 1
            
        choice = 0
        
        while not start_game:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP:
                        self.choice -= 1
                    elif event.key == pygame.K_DOWN:
                        self.choice += 1
                    elif event.key == pygame.K_RETURN:
                        start_game = True
                    elif event.key == pygame.K_ESCAPE:
                        self.running = False
                        return
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            if self.choice < 0:
                self.choice = 1
            elif self.choice > 1:
                self.choice = 0
            new_game = "[ new game ]"
            continue_game = "[ continue game ]"
            if self.choice == 0:
                new_game = "> " + new_game
            elif self.choice == 1:
                continue_game = "> " + continue_game
            # There's some weird-ass PyGame font bug in 1.7, so the text is
            # ant-aliased.
            text = font.render(new_game, 1, (5, 231, 96))
            text2 = font.render(continue_game, 1, (5, 231, 96))
            self.screen.blit(title_screen, (0, 0))
            self.screen.blit(text, (200, 525))
            self.screen.blit(text2, (200, 550))
            pygame.display.flip()
            self.clock.tick(30)
        self.music_player.stop()
示例#38
0
class EscortEngine:
    """ This is the main engine to be used in the game. This is the
        Lemmings-esque escort engine. Call set_stage(#) before calling main(). """
    def __init__(self, screen=None):
        # See if we've been given a screen to use
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen

        self.running = True
        self.clock = pygame.time.Clock()

        # Gots to have us a background and a walkable mask
        self.background = None
        self.mask = None

        # If anyone takes screenshots, they can do so with this!
        self.screenshot_counter = 0

        # Initialize our reusable robotic girl
        self.girl = Girl()

        # What is the current state of our game
        self.state = "Running"

        # Load our music player
        self.music_player = MusicPlayer()
        self.sound_player = SoundPlayer()
        self.girl.sound_player = self.sound_player

    def set_stage(self, stage_number):
        """ Set the current stage to the specified number and load the
            appropriate images. In addition, set the starting information
            for the player. Then, set the mask/image to the proper images
            and blit the background to the screen. """
        if stage_number == 1:
            self.background = pygame.image.load(data.filepath("stage8.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage8_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 150)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 2:
            self.background = pygame.image.load(data.filepath("stage1.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage1_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 525)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 3:
            self.background = pygame.image.load(data.filepath("stage5.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage5_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 500)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 4:
            self.background = pygame.image.load(data.filepath("stage4.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage4_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 5:
            self.background = pygame.image.load(data.filepath("stage2.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage2_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (25, 100)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 6:
            self.background = pygame.image.load(data.filepath("stage10.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage10_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 7:
            self.background = pygame.image.load(data.filepath("stage3.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage3_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 8:
            self.background = pygame.image.load(data.filepath("stage13.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage13_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 9:
            self.background = pygame.image.load(data.filepath("stage6.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage6_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 225)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 10:
            self.background = pygame.image.load(data.filepath("stage7.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage7_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 300)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False,
                                                    True)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 11:
            self.background = pygame.image.load(data.filepath("stage14.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage14_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False,
                                                    True)

            self.music_player.load("rejects.ogg")
        elif stage_number == 12:
            self.background = pygame.image.load(data.filepath("stage9.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage9_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 450)

            self.music_player.load("rejects.ogg")
        elif stage_number == 13:
            self.background = pygame.image.load(data.filepath("stage12.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage12_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)

            self.music_player.load("rejects.ogg")
        elif stage_number == 14:
            self.background = pygame.image.load(data.filepath("stage11.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage11_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)

            self.music_player.load("rejects.ogg")
        elif stage_number == 15:
            self.background = pygame.image.load(data.filepath("stage15.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage15_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (305, 311)

            self.music_player.load("rejects.ogg")
        elif stage_number == 16:
            self.background = pygame.image.load(data.filepath("stage16.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage16_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 17:
            self.background = pygame.image.load(data.filepath("stage17.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage17_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 125)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 18:
            self.background = pygame.image.load(data.filepath("stage18.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage18_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 140)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False,
                                                    True)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 19:
            self.background = pygame.image.load(data.filepath("stage19.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage19_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 410)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 20:
            self.background = pygame.image.load(data.filepath("stage20.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage20_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (75, 110)

            self.music_player.load("manna_and_me.ogg")
        # All of that is done; now set up the initial environment to have the
        # player wander around in.
        self.mask = pygame.surface.Surface(self.original_mask.get_rect().size)
        self.mask.blit(self.original_mask, (0, 0))
        self.screen.blit(self.background, (0, 0))

    def grab_screenshot(self):
        """ Take a screenshot of the current screen. """
        pygame.image.save(self.screen,
                          "screenshot" + str(self.screenshot_counter) + ".bmp")
        self.screenshot_counter += 1

    def main(self):
        """ The main game loop. Be sure to call set_stage(#) first! """
        # Initialize our player sprite group
        player_group = pygame.sprite.RenderPlain(self.girl)

        # Initialize all of our "wrenches", or in-game draggable objects
        wrenches = []
        wrench_group = GobjectGroup()
        for i in range(Constants.START_BLOCKS):
            wrenches.append(WrenchBlock())
            wrench_group.add(wrenches[i])

        self.music_player.play()

        # Game loop!
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_s:
                        self.grab_screenshot()
                    elif event.key == pygame.K_ESCAPE:
                        self.state = "exit"
                        self.running = False
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        wrench_group.handle_click(True)
                elif event.type == pygame.MOUSEBUTTONUP:
                    if event.button == 1:
                        wrench_group.handle_click(False)
                elif event.type == pygame.QUIT:
                    self.running = False

            # Clear all of the drawn sprites
            player_group.clear(self.screen, self.background)
            wrench_group.clear(self.screen, self.background)

            # This special little bit right here is for handling masks with the
            # draggable objects.
            wrench_group.clear(self.mask, self.original_mask)
            wrench_group.update()
            wrench_group.draw_to_mask(self.mask)

            # Update the player
            player_group.update(self.mask)

            # Draw the player and the wrenches to the screen
            player_group.draw(self.screen)
            wrench_group.draw(self.screen)

            pygame.display.flip()
            self.clock.tick(Constants.MAX_FPS)

            # If we've hit a condition to end the game, do so.
            if self.girl.done:
                self.girl.done = False
                self.state = "victory"
                self.running = False
            elif not self.girl.living:
                self.girl.living = True
                self.state = "failure"
                self.running = False

        self.music_player.stop()