#!/usr/bin/env python # -*- coding: utf-8 -*- import vlc import os import pathlib import readline # 拡張子は小文字で定義 !! exts = ('.mp3', '.m4a', '.wav', '.wma', '.mpg', '.mov', '.mkv', '.mp4', '.webm') #exts = ('.mp3', '.m4a', '.flac', '.wav') HOME = os.path.expanduser('~') READLINE_HISTORY_FILE = '.pyvlcplayer_history' READLINE_HISTORY_PATH = os.path.join(HOME, READLINE_HISTORY_FILE) EQ_PRESET_BASS_BOOST = [14.5, 15.5, 10.5, 9.3, 10.8, 15.3, 0.0, 2.2, 7.8, 14.6] PATH = '/var/samba/MusicData/TRF' def walk(dir, exts): result = [] for path, dirs, files in os.walk(os.path.join(dir, '.'), followlinks=True): for file in files: #print(file) if file.lower().endswith(exts): dir_path = os.path.abspath(path) result.append(os.path.join(dir_path, file)) return result def printVLCMeta(media, path): title = media.get_meta(vlc.Meta.Title) artist = media.get_meta(vlc.Meta.Artist) album = media.get_meta(vlc.Meta.Album) trackNumber = media.get_meta(vlc.Meta.TrackNumber) trackNumber = trackNumber if not trackNumber is None else 0 trackTotal = media.get_meta(vlc.Meta.TrackTotal) trackTotal = trackTotal if not trackTotal is None else 0 genre = media.get_meta(vlc.Meta.Genre) #url = media.get_meta(vlc.Meta.URL) fileSize = os.path.getsize(path) print(f'Album: {album}') print(f'Title: {title}') print(f'File Size: {fileSize:,} bytes') print(f'Artist: {artist}') print(f'Genre: {genre} Track: {trackNumber: >3}/{trackTotal}') print(f'Path: {path}') #print(f'URL: {url}') def main(): pathlib.Path(READLINE_HISTORY_PATH).touch() readline.read_history_file(READLINE_HISTORY_PATH) flagEQ = False medias = walk(PATH, exts) medias.sort() print(f'Media Count: {len(medias)}') # No Video mode for headless Raspberry Pi vlcInstance = vlc.Instance('--no-video') #mediaList = vlc.MediaList() mediaList = vlcInstance.media_list_new() for index, media in enumerate(medias): print(f'Index: {index: >4} Path: {media}') mediaList.add_media(os.path.join(media[0], media[1])) #mediaListPlayer = vlc.MediaListPlayer() mediaListPlayer = vlcInstance.media_list_player_new() mediaListPlayer.set_media_list(mediaList) mediaListPlayer.set_playback_mode(vlc.PlaybackMode.loop) mediaListPlayer.play() mediaPlayer = mediaListPlayer.get_media_player() print('🎊🎂🍩🍩🍩 libvlc information 🍩🍩🍩🎂🎊') print(f"libvlc version: '{vlc.libvlc_get_version().decode()}' ✨") print(f"libvlc compiler version: '{vlc.libvlc_get_compiler().decode()}' ✨") print(f"libvlc changeset: '{vlc.libvlc_get_changeset().decode()}' ✨\n") while True: print('po: POSITION, i: INDEX/Info, p: PREVIOUS, n: NEXT, q: QUIT') print('eq [frequency band value list]: Equalizer On/Off') # 入力待ちプロンプト data = input('>> ') #POSITION if data == 'po': pos = mediaPlayer.get_position() print(f'Position: {pos}') #INDEX/Info elif data == 'i': media = mediaPlayer.get_media() index = mediaList.index_of_item(media) path = os.path.join(medias[index][0], medias[index][1]) print(f'Index: {index}') printVLCMeta(media, path) #PREVIOUS elif data == 'p': mediaListPlayer.previous() media = mediaPlayer.get_media() index = mediaList.index_of_item(media) fileName = media.get_meta(0) print(f'Previous -> Current Index: {index} File: {fileName}') #NEXT elif data == 'n': mediaListPlayer.next() media = mediaPlayer.get_media() index = mediaList.index_of_item(media) fileName = media.get_meta(0) print(f'Next -> Current Index: {index} File: {fileName}') #Set Equalizer elif data.startswith('eq'): #EQ Set if len(data) > 3 or not flagEQ: flagEQ = True eqFreqs = [] eqAmps = list(map(float, data[3:].split())) if len(eqAmps) == 0: eqAmps = EQ_PRESET_BASS_BOOST bandCount = vlc.libvlc_audio_equalizer_get_band_count() print(f'Band Count: {bandCount}') eq = vlc.AudioEqualizer() for bandIndex in range(bandCount): try: amp = eqAmps[bandIndex] except IndexError: amp = 0 eq.set_amp_at_index(amp, bandIndex) eqFreqs.append(vlc.libvlc_audio_equalizer_get_band_frequency(bandIndex)) print(f'Freq: {" ".join(map(str, eqFreqs))}') print(f'Amp: {" ".join(map(str, eqAmps))}') #EQ Off elif flagEQ: flagEQ = False eq = None print(f'Equalizer: {"On" if flagEQ else "Off"}') mediaPlayer.set_equalizer(eq) #QUIT elif data == 'q': mediaListPlayer.stop() readline.write_history_file(READLINE_HISTORY_PATH) print('Quit.') break if __name__ == '__main__': main()