python:python-vlc

文書の過去の版を表示しています。


python-vlc

リアル世界でのVLC
ごめんなさい🙏ブラ男氏が縄張りを主張しちゃいました🐶😅💦

本家: Python bindings for VLC
ドキュメント: API Documentation

> pip install python-vlc
Collecting python-vlc
  Downloading python_vlc-3.0.7110-py3-none-any.whl (80 kB)
     |████████████████████████████████| 80 kB 721 kB/s
Installing collected packages: python-vlc
Successfully installed python-vlc-3.0.7110
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import vlc
import os
from os.path import expanduser
import mutagen
import pathlib
import readline
 
# 拡張子は小文字で定義 !!
#exts = ('.mp3', '.m4a', '.wav', '.wma', '.mpg', '.mov', '.mkv', '.mp4', '.webm')
exts = ('.mp3', '.m4a', '.flac', '.wav')
 
PATH = '/var/samba/DataShare/WinAmpData/TRF'
 
READLINE_HISTORY_FILE = expanduser('~/.pyvlcplayer_history')
EQ_PRESET_BASE_BOOST = [20.0, 10.5, 2.8, 9.3, 14.8, 6.3, 0.0, 2.2, 7.8, 15.6]
 
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):
    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)
 
    print(f'Album: {album}')
    print(f'Title: {title}')
    print(f'Artist: {artist}')
    print(f'Genre: {genre} Track: {trackNumber: >3}/{trackTotal}')
    #print(f'URL: {url}')
 
def main():
    pathlib.Path(READLINE_HISTORY_FILE).touch()
    readline.read_history_file(READLINE_HISTORY_FILE)
 
    flagEQ = False
 
    medias = walk(PATH, exts)
    medias.sort()
    print(f'Media Count: {len(medias)}')
 
    mediaList = vlc.MediaList()
 
    for index, media in enumerate(medias):
        print(f'Index: {index: >4} Path: {media}')
        mediaList.add_media(media)
 
    mediaListPlayer = vlc.MediaListPlayer()
    mediaListPlayer.set_media_list(mediaList)
    mediaListPlayer.set_playback_mode(vlc.PlaybackMode.loop)
    mediaListPlayer.play()
 
    mediaPlayer = mediaListPlayer.get_media_player()
    mediaPlayer.audio_set_volume(30)
 
    while True:
        print('po: POSITION, i: INDEX/Info, p: PREVIOUS, n: NEXT, q: QUIT')
        data = input()
 
        #POSITION
        if data == 'po':
            pos = mediaPlayer.get_position()
            print(f'Position: {pos}')
 
        #INDEX/Info
        elif data == 'i':
            media = mediaPlayer.get_media()
            path = media.get_mrl()
            #ft = mutagen.File(path)
            #title = ft['title']
            index = mediaList.index_of_item(media)
            print(f'Index: {index}')
            printVLCMeta(media)
 
        #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_BASE_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()
            print('Quit.')
            readline.write_history_file(READLINE_HISTORY_FILE)
            break
 
if __name__ == '__main__':
    main()

* os.walk() に followlinks=True オプションを追加。(シンボルリンクを辿るように指定)
eq で VLC のイコライザーを設定。

eq <- イコライザー Off の場合は EQ_PRESET_BASE_BOOST で On にする。
Band Count: 10
Freq: 31.25 62.5 125.0 250.0 500.0 1000.0 2000.0 4000.0 8000.0 16000.0
Amp: 20.0 10.5 2.8 9.3 14.8 6.3 0.0 2.2 7.8 15.6
Equalizer: On
po: POSITION, i: INDEX/Info, p: PREVIOUS, n: NEXT, q: QUIT
eq [frequency band value list]: Equalizer On/Off
eq 20 20 20 <- イコライザー 30Hz 60Hz 125Hz を 20.0 dB に設定する。
Band Count: 10
Freq: 31.25 62.5 125.0 250.0 500.0 1000.0 2000.0 4000.0 8000.0 16000.0
Amp: 20.0 20.0 20.0
Equalizer: On
po: POSITION, i: INDEX/Info, p: PREVIOUS, n: NEXT, q: QUIT
eq [frequency band value list]: Equalizer On/Off
eq <- イコライザー On の場合は Off にする。
Equalizer: Off
po: POSITION, i: INDEX/Info, p: PREVIOUS, n: NEXT, q: QUIT
eq [frequency band value list]: Equalizer On/Off
  • python/python-vlc.1621545296.txt.gz
  • 最終更新: 2021/05/21 06:14
  • by ともやん