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
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 __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
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()
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('----------')
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'))
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
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 __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 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)
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 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'])
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
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()
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()
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)
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()
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)
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)
# 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()
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)
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)
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()
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()
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
# 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()
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
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}')
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)
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()
def __init__(self, **kwargs): super(MusicScreen, self).__init__(**kwargs) #self.library_manager = LibraryManager() self.player = MusicPlayer()
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()
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()
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()