Web module for the console.
web(web_settings, downloader_settings)
Run the web server.
Arguments
- web_settings: Web server settings.
- downloader_settings: Downloader settings.
Source code in spotdl/console/web.py
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 | def web(web_settings: WebOptions, downloader_settings: DownloaderOptions):
"""
Run the web server.
### Arguments
- web_settings: Web server settings.
- downloader_settings: Downloader settings.
"""
# Apply the fix for mime types
fix_mime_types()
# Set up the app loggers
uvicorn_logger = logging.getLogger("uvicorn")
uvicorn_logger.propagate = False
spotipy_logger = logging.getLogger("spotipy")
spotipy_logger.setLevel(logging.NOTSET)
# Initialize the web server settings
app_state.web_settings = web_settings
app_state.logger = uvicorn_logger
# Create the event loop
app_state.loop = (
asyncio.new_event_loop()
if sys.platform != "win32"
else asyncio.ProactorEventLoop() # type: ignore
)
downloader_settings["simple_tui"] = True
# Download web app from GitHub
logger.info("Updating web app \n")
web_app_dir = str(get_spotdl_path().absolute())
download_github_dir(
"https://github.com/spotdl/web-ui/tree/dev/dist",
output_dir=web_app_dir,
)
app_state.api = FastAPI(
title="spotDL",
description="Download music from Spotify",
version=__version__,
dependencies=[Depends(get_current_state)],
)
app_state.api.include_router(router)
# Add the CORS middleware
app_state.api.add_middleware(
CORSMiddleware,
allow_origins=ALLOWED_ORIGINS + web_settings["allowed_origins"]
if web_settings["allowed_origins"]
else ALLOWED_ORIGINS,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Add the static files
app_state.api.mount(
"/",
SPAStaticFiles(directory=web_app_dir + "/dist", html=True),
name="static",
)
config = Config(
app=app_state.api,
host=web_settings["host"],
port=web_settings["port"],
workers=1,
log_level=NAME_TO_LEVEL[downloader_settings["log_level"]],
loop=app_state.loop, # type: ignore
)
app_state.server = Server(config)
app_state.downloader_settings = downloader_settings
# Open the web browser
webbrowser.open(f"http://{web_settings['host']}:{web_settings['port']}/")
# Start the web server
app_state.loop.run_until_complete(app_state.server.serve())
|