mirror of
https://github.com/tcsenpai/swingmusic.git
synced 2025-06-06 03:05:35 +00:00
add new flags to disable cleaning track and album titles
+ update readme +
This commit is contained in:
parent
51a5502efc
commit
be7fc26fce
125
README.md
125
README.md
@ -1,24 +1,22 @@
|
||||
# Swing music
|
||||
|
||||

|
||||
Swing Music is a beautiful, self-hosted music player for your local audio files. Like a cooler Spotify ... but bring
|
||||
your own music. Just run the app and
|
||||
enjoy your music library in a web browser.
|
||||
|
||||

|
||||
|  |  |
|
||||
|----------------------------------------------------------------------|----------------------------------------------------------------------|
|
||||
|  |  |
|
||||
|
||||

|
||||
### For more screenshots, see the [screenshots page on the website](https://swingmusic.vercel.app/screenshots.html).
|
||||
|
||||
---
|
||||
|
||||
### Make listening to your local music fun again.
|
||||
|
||||
`Swing` is a music player for local audio files built with both visual coolness and functionality in mind. Just run the app and enjoy your music library in a web browser.
|
||||
|
||||
### For screenshots, see the [screenshots page on the website](https://swingmusic.vercel.app/screenshots.html).
|
||||
|
||||
> Note: This project is in the early stages of development. Many features are missing but will be added with time.
|
||||
> This project is in the early stages of development. Many features are missing but will be added with time.
|
||||
|
||||
### Setup
|
||||
|
||||
Download the latest release from the [release page](https://github.com/geoffrey45/swingmusic/releases) and launch it. For Linux, you need to make the file executable first.
|
||||
Swing Music is available as pre-compiled binaries for Windows and Linux. Just download the latest release from
|
||||
the [release page](https://github.com/geoffrey45/swingmusic/releases) and launch it.
|
||||
For Linux, you need to make the file executable first.
|
||||
|
||||
```bash
|
||||
chmod a+x ./swingmusic
|
||||
@ -26,23 +24,31 @@ chmod a+x ./swingmusic
|
||||
./swingmusic
|
||||
```
|
||||
|
||||
The app should start at <http://localhost:1970> by default.
|
||||
The app should start at <http://localhost:1970> by default. You can change the default port or host by using
|
||||
the `--host` and `--port` flags.
|
||||
|
||||
```
|
||||
Usage: swingmusic [options]
|
||||
|
||||
Options:
|
||||
--build: Build the application (in development)
|
||||
--host: Set the host
|
||||
--port: Set the port
|
||||
|
||||
--show-feat, -sf: Do not extract featured artists from the song title
|
||||
--show-prod, -sp: Do not hide producers in the song title
|
||||
|
||||
--help, -h: Show this help message
|
||||
--version, -v: Show the app version
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
| Flags | Description |
|
||||
|--------------------------|--------------------------------------------------------------------------------------------------------------------|
|
||||
| --help, -h | Show this help message |
|
||||
| --version, -v | Show the app version |
|
||||
| --host | Set the host |
|
||||
| --port | Set the port |
|
||||
| --config | Set the config path |
|
||||
| --show-feat, -sf | Do not extract featured artists from the song title |
|
||||
| --show-prod, -sp | Do not hide producers in the song title |
|
||||
| --no-clean-albums, -nca | Don't clean album titles. Cleaning is done by removing information in parentheses and showing it separately |
|
||||
| --no-clean-tracks,-nct | Don't remove remaster information from track titles |
|
||||
| --no-periodic-scan, -nps | Disable periodic scan |
|
||||
| --scan-interval, -psi | Set the periodic scan interval in seconds. Default is 300 seconds (5 minutes) |
|
||||
| | |
|
||||
| --build | Build the application (in development) |
|
||||
|
||||
To stream your music across your local network, use the `--host` flag to run the app in all ports. Like this:
|
||||
|
||||
```sh
|
||||
@ -53,11 +59,13 @@ The link to access the app will be printed on your terminal. Copy it and open it
|
||||
|
||||
### Docker
|
||||
|
||||
You can run Swing in a Docker container. To do so, clone the repository and build the image:
|
||||
You can run Swing Music in a Docker container. To do so, clone the repository and build the image:
|
||||
|
||||
git clone https://github.com/swing-opensource/swingmusic.git --depth 1
|
||||
cd swingmusic
|
||||
docker build . -t swingmusic
|
||||
```bash
|
||||
git clone https://github.com/swing-opensource/swingmusic.git --depth 1
|
||||
cd swingmusic
|
||||
docker build . -t swingmusic
|
||||
```
|
||||
|
||||
Then create the container. Here are some example snippets to help you get started creating a container.
|
||||
|
||||
@ -74,7 +82,7 @@ services:
|
||||
- /path/to/music:/music
|
||||
- /path/to/config:/config
|
||||
ports:
|
||||
- 1970:1970
|
||||
- "1970:1970"
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
@ -92,27 +100,35 @@ docker run -d \
|
||||
|
||||
#### Parameters
|
||||
|
||||
Container images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate `<external>:<internal>` respectively. For example, `-p 8080:80` would expose port `80` from inside the container to be accessible from the host's IP on port `8080` outside the container.
|
||||
Container images are configured using parameters passed at runtime (such as those above). These parameters are separated
|
||||
by a colon and indicate `<external>:<internal>` respectively. For example, `-p 8080:80` would expose port `80` from
|
||||
inside the container to be accessible from the host's IP on port `8080` outside the container.
|
||||
|
||||
| Parameter | Function |
|
||||
| :----: | --- |
|
||||
| `-p 1970` | WebUI |
|
||||
| `-v /music` | Recommended directory to store your music collection. You can bind other folder if you wish. |
|
||||
| `-v /config` | Configuration files. |
|
||||
| Parameter | Function |
|
||||
|:------------:|----------------------------------------------------------------------------------------------|
|
||||
| `-p 1970` | WebUI |
|
||||
| `-v /music` | Recommended directory to store your music collection. You can bind other folder if you wish. |
|
||||
| `-v /config` | Configuration files. |
|
||||
|
||||
### Development
|
||||
|
||||
This project is broken down into 2. The client and the server. The client comprises of the user interface code. This part is written in Typescript, Vue 3 and SCSS. To setup the client, checkout the [swing client repo ](https://github.com/geoffrey45/swing-client) on GitHub.
|
||||
This project is broken down into 2. The client and the server. The client comprises of the user interface code. This
|
||||
part is written in Typescript, Vue 3 and SCSS. To setup the client, checkout
|
||||
the [swing client repo ](https://github.com/geoffrey45/swing-client) on GitHub.
|
||||
|
||||
The second part of this project is the server. This is the main part of the app that runs on your machine, interacts with audio files and send data to the client. It's written in Python 3.
|
||||
The second part of this project is the server. This is the main part of the app that runs on your machine, interacts
|
||||
with audio files and send data to the client. It's written in Python 3.
|
||||
|
||||
The following instructions will guide you on how to setup the **server**.
|
||||
|
||||
---
|
||||
|
||||
The project uses [Python poetry](https://python-poetry.org) as the virtual environment manager. Follow the instructions in [their docs](https://python-poetry.org/docs/) to install it in your machine.
|
||||
The project uses [Python poetry](https://python-poetry.org) as the virtual environment manager. Follow the instructions
|
||||
in [their docs](https://python-poetry.org/docs/) to install it in your machine.
|
||||
|
||||
> It is assumed that you have `Python 3.10` or newer installed in your machine. This project uses type hinting features so older version of Python will not work. If you don't have Python installed in your machine, get it from the [python website](https://www.python.org/downloads/).
|
||||
> It is assumed that you have `Python 3.10` or newer installed in your machine. This project uses type hinting features
|
||||
> so older version of Python will not work. If you don't have Python installed in your machine, get it from
|
||||
> the [python website](https://www.python.org/downloads/).
|
||||
|
||||
Clone this repo locally in your machine. Then install the project dependencies and start the app.
|
||||
|
||||
@ -130,33 +146,12 @@ poetry run python manage.py
|
||||
|
||||
### Contributing
|
||||
|
||||
If you want to contribute to this project, feel free to open an issue or a pull request on Github. Your contributions are highly valued and appreciated. Feature suggestions, bug reports and code contribution are welcome.
|
||||
If you want to contribute to this project, feel free to open an issue or a pull request on Github. Your contributions
|
||||
are highly valued and appreciated. Feature suggestions, bug reports and code contribution are welcome.
|
||||
|
||||
### License
|
||||
|
||||
This software is provided to you with terms stated in the MIT License. Read the full text in the `LICENSE` file located at the root of this repository.
|
||||
|
||||
---
|
||||
|
||||
### A brain dump ...
|
||||
|
||||
I started working on this project on dec 2021. Why? I like listening and exploring music and I like it more when I can enjoy it (like really really). I'd been searching for cute music players for linux that allow me to manage my ever growing music library. Some of the main features I was looking for were:
|
||||
|
||||
- A simple and beautiful user interface (main reason)
|
||||
- Creating automated daily mixes based on my listening activity.
|
||||
- Ability to move files around without breaking my playlists and mixes.
|
||||
- Something that can bring together all the audio files scattered all over my disks into a single place.
|
||||
- Browsing related artists and albums.
|
||||
- Reading albums & artists biographies and getting insights on song lyrics (kinda Genium.com-ish).
|
||||
- Web browser based user interface.
|
||||
- a lot more ... but I can't remember them at the moment
|
||||
|
||||
I've been working to make sure that most (if not all) of the features listed above are built. Some of them are done, but most are not even touched yet. A lot of work is needed and I know that it will take a lot of time to build and perfect them.
|
||||
|
||||
I've been keeping a small 🤥 list of a few cool features that I'd like to build in future. Some of the features listed there are outright stupid but some are cool. You can check it out in [this notion page](https://rhetorical-othnielia-565.notion.site/Cool-features-1a0cd5b797904da687bec441e7c7aa19). https://rhetorical-othnielia-565.notion.site/Cool-features-1a0cd5b797904da687bec441e7c7aa19
|
||||
|
||||
I have been working on this project solo, so it’s very hard to push things fast. If you have programming knowledge in Python or Vue, feel free to contribute to the project. Your contributions are highly appreciated.
|
||||
|
||||
---
|
||||
This software is provided to you with terms stated in the MIT License. Read the full text in the `LICENSE` file located
|
||||
at the root of this repository.
|
||||
|
||||
**[MIT License](https://opensource.org/licenses/MIT) | Copyright (c) 2023 Mungai Njoroge**
|
||||
|
@ -1,7 +1,6 @@
|
||||
"""
|
||||
Contains all the artist(s) routes.
|
||||
"""
|
||||
import random
|
||||
from collections import deque
|
||||
|
||||
from flask import Blueprint, request
|
||||
@ -9,7 +8,6 @@ from flask import Blueprint, request
|
||||
from app.db.sqlite.favorite import SQLiteFavoriteMethods as favdb
|
||||
from app.models import Album, FavType, Track
|
||||
from app.utils.remove_duplicates import remove_duplicates
|
||||
from app.requests.artists import fetch_similar_artists
|
||||
|
||||
from app.store.albums import AlbumStore
|
||||
from app.store.tracks import TrackStore
|
||||
|
@ -28,8 +28,14 @@ class HandleArgs:
|
||||
self.handle_host()
|
||||
self.handle_port()
|
||||
self.handle_config_path()
|
||||
|
||||
self.handle_no_feat()
|
||||
self.handle_remove_prod()
|
||||
self.handle_cleaning_albums()
|
||||
self.handle_cleaning_tracks()
|
||||
self.handle_periodic_scan()
|
||||
self.handle_periodic_scan_interval()
|
||||
|
||||
self.handle_help()
|
||||
self.handle_version()
|
||||
|
||||
@ -68,7 +74,7 @@ class HandleArgs:
|
||||
@staticmethod
|
||||
def handle_port():
|
||||
if ALLARGS.port in ARGS:
|
||||
index = ARGS.index(ALLARGS.port)
|
||||
index = ARGS.index(ALLARGS.port.value)
|
||||
try:
|
||||
port = ARGS[index + 1]
|
||||
except IndexError:
|
||||
@ -84,7 +90,7 @@ class HandleArgs:
|
||||
@staticmethod
|
||||
def handle_host():
|
||||
if ALLARGS.host in ARGS:
|
||||
index = ARGS.index(ALLARGS.host)
|
||||
index = ARGS.index(ALLARGS.host.value)
|
||||
|
||||
try:
|
||||
host = ARGS[index + 1]
|
||||
@ -92,7 +98,7 @@ class HandleArgs:
|
||||
print("ERROR: Host not specified")
|
||||
sys.exit(0)
|
||||
|
||||
settings.FLASKVARS.FLASK_HOST = host # type: ignore
|
||||
settings.FLASKVARS.set_flask_host(host) # type: ignore
|
||||
|
||||
@staticmethod
|
||||
def handle_config_path():
|
||||
@ -100,7 +106,7 @@ class HandleArgs:
|
||||
Modifies the config path.
|
||||
"""
|
||||
if ALLARGS.config in ARGS:
|
||||
index = ARGS.index(ALLARGS.config)
|
||||
index = ARGS.index(ALLARGS.config.value)
|
||||
|
||||
try:
|
||||
config_path = ARGS[index + 1]
|
||||
@ -119,22 +125,62 @@ class HandleArgs:
|
||||
@staticmethod
|
||||
def handle_no_feat():
|
||||
# if ArgsEnum.no_feat in ARGS:
|
||||
if any((a in ARGS for a in ALLARGS.show_feat)):
|
||||
if any((a in ARGS for a in ALLARGS.show_feat.value)):
|
||||
settings.FromFlags.EXTRACT_FEAT = False
|
||||
|
||||
@staticmethod
|
||||
def handle_remove_prod():
|
||||
if any((a in ARGS for a in ALLARGS.show_prod)):
|
||||
if any((a in ARGS for a in ALLARGS.show_prod.value)):
|
||||
settings.FromFlags.REMOVE_PROD = False
|
||||
|
||||
@staticmethod
|
||||
def handle_cleaning_albums():
|
||||
if any((a in ARGS for a in ALLARGS.dont_clean_albums.value)):
|
||||
settings.FromFlags.CLEAN_ALBUM_TITLE = False
|
||||
|
||||
@staticmethod
|
||||
def handle_cleaning_tracks():
|
||||
if any((a in ARGS for a in ALLARGS.dont_clean_tracks.value)):
|
||||
settings.FromFlags.REMOVE_REMASTER_FROM_TRACK = False
|
||||
|
||||
@staticmethod
|
||||
def handle_periodic_scan():
|
||||
if any((a in ARGS for a in ALLARGS.no_periodic_scan.value)):
|
||||
settings.FromFlags.DO_PERIODIC_SCANS = False
|
||||
|
||||
@staticmethod
|
||||
def handle_periodic_scan_interval():
|
||||
if any((a in ARGS for a in ALLARGS.periodic_scan_interval.value)):
|
||||
index = [ARGS.index(a) for a in ALLARGS.periodic_scan_interval.value if a in ARGS][0]
|
||||
|
||||
try:
|
||||
interval = ARGS[index + 1]
|
||||
except IndexError:
|
||||
print("ERROR: Interval not specified")
|
||||
sys.exit(0)
|
||||
|
||||
# psi = 0
|
||||
|
||||
try:
|
||||
psi = int(interval)
|
||||
except ValueError:
|
||||
print("ERROR: Interval should be a number")
|
||||
sys.exit(0)
|
||||
|
||||
if psi < 0:
|
||||
print("WADAFUCK ARE YOU TRYING?")
|
||||
sys.exit(0)
|
||||
|
||||
settings.FromFlags.PERIODIC_SCAN_INTERVAL = psi
|
||||
|
||||
@staticmethod
|
||||
def handle_help():
|
||||
if any((a in ARGS for a in ALLARGS.help)):
|
||||
if any((a in ARGS for a in ALLARGS.help.value)):
|
||||
print(HELP_MESSAGE)
|
||||
sys.exit(0)
|
||||
|
||||
@staticmethod
|
||||
def handle_version():
|
||||
if any((a in ARGS for a in ALLARGS.version)):
|
||||
if any((a in ARGS for a in ALLARGS.version.value)):
|
||||
print(settings.Release.APP_VERSION)
|
||||
sys.exit(0)
|
||||
|
@ -6,8 +6,6 @@ import sqlite3
|
||||
from pathlib import Path
|
||||
from sqlite3 import Connection as SqlConn
|
||||
|
||||
from app.settings import Db
|
||||
|
||||
|
||||
def create_connection(db_file: str) -> SqlConn:
|
||||
"""
|
||||
|
@ -64,7 +64,7 @@ def extract_thumb(filepath: str, webp_path: str) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def extract_date(date_str: str | None, filepath: str) -> int:
|
||||
def extract_date(date_str: str | None) -> int:
|
||||
try:
|
||||
return int(date_str.split("-")[0])
|
||||
except: # pylint: disable=bare-except
|
||||
|
@ -1,4 +1,3 @@
|
||||
import json
|
||||
import dataclasses
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
@ -1,10 +1,9 @@
|
||||
import dataclasses
|
||||
from dataclasses import dataclass
|
||||
|
||||
from app.settings import FromFlags, get_flag, ParserFlags
|
||||
from .artist import ArtistMinimal
|
||||
from app.settings import get_flag, ParserFlags
|
||||
from app.utils.hashing import create_hash
|
||||
from app.utils.parsers import split_artists, remove_prod, parse_feat_from_title, clean_title
|
||||
from .artist import ArtistMinimal
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
|
@ -6,14 +6,21 @@ HELP_MESSAGE = f"""
|
||||
Usage: swingmusic [options]
|
||||
|
||||
Options:
|
||||
{args.build}: Build the application (in development)
|
||||
{', '.join(args.help.value)}: Show this help message
|
||||
{', '.join(args.version.value)}: Show the app version
|
||||
|
||||
{args.host}: Set the host
|
||||
{args.port}: Set the port
|
||||
{args.config}: Set the config path
|
||||
|
||||
{', '.join(args.show_feat)}: Do not extract featured artists from the song title
|
||||
{', '.join(args.show_prod)}: Do not hide producers in the song title
|
||||
|
||||
{', '.join(args.help)}: Show this help message
|
||||
{', '.join(args.version)}: Show the app version
|
||||
{', '.join(args.show_feat.value)}: Do not extract featured artists from the song title
|
||||
{', '.join(args.show_prod.value)}: Do not hide producers in the song title
|
||||
{', '.join(args.dont_clean_albums.value)}: Don't clean album titles. Cleaning is done by removing information in
|
||||
parentheses and showing it separately
|
||||
{', '.join(args.dont_clean_tracks.value)}: Don't remove remaster information from track titles
|
||||
{', '.join(args.no_periodic_scan.value)}: Disable periodic scan
|
||||
{', '.join(args.periodic_scan_interval.value)}: Set the periodic scan interval in seconds. Default is 300 seconds (5
|
||||
minutes)
|
||||
|
||||
{args.build}: Build the application (in development)
|
||||
"""
|
||||
|
@ -106,8 +106,24 @@ class FLASKVARS:
|
||||
FLASK_PORT = 1970
|
||||
FLASK_HOST = "localhost"
|
||||
|
||||
@classmethod
|
||||
def get_flask_port(cls):
|
||||
return cls.FLASK_PORT
|
||||
|
||||
class ALLARGS:
|
||||
@classmethod
|
||||
def get_flask_host(cls):
|
||||
return cls.FLASK_HOST
|
||||
|
||||
@classmethod
|
||||
def set_flask_port(cls, port):
|
||||
cls.FLASK_PORT = port
|
||||
|
||||
@classmethod
|
||||
def set_flask_host(cls, host):
|
||||
cls.FLASK_HOST = host
|
||||
|
||||
|
||||
class ALLARGS(Enum):
|
||||
"""
|
||||
Enumerates the possible app arguments.
|
||||
"""
|
||||
@ -116,10 +132,16 @@ class ALLARGS:
|
||||
port = "--port"
|
||||
host = "--host"
|
||||
config = "--config"
|
||||
show_feat = ["--show-feat", "-sf"]
|
||||
show_prod = ["--show-prod", "-sp"]
|
||||
help = ["--help", "-h"]
|
||||
version = ["--version", "-v"]
|
||||
|
||||
show_feat = ("--show-feat", "-sf")
|
||||
show_prod = ("--show-prod", "-sp")
|
||||
dont_clean_albums = ("--no-clean-albums", "-nca")
|
||||
dont_clean_tracks = ("--no-clean-tracks", "-nct")
|
||||
no_periodic_scan = ("--no-periodic-scan", "-nps")
|
||||
periodic_scan_interval = ("--scan-interval", "-psi")
|
||||
|
||||
help = ("--help", "-h")
|
||||
version = ("--version", "-v")
|
||||
|
||||
|
||||
class FromFlags:
|
||||
@ -135,6 +157,7 @@ class FromFlags:
|
||||
|
||||
CLEAN_ALBUM_TITLE = False
|
||||
REMOVE_REMASTER_FROM_TRACK = False
|
||||
SHOW_ALBUM_VERSION = False
|
||||
|
||||
DO_PERIODIC_SCANS = True
|
||||
PERIODIC_SCAN_INTERVAL = 300 # seconds
|
||||
@ -146,6 +169,7 @@ class ParserFlags(Enum):
|
||||
EXTRACT_FEAT = 'EXTRACT_FEAT'
|
||||
REMOVE_PROD = 'REMOVE_PROD'
|
||||
CLEAN_ALBUM_TITLE = 'CLEAN_ALBUM_TITLE'
|
||||
SHOW_ALBUM_VERSION = 'SHOW_ALBUM_VERSION'
|
||||
REMOVE_REMASTER_FROM_TRACK = 'REMOVE_REMASTER_FROM_TRACK'
|
||||
DO_PERIODIC_SCANS = 'DO_PERIODIC_SCANS'
|
||||
PERIODIC_SCAN_INTERVAL = 'PERIODIC_SCAN_INTERVAL'
|
||||
|
@ -1,6 +1,6 @@
|
||||
import os
|
||||
|
||||
from app.settings import TCOLOR, Release, FLASKVARS, Paths, FromFlags, get_flag, ParserFlags
|
||||
from app.settings import TCOLOR, Release, FLASKVARS, Paths, get_flag, ParserFlags
|
||||
from app.utils.network import get_ip
|
||||
|
||||
|
||||
@ -12,16 +12,16 @@ def log_startup_info():
|
||||
print(lines)
|
||||
print(f"{TCOLOR.HEADER}SwingMusic {Release.APP_VERSION} {TCOLOR.ENDC}")
|
||||
|
||||
adresses = [FLASKVARS.FLASK_HOST]
|
||||
adresses = [FLASKVARS.get_flask_host()]
|
||||
|
||||
if FLASKVARS.FLASK_HOST == "0.0.0.0":
|
||||
if FLASKVARS.get_flask_host() == "0.0.0.0":
|
||||
adresses = ["localhost", get_ip()]
|
||||
|
||||
print("Started app on:")
|
||||
for address in adresses:
|
||||
# noinspection HttpUrlsUsage
|
||||
print(
|
||||
f"➤ {TCOLOR.OKGREEN}http://{address}:{FLASKVARS.FLASK_PORT}{TCOLOR.ENDC}"
|
||||
f"➤ {TCOLOR.OKGREEN}http://{address}:{FLASKVARS.get_flask_port()}{TCOLOR.ENDC}"
|
||||
)
|
||||
|
||||
print(lines)
|
||||
|
@ -98,7 +98,7 @@ class TrackStore:
|
||||
track.is_favorite = False
|
||||
|
||||
@classmethod
|
||||
def append_track_artists(cls, albumhash: str, artists: list[str], new_album_title:str):
|
||||
def append_track_artists(cls, albumhash: str, artists: list[str], new_album_title: str):
|
||||
tracks = cls.get_tracks_by_albumhash(albumhash)
|
||||
|
||||
for track in tracks:
|
||||
|
14
manage.py
14
manage.py
@ -53,12 +53,12 @@ if __name__ == "__main__":
|
||||
bg_run_setup()
|
||||
start_watchdog()
|
||||
|
||||
app.run(
|
||||
debug=False,
|
||||
threaded=True,
|
||||
host=FLASKVARS.FLASK_HOST,
|
||||
port=FLASKVARS.FLASK_PORT,
|
||||
use_reloader=False,
|
||||
)
|
||||
app.run(
|
||||
debug=False,
|
||||
threaded=True,
|
||||
host=FLASKVARS.get_flask_host(),
|
||||
port=FLASKVARS.get_flask_port(),
|
||||
use_reloader=False,
|
||||
)
|
||||
|
||||
# TODO: Organize code in this file: move args to new file, etc.
|
||||
|
Loading…
x
Reference in New Issue
Block a user