Script outline
my script is laid out like this:- play_jingle method (jingle_name='') - plays a random or specific jingle
- check_timings method () - checks whether a jingle should be played
- play_media method (media_path) - plays a peice of media through libVLC from a path
- music_collections dictionary - full of collections of music
- collection dictionary - laid out with genres, which will be randomly selected between based on what they like
- genres dictionary - has a name, an array of music file or folder paths and an array of other genres that this genre likes
- play_collection method (music_collection) - runs through a music collection infinitely
- main method () - just starts play_collection()
useful snippets:
global vlc instanceimport vlc instance = vlc.Instance() player = instance.media_player_new()
play some media + output to a http stream
media = instance.media_new(media_path)
media.add_option(":sout=#http{mux=ffmpeg{mux=mp3},dst=:8080/radio_1.ogg}")
media.add_option("no-video")
player.set_media(media)
media.parse()
player.play()
time.sleep(media.get_duration() / 1000)
player.stop()
what collections looks like
music_list = {
'daytime_collections': [
{
'name': 'genre1',
'music': [
'/path/to/music/folder/',
'/path/to/music/file.mp3'
],
'likes': ['genre2']
},
{
'name': 'genre2',
'music': [
'/path/to/music/folder/',
'/path/to/music/folder/',
'/path/to/music/file.mp3'
],
'likes': ['genre1']
},
],
'nighttime_collections': [
{
'name': 'genre1',
'music': [
'/path/to/music/folder/',
'/path/to/music/file.mp3'
],
'likes': ['genre2']
},
{
'name': 'genre2',
'music': [
'/path/to/music/folder/',
'/path/to/music/folder/',
'/path/to/music/file.mp3'
],
'likes': ['genre1', 'genre3']
},
{
'name': 'genre3',
'music': [
'/path/to/music/folder/',
'/path/to/music/file.mp3',
'/path/to/music/file.mp3'
],
'likes': ['genre2', 'genre1']
},
]
}
play a collection
def play_collection(music_collection):
collection = {}
playlist_memory = [] # holds 30 items
previous_collection_name = ''
completed_n_playlists = 0
selected_collection_name = 'Rock'
night_shift_done = False
# for number in range(0, 50):
while True:
if 8 > datetime.datetime.now().hour > 18 and not night_shift_done:
night_shift_done = True
play_jingle('nighttime') # nighttime shift jingle
collections = 'nighttime_collections' # nighttime mode
else:
play_jingle('daytime') # daytime shift jingle
collections = 'daytime_collections'
night_shift_done = False
print('\nSelecting collection with name: ' + str(selected_collection_name) + '...')
for i in music_collection[collections]:
if i['name'] == selected_collection_name:
collection = i
if collection == {}:
print('Selecting collection failed! Falling back to previous collection...')
selected_collection_name = previous_collection_name
continue
previous_collection_name = selected_collection_name
music = collection['music'].copy()
for i in range(0, len(music)):
if len(playlist_memory) >= 30:
del playlist_memory[0]
playlist = random.choice(music)
music.remove(playlist)
if playlist in playlist_memory:
print('### Skipping Playlist ' + str(playlist))
continue
else:
playlist_memory.append(playlist)
print('#### Loaded Playlist ' + str(playlist))
playlist_path = pathlib.Path(base_music_directory, playlist)
if playlist_path.is_dir():
for music_file in sorted(playlist_path.rglob('*.*')):
if music_file.suffix in ['.jpg', '.png', '.url', '.txt']:
continue
if 'flac' in str(music_file).lower().replace(music_file.suffix, ''):
continue
print('## Playing File: ' + str(music_file))
play_media(music_file)
completed_n_playlists += 1
else:
print('## Playing File: ' + str(playlist_path))
play_media(playlist_path)
completed_n_playlists += 1
if random.randint(0,
3) == 0 or completed_n_playlists > 20: # 25% chance of moving to a different collection
completed_n_playlists = 0
break
selected_collection_name = random.choice(collection['likes'])
collection = {}
end notes
you can use this code how ever you want (with credit please)i have no idea if this works / how it works with something like icecast
useful links:
https://stackoverflow.com/questions/64500860/can-i-stream-a-file-with-python-vlc