From 8507bcb69ed4a1e708036f6ab896d92e770acc60 Mon Sep 17 00:00:00 2001 From: vzhd1701 Date: Wed, 8 Jun 2022 16:20:35 +0500 Subject: [PATCH] feat: add support for audio files --- gridplayer/params_static.py | 75 ++++++++++++++++++++++-- gridplayer/player/managers/add_videos.py | 26 +++++++- gridplayer/utils/next_file.py | 4 +- gridplayer/video.py | 4 +- 4 files changed, 98 insertions(+), 11 deletions(-) diff --git a/gridplayer/params_static.py b/gridplayer/params_static.py index 09ad665..71c0e5c 100644 --- a/gridplayer/params_static.py +++ b/gridplayer/params_static.py @@ -59,7 +59,69 @@ class WindowState(NamedTuple): "ru_RU", ) +# https://github.com/videolan/vlc/blob/3.0.16/include/vlc_interface.h#L152 +SUPPORTED_AUDIO_EXT = frozenset( + ( + "3ga", + "669", + "a52", + "aac", + "ac3", + "adt", + "adts", + "aif", + "aifc", + "aiff", + "amb", + "amr", + "aob", + "ape", + "au", + "awb", + "caf", + "dts", + "flac", + "it", + "kar", + "m4a", + "m4b", + "m4p", + "m5p", + "mka", + "mlp", + "mod", + "mpa", + "mp1", + "mp2", + "mp3", + "mpc", + "mpga", + "mus", + "oga", + "ogg", + "oma", + "opus", + "qcp", + "ra", + "rmi", + "s3m", + "sid", + "spx", + "tak", + "thd", + "tta", + "voc", + "vqf", + "w64", + "wav", + "wma", + "wv", + "xa", + "xm", + ) +) +# https://github.com/videolan/vlc/blob/3.0.16/include/vlc_interface.h#L158 SUPPORTED_VIDEO_EXT = frozenset( ( "3g2", @@ -70,7 +132,7 @@ class WindowState(NamedTuple): "asf", "avi", "bik", - "dav", + "crf", "divx", "drc", "dv", @@ -80,17 +142,18 @@ class WindowState(NamedTuple): "flv", "gvi", "gxf", + "iso", "m1v", + "m2v", "m2t", "m2ts", - "m2v", "m4v", "mkv", "mov", + "mp2", "mp2v", "mp4", "mp4v", - "mpa", "mpe", "mpeg", "mpeg1", @@ -101,6 +164,7 @@ class WindowState(NamedTuple): "mts", "mtv", "mxf", + "mxg", "nsv", "nuv", "ogg", @@ -114,18 +178,21 @@ class WindowState(NamedTuple): "rpl", "thp", "tod", - "tp", "ts", "tts", + "txd", "vob", "vro", "webm", + "wm", "wmv", "wtv", "xesc", ) ) +SUPPORTED_MEDIA_EXT = frozenset(SUPPORTED_AUDIO_EXT | SUPPORTED_VIDEO_EXT) + VLC_USER_AGENT_NAME = "Mozilla" VLC_USER_AGENT = ( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" diff --git a/gridplayer/player/managers/add_videos.py b/gridplayer/player/managers/add_videos.py index 90876ec..8169c68 100644 --- a/gridplayer/player/managers/add_videos.py +++ b/gridplayer/player/managers/add_videos.py @@ -2,7 +2,11 @@ from PyQt5.QtWidgets import QFileDialog from gridplayer.dialogs.add_urls import QAddURLsDialog -from gridplayer.params_static import SUPPORTED_VIDEO_EXT +from gridplayer.params_static import ( + SUPPORTED_AUDIO_EXT, + SUPPORTED_MEDIA_EXT, + SUPPORTED_VIDEO_EXT, +) from gridplayer.player.managers.base import ManagerBase from gridplayer.utils.misc import tr from gridplayer.utils.url_resolve.url_resolve import plugin_list_urls @@ -22,8 +26,7 @@ def cmd_add_videos(self): dialog = QFileDialog(self.parent()) dialog.setFileMode(QFileDialog.ExistingFiles) - supported_exts = " ".join((f"*.{e}" for e in sorted(SUPPORTED_VIDEO_EXT))) - dialog.setNameFilter("{0} ({1})".format(tr("Videos"), supported_exts)) + dialog.setNameFilters(_get_name_filters()) if dialog.exec(): videos = filter_video_uris(dialog.selectedFiles()) @@ -45,3 +48,20 @@ def cmd_add_urls(self): if valid_urls: self.videos_added.emit(valid_urls) + + +def _get_name_filters(): + ext_types = [ + {"name": tr("Media"), "extensions": SUPPORTED_MEDIA_EXT}, + {"name": tr("Video"), "extensions": SUPPORTED_VIDEO_EXT}, + {"name": tr("Audio"), "extensions": SUPPORTED_AUDIO_EXT}, + ] + + name_filers = [] + + for ext_type in ext_types: + ext_with_asterisk = (f"*.{e}" for e in sorted(ext_type["extensions"])) + ext_list = " ".join(ext_with_asterisk) + name_filers.append("{0} ({1})".format(ext_type["name"], ext_list)) + + return name_filers diff --git a/gridplayer/utils/next_file.py b/gridplayer/utils/next_file.py index 65cd0de..edff7b5 100644 --- a/gridplayer/utils/next_file.py +++ b/gridplayer/utils/next_file.py @@ -2,7 +2,7 @@ from pathlib import Path from typing import Optional -from gridplayer.params_static import SUPPORTED_VIDEO_EXT +from gridplayer.params_static import SUPPORTED_MEDIA_EXT def next_video_file(file: Path, is_shuffle=False) -> Optional[Path]: @@ -40,5 +40,5 @@ def _file_siblings(file: Path): return sorted( f for f in file.parent.iterdir() - if f.is_file() and f.suffix[1:].lower() in SUPPORTED_VIDEO_EXT + if f.is_file() and f.suffix[1:].lower() in SUPPORTED_MEDIA_EXT ) diff --git a/gridplayer/video.py b/gridplayer/video.py index 7be34f4..4b6971d 100644 --- a/gridplayer/video.py +++ b/gridplayer/video.py @@ -12,7 +12,7 @@ from pydantic.color import Color from gridplayer.params_static import ( - SUPPORTED_VIDEO_EXT, + SUPPORTED_MEDIA_EXT, VideoAspect, VideoRepeat, WindowState, @@ -48,7 +48,7 @@ def validate(cls, path: Path) -> Path: if not path.is_absolute(): raise PathNotAbsoluteError(path=path) - if path.suffix[1:].lower() not in SUPPORTED_VIDEO_EXT: + if path.suffix[1:].lower() not in SUPPORTED_MEDIA_EXT: raise PathExtensionNotSupportedError(path=path) return path