Skip to content

Instantly share code, notes, and snippets.

@salinashf
Last active February 9, 2025 04:51
Show Gist options
  • Save salinashf/1885af7cb0a5f6bc7fb1755e7fb36bfc to your computer and use it in GitHub Desktop.
Save salinashf/1885af7cb0a5f6bc7fb1755e7fb36bfc to your computer and use it in GitHub Desktop.
Permite generar un PlayList (para VLC) de una de una carpeta determinada
import xml.etree.ElementTree as xml
import os
import sys
# List of extensions to be checked.
ext_list = ['.mp4', '.mkv', '.avi', '.flv',
'.mov', '.wmv', '.vob', '.mpg', '.3gp', '.m4v' , '.ts']
check_subdirectories = True # Set false to get files only from cwd.
path_track_relative = True # Determina si la ruta q se incluya en el playList es absoluta o relativa
class FileFound:
def __init__(self, name, path):
self.name = name
self.path = path
self.tracks = []
class Playlist:
"""Build xml playlist."""
def __init__(self, name_list):
# Defines basic tree structure.
self.playlist = xml.Element('playlist')
self.tree = xml.ElementTree(self.playlist)
self.playlist.set('xmlns', 'http://xspf.org/ns/0/')
self.playlist.set(
'xmlns:vlc', 'http://www.videolan.org/vlc/playlist/ns/0/')
self.playlist.set('version', '1')
self.title = xml.Element('title')
self.playlist.append(self.title)
self.title.text = name_list
self.trackList = xml.Element('trackList')
self.playlist.append(self.trackList)
def add_track(self, pathFolder, seqno):
name_master = pathFolder.name
for tk in pathFolder.tracks:
pathTrack = os.path.relpath(tk) if path_track_relative else tk
print("Path Track: ", pathTrack)
seqno += 1
track = xml.Element('track')
album = xml.Element('album')
location = xml.Element('location')
title = xml.Element('title')
track_num = xml.Element('trackNum')
ext = xml.Element('extension ')
ext.set('application', 'http://www.videolan.org/vlc/playlist/0')
vlc_id = xml.Element('vlc:id')
vlc_id.text = str(seqno)
ext.append(vlc_id)
# title.text = "[{}]-{}".format(name_master, os.path.basename(tk))
title.text = os.path.basename(tk)
location.text = "file:///{}".format(
os.path.join(pathTrack).replace('\\', '/'))
album.text = name_master
track_num.text = str(seqno)
track.append(title)
track.append(location)
track.append(album)
track.append(track_num)
track.append(ext)
self.trackList.append(track)
return seqno
def get_playlist(self):
# Return complete playlist with tracks.
return self.playlist
class Videos:
"""Manage files (videos) to be added to the playlist."""
def __init__(self):
pass
def remove_nonvideo_files(self, file_list):
# Removes files whose extension is not mentioned in ext_list from list of files.
for index, file_name in enumerate(file_list[:]):
# if file_name.endswith(tuple(ext_list)) or file_name.endswith(tuple(ext_list.upper())) :
if file_name.endswith(tuple(ext_list)) or file_name.endswith(tuple(ext.upper() for ext in ext_list)):
pass
else:
file_list.remove(file_name)
return file_list
def get_videos(self, path_finder):
# Returns list of video files in the directory.
if check_subdirectories:
# list_folder = []
list_folder = [
FileFound(os.path.basename(path_finder), path_finder)]
for root, dirs, files in os.walk(path_finder):
for name in dirs:
subdir_path = os.path.join(root, name)
# Excludes hidden directoriess.
if subdir_path.find('./') != -1:
pass
else:
list_folder.append(FileFound(name, subdir_path))
for index in range(len(list_folder)):
path = list_folder[index].path
all_files = os.listdir(path)
for f in self.remove_nonvideo_files(all_files):
location = path + '\\' + f
list_folder[index].tracks.append(location)
return list_folder
else:
sss = os.path.basename(path_finder)
list_folder = [
FileFound(os.path.basename(path_finder), path_finder)]
all_files = os.listdir(path_finder)
for f in self.remove_nonvideo_files(all_files):
location = path_finder + '\\' + f
list_folder[0].tracks.append(location)
return list_folder
def main():
args = sys.argv[1:]
path_finder = ''
if len(args) == 2 and args[0] == '-path':
path_finder = args[1]
elif len(args) == 1:
path_finder = args[0]
elif len(args) == 0:
path_finder = os.getcwd()
else:
print('Invalid arguments.')
return
if path_finder in ['./', '.', r'\.']:
path_finder = os.getcwd()
print("Path Finder::", path_finder)
# print('Path PlayList', path_finder)
# return
name_play_list = 'playList'
name_list = os.path.basename(path_finder)
playlist = Playlist(name_list)
videos = Videos()
video_files = videos.get_videos(path_finder)
seqno = 0
for path in video_files:
seqno = playlist.add_track(path, seqno)
playlist_xml = playlist.get_playlist()
path_play_list = os.path.join(
path_finder, '{}.xspf'.format(name_play_list))
with open(path_play_list, 'w') as mf:
mf.write(xml.tostring(playlist_xml).decode('utf-8'))
main()
'''
playlist(ROOT)
title /title
trackList
track
location file:///path /location
title /title
image /image
duration /duration
/track
/tracklist
/playlist
'''
@salinashf
Copy link
Author

He tomado como base este PRY https://gist.github.com/mayokunadeniyi/4675c4a475bf497b807bcec98ceefecb , colocar las secuencia es 0
variable seqno=44

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment