def get_formatter(plugin: Plugin): return Formatter( { "url": lambda: args.url, "author": lambda: plugin.get_author(), "category": lambda: plugin.get_category(), "game": lambda: plugin.get_category(), "title": lambda: plugin.get_title(), "time": lambda: datetime.now() }, { "time": lambda dt, fmt: dt.strftime(fmt) })
def _create_arguments(self): if self.namedpipe: filename = self.namedpipe.path if is_win32: if self.player_name == "vlc": filename = f"stream://\\{filename}" elif self.player_name == "mpv": filename = f"file://{filename}" elif self.filename: filename = self.filename elif self.http: filename = self.http.url else: filename = "-" extra_args = [] if self.title is not None: # vlc if self.player_name == "vlc": # see https://wiki.videolan.org/Documentation:Format_String/, allow escaping with \$ self.title = self.title.replace("$", "$$").replace(r'\$$', "$") extra_args.extend(["--input-title-format", self.title]) # mpv if self.player_name == "mpv": # see https://mpv.io/manual/stable/#property-expansion, allow escaping with \$, respect mpv's $> self.title = self._mpv_title_escape(self.title) extra_args.append(f"--force-media-title={self.title}") # potplayer if self.player_name == "potplayer": if filename != "-": # PotPlayer - About - Command Line # You can specify titles for URLs by separating them with a backslash (\) at the end of URLs. # eg. "http://...\title of this url" self.title = self.title.replace('"', '') filename = filename[:-1] + '\\' + self.title + filename[-1] # format args via the formatter, so that invalid/unknown variables don't raise a KeyError argsformatter = Formatter({ PLAYER_ARGS_INPUT_DEFAULT: lambda: filename, PLAYER_ARGS_INPUT_FALLBACK: lambda: filename }) args = argsformatter.title(self.args) cmd = self.cmd # player command if is_win32: eargs = subprocess.list2cmdline(extra_args) # do not insert and extra " " when there are no extra_args return " ".join([cmd] + ([eargs] if eargs else []) + [args]) return shlex.split(cmd) + extra_args + shlex.split(args)