Last active
February 9, 2025 04:51
-
-
Save salinashf/1885af7cb0a5f6bc7fb1755e7fb36bfc to your computer and use it in GitHub Desktop.
Permite generar un PlayList (para VLC) de una de una carpeta determinada
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
''' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
He tomado como base este PRY https://gist.github.com/mayokunadeniyi/4675c4a475bf497b807bcec98ceefecb , colocar las secuencia es 0
variable seqno=44