PortValhalla/scripts/Common/Software/docker/services/jellyfin/pvpn-cli.py
2025-04-18 04:29:01 +02:00

72 lines
2.1 KiB
Python

#!/usr/bin/env python3
from argparse import ArgumentParser
from os import environ
import shlex
import subprocess
import sys
from typing import List
from protonvpn_cli.cli_wrapper import CLIWrapper
from protonvpn_nm_lib.api import FeatureEnum
from protonvpn_nm_lib.core.servers.list import LogicalServer
cli = CLIWrapper()
if not cli.protonvpn.get_session().is_valid:
print("You are not logged in.", file=sys.stderr)
if (sys.__stdin__ != None) and sys.__stdin__.isatty():
print("Please log in to ProtonVPN", file=sys.stderr)
print("Username: " + environ["PVPN_USERNAME"], file=sys.stderr)
result = subprocess.run(["protonvpn-cli", "login", environ["PVPN_USERNAME"]])
if result.returncode != 0:
exit(result.returncode)
else:
exit(0)
else:
print("Please run this container interactively in order to log in.", file=sys.stderr)
exit(1)
parser = ArgumentParser()
args = sys.argv[1:]
if not args:
args = shlex.split(environ.get("PVPN_CMD_ARGS") or "")
for alias in [
["-s", "--streaming"],
["--sc"],
["--p2p"],
["--tor"]
]:
parser.add_argument(*alias, action="store_true")
group = parser.add_mutually_exclusive_group()
for alias in [
["-f", "--fastest"],
["-r", "--random"]
]:
group.add_argument(*alias, action="store_true")
parser.add_argument("--cc")
parsedArgs = parser.parse_args()
features: List[FeatureEnum] = list()
if parsedArgs.streaming:
features.append(FeatureEnum.STREAMING)
if parsedArgs.sc:
features.append(FeatureEnum.SECURE_CORE)
if parsedArgs.p2p:
features.append(FeatureEnum.P2P)
if parsedArgs.tor:
features.append(FeatureEnum.TOR)
def match(server: LogicalServer):
return (parsedArgs.cc is None or server.exit_country.lower() == parsedArgs.cc.lower()) and (
all(feature in server.features for feature in features))
matches = cli.protonvpn.get_session().servers.filter(match)
server = matches.get_fastest_server() if parsedArgs.fastest else matches.get_random_server()
subprocess.run(["protonwire", "connect", server.data["Domain"]])