Spaces:
Runtime error
Runtime error
Commit
·
367be45
1
Parent(s):
74924ab
removing signature and supporting only post
Browse files- app.py +21 -67
- requirements.txt +0 -1
- routes/__pycache__/__init__.cpython-310.pyc +0 -0
- routes/__pycache__/__init__.cpython-311.pyc +0 -0
- routes/__pycache__/helpers.cpython-310.pyc +0 -0
- routes/config.json +0 -2
- routes/helpers.py +1 -105
- routes/osuApi/__pycache__/__init__.cpython-310.pyc +0 -0
- routes/osuApi/__pycache__/findSong.cpython-310.pyc +0 -0
- routes/osuApi/__pycache__/getBeatmap.cpython-310.pyc +0 -0
- routes/osuApi/__pycache__/getFull.cpython-310.pyc +0 -0
- routes/osuApi/__pycache__/getPreview.cpython-310.pyc +0 -0
- routes/osuApi/findSong.py +3 -13
- routes/osuApi/getFull.py +6 -25
- routes/osuApi/getPreview.py +7 -26
- routes/recognizeApi/__init__.py +0 -1
- routes/recognizeApi/__pycache__/__init__.cpython-310.pyc +0 -0
- routes/recognizeApi/__pycache__/recognizeVoice.cpython-310.pyc +0 -0
- routes/recognizeApi/recognizeVoice.py +0 -58
- routes/signatures.db +0 -0
- routes/siteRoutes/__init__.py +0 -1
- routes/siteRoutes/__pycache__/__init__.cpython-310.pyc +0 -0
- routes/siteRoutes/__pycache__/sigGen.cpython-310.pyc +0 -0
- routes/siteRoutes/__pycache__/systemInfo.cpython-310.pyc +0 -0
- routes/siteRoutes/sigGen.py +0 -29
- routes/ytApi/get.py +11 -26
- routes/ytApi/getFull.py +2 -2
- routes/ytApi/getPreview.py +7 -14
- routes/ytApi/search.py +10 -16
- static/api.yaml +3 -378
app.py
CHANGED
|
@@ -1,29 +1,16 @@
|
|
| 1 |
import os
|
| 2 |
from flask import *
|
| 3 |
-
from flask_limiter import Limiter
|
| 4 |
-
from flask_limiter.util import get_remote_address
|
| 5 |
|
| 6 |
-
from routes.helpers import
|
| 7 |
from routes import *
|
| 8 |
|
| 9 |
-
from
|
| 10 |
-
from transformers import AutoTokenizer, AutoModelForSequenceClassification, AutoModelForSeq2SeqLM
|
| 11 |
|
| 12 |
#initing
|
| 13 |
app = Flask(__name__)
|
| 14 |
-
VERSION = '1.0
|
| 15 |
app.config['JSON_AS_ASCII'] = False
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
#limiter
|
| 19 |
-
@limiter.request_filter
|
| 20 |
-
def ip_whitelist():
|
| 21 |
-
#try:
|
| 22 |
-
# if request.method == 'POST': signature = request.form['signature']
|
| 23 |
-
# else: signature = request.args['signature']
|
| 24 |
-
# return checkSignature(signature)
|
| 25 |
-
#except: return False
|
| 26 |
-
return bool(randint(0,1))
|
| 27 |
#error pages
|
| 28 |
@app.errorhandler(429)
|
| 29 |
def ratelimit_handler(e): return render_template('ratelimit.html')
|
|
@@ -37,68 +24,57 @@ def ratelimit_handler(e): return render_template('intervalservererror.html')
|
|
| 37 |
def ratelimit_handler(e): return render_template('badgateway.html')
|
| 38 |
|
| 39 |
#empty routes
|
| 40 |
-
@app.route('/yt/api/v1', methods=['
|
| 41 |
-
@app.route('/recognize/api/v1', methods=['
|
| 42 |
-
@app.route('/osu/api/v1', methods=['
|
| 43 |
def emptyPath(): return {}
|
| 44 |
|
| 45 |
-
@app.route('/yt/api/v1/<path:path>', methods=['
|
| 46 |
-
@app.route('/recognize/api/v1/<path:path>', methods=['
|
| 47 |
-
@app.route('/osu/api/v1/<path:path>', methods=['
|
| 48 |
def emptyApiWA(path): return {"status": "error", "error_code": 100, "error_details": "No method like that found"}
|
| 49 |
|
| 50 |
#icon
|
| 51 |
@app.route('/favicon.ico')
|
| 52 |
-
|
| 53 |
def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico', mimetype='image/vnd.microsoft.icon')
|
| 54 |
|
| 55 |
###############
|
| 56 |
#SITE ROUTES
|
| 57 |
@app.route('/')
|
| 58 |
-
@limiter.exempt
|
| 59 |
def index(): return render_template('index.html')
|
| 60 |
-
@app.route('/signatures/api/v1/get', methods=['
|
| 61 |
-
@limiter.exempt
|
| 62 |
-
def signatureGen(): return siteRoutes.signatureGen(request)
|
| 63 |
-
@app.route('/system-info/api/v1/get', methods=['GET', 'POST'])
|
| 64 |
-
@limiter.exempt
|
| 65 |
def systemInfo(): return siteRoutes.systemInfo()
|
| 66 |
-
|
| 67 |
-
###############
|
| 68 |
-
#RECOGNIZE API
|
| 69 |
-
@app.route('/recognize/api/v1/voice', methods=['GET', 'POST'])
|
| 70 |
-
def recognizeVoice(): return recognizeApi.recognizeVoice(request)
|
| 71 |
|
| 72 |
###############
|
| 73 |
#YT SOUND API
|
| 74 |
-
@app.route('/yt/api/v1/search', methods=['
|
| 75 |
def search(): return ytApi.search(request)
|
| 76 |
-
@app.route('/yt/api/v1/get-full', methods=['
|
| 77 |
def getFull(): return ytApi.getFull(request)
|
| 78 |
-
@app.route('/yt/api/v1/get-preview', methods=['
|
| 79 |
def getPreview(): return ytApi.getPreview(request)
|
| 80 |
|
| 81 |
###############
|
| 82 |
#OSU API
|
| 83 |
-
@app.route('/osu/api/v1/find-song', methods=['
|
| 84 |
def findSong(): return osuApi.findSong(request)
|
| 85 |
-
@app.route('/osu/api/v1/get-beatmap', methods=['
|
| 86 |
def getBeatmap(): return osuApi.getBeatmap(request)
|
| 87 |
-
@app.route('/osu/api/v1/get-preview', methods=['
|
| 88 |
def getBMPreview(): return osuApi.getPreview(request)
|
| 89 |
-
@app.route('/osu/api/v1/get-full', methods=['
|
| 90 |
def getBMFull(): return osuApi.getFull(request)
|
| 91 |
|
| 92 |
###############
|
| 93 |
# LOAD MODELS
|
| 94 |
sa_t, sa_m = AutoTokenizer.from_pretrained("cardiffnlp/twitter-xlm-roberta-base-sentiment"), AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-xlm-roberta-base-sentiment")
|
| 95 |
tc_t, tc_m = AutoTokenizer.from_pretrained("EIStakovskii/xlm_roberta_base_multilingual_toxicity_classifier_plus"), AutoModelForSequenceClassification.from_pretrained("EIStakovskii/xlm_roberta_base_multilingual_toxicity_classifier_plus")
|
| 96 |
-
chct_t, chct_m = AutoTokenizer.from_pretrained("cointegrated/rut5-small-chitchat"), AutoModelForSeq2SeqLM.from_pretrained("cointegrated/rut5-small-chitchat")
|
| 97 |
|
| 98 |
##############
|
| 99 |
# ANALYZE DATA API
|
| 100 |
# to understand which text is negative, positive or neutral
|
| 101 |
-
@app.route('/analyzeText/api/v1/sentiment', methods=['
|
| 102 |
def sentimentAnalys():
|
| 103 |
try:
|
| 104 |
text = request.form.get('text') or request.args.get('text') or request.values.get('text') or ""
|
|
@@ -110,7 +86,6 @@ def sentimentAnalys():
|
|
| 110 |
|
| 111 |
inputs = sa_t(text, return_tensors="pt")
|
| 112 |
|
| 113 |
-
# Предсказание тональности текста
|
| 114 |
outputs = sa_m(**inputs)
|
| 115 |
logits = outputs.logits
|
| 116 |
predicted_sentiment_index = logits.argmax(dim=1).item()
|
|
@@ -118,7 +93,7 @@ def sentimentAnalys():
|
|
| 118 |
|
| 119 |
return {"status": "pass", "predicted_sentiment": predicted_sentiment}
|
| 120 |
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": str(e).replace("\n", " | ") }}
|
| 121 |
-
@app.route('/analyzeText/api/v1/toxicity', methods=['
|
| 122 |
def toxicityAnalys():
|
| 123 |
try:
|
| 124 |
text = request.form.get('text') or request.args.get('text') or request.values.get('text') or ""
|
|
@@ -130,7 +105,6 @@ def toxicityAnalys():
|
|
| 130 |
|
| 131 |
inputs = tc_t(text, return_tensors="pt")
|
| 132 |
|
| 133 |
-
# Предсказание тональности текста
|
| 134 |
outputs = tc_m(**inputs)
|
| 135 |
logits = outputs.logits
|
| 136 |
predicted_class = logits.argmax(dim=1).item()
|
|
@@ -138,26 +112,6 @@ def toxicityAnalys():
|
|
| 138 |
|
| 139 |
return {"status": "pass", "toxicity": predicted_sentiment}
|
| 140 |
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": str(e).replace("\n", " | ") }} , 400
|
| 141 |
-
@app.route('/analyzeText/api/v1/chitchat', methods=['POST'])
|
| 142 |
-
def chitchatRu():
|
| 143 |
-
try:
|
| 144 |
-
text = request.form.get('text') or request.args.get('text') or request.values.get('text') or ""
|
| 145 |
-
if text == "":
|
| 146 |
-
try: text = request.json.get('text') or ""
|
| 147 |
-
except: pass
|
| 148 |
-
|
| 149 |
-
if text == "":
|
| 150 |
-
return {"status": "error", "details": {"error_code": 101, "error_details": "No text provided"}}, 400
|
| 151 |
-
|
| 152 |
-
inputs = chct_t.encode(text, padding=True, truncation=True, return_tensors="pt")
|
| 153 |
-
generated_ids = chct_m.generate(
|
| 154 |
-
input_ids=inputs,
|
| 155 |
-
use_cache=False
|
| 156 |
-
)
|
| 157 |
-
answer = chct_t.decode(generated_ids[0], skip_special_tokens=True)
|
| 158 |
-
return {"status": "pass", "answer": answer}, 200
|
| 159 |
-
except Exception as e:
|
| 160 |
-
return {"status": "error", "details": {"error_code": 123, "error_details": str(e).replace("\n", " | ")}}, 400
|
| 161 |
|
| 162 |
if __name__ == "__main__":
|
| 163 |
config = configFile()
|
|
|
|
| 1 |
import os
|
| 2 |
from flask import *
|
|
|
|
|
|
|
| 3 |
|
| 4 |
+
from routes.helpers import configFile
|
| 5 |
from routes import *
|
| 6 |
|
| 7 |
+
from transformers import AutoTokenizer, AutoModelForSequenceClassification
|
|
|
|
| 8 |
|
| 9 |
#initing
|
| 10 |
app = Flask(__name__)
|
| 11 |
+
VERSION = '1.0 build120'
|
| 12 |
app.config['JSON_AS_ASCII'] = False
|
| 13 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
#error pages
|
| 15 |
@app.errorhandler(429)
|
| 16 |
def ratelimit_handler(e): return render_template('ratelimit.html')
|
|
|
|
| 24 |
def ratelimit_handler(e): return render_template('badgateway.html')
|
| 25 |
|
| 26 |
#empty routes
|
| 27 |
+
@app.route('/yt/api/v1', methods=['POST'])
|
| 28 |
+
@app.route('/recognize/api/v1', methods=['POST'])
|
| 29 |
+
@app.route('/osu/api/v1', methods=['POST'])
|
| 30 |
def emptyPath(): return {}
|
| 31 |
|
| 32 |
+
@app.route('/yt/api/v1/<path:path>', methods=['POST'])
|
| 33 |
+
@app.route('/recognize/api/v1/<path:path>', methods=['POST'])
|
| 34 |
+
@app.route('/osu/api/v1/<path:path>', methods=['POST'])
|
| 35 |
def emptyApiWA(path): return {"status": "error", "error_code": 100, "error_details": "No method like that found"}
|
| 36 |
|
| 37 |
#icon
|
| 38 |
@app.route('/favicon.ico')
|
| 39 |
+
|
| 40 |
def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico', mimetype='image/vnd.microsoft.icon')
|
| 41 |
|
| 42 |
###############
|
| 43 |
#SITE ROUTES
|
| 44 |
@app.route('/')
|
|
|
|
| 45 |
def index(): return render_template('index.html')
|
| 46 |
+
@app.route('/signatures/api/v1/get', methods=['POST'])
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
def systemInfo(): return siteRoutes.systemInfo()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
###############
|
| 50 |
#YT SOUND API
|
| 51 |
+
@app.route('/yt/api/v1/search', methods=['POST'])
|
| 52 |
def search(): return ytApi.search(request)
|
| 53 |
+
@app.route('/yt/api/v1/get-full', methods=['POST'])
|
| 54 |
def getFull(): return ytApi.getFull(request)
|
| 55 |
+
@app.route('/yt/api/v1/get-preview', methods=['POST'])
|
| 56 |
def getPreview(): return ytApi.getPreview(request)
|
| 57 |
|
| 58 |
###############
|
| 59 |
#OSU API
|
| 60 |
+
@app.route('/osu/api/v1/find-song', methods=['POST'])
|
| 61 |
def findSong(): return osuApi.findSong(request)
|
| 62 |
+
@app.route('/osu/api/v1/get-beatmap', methods=['POST'])
|
| 63 |
def getBeatmap(): return osuApi.getBeatmap(request)
|
| 64 |
+
@app.route('/osu/api/v1/get-preview', methods=['POST'])
|
| 65 |
def getBMPreview(): return osuApi.getPreview(request)
|
| 66 |
+
@app.route('/osu/api/v1/get-full', methods=['POST'])
|
| 67 |
def getBMFull(): return osuApi.getFull(request)
|
| 68 |
|
| 69 |
###############
|
| 70 |
# LOAD MODELS
|
| 71 |
sa_t, sa_m = AutoTokenizer.from_pretrained("cardiffnlp/twitter-xlm-roberta-base-sentiment"), AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-xlm-roberta-base-sentiment")
|
| 72 |
tc_t, tc_m = AutoTokenizer.from_pretrained("EIStakovskii/xlm_roberta_base_multilingual_toxicity_classifier_plus"), AutoModelForSequenceClassification.from_pretrained("EIStakovskii/xlm_roberta_base_multilingual_toxicity_classifier_plus")
|
|
|
|
| 73 |
|
| 74 |
##############
|
| 75 |
# ANALYZE DATA API
|
| 76 |
# to understand which text is negative, positive or neutral
|
| 77 |
+
@app.route('/analyzeText/api/v1/sentiment', methods=['POST'])
|
| 78 |
def sentimentAnalys():
|
| 79 |
try:
|
| 80 |
text = request.form.get('text') or request.args.get('text') or request.values.get('text') or ""
|
|
|
|
| 86 |
|
| 87 |
inputs = sa_t(text, return_tensors="pt")
|
| 88 |
|
|
|
|
| 89 |
outputs = sa_m(**inputs)
|
| 90 |
logits = outputs.logits
|
| 91 |
predicted_sentiment_index = logits.argmax(dim=1).item()
|
|
|
|
| 93 |
|
| 94 |
return {"status": "pass", "predicted_sentiment": predicted_sentiment}
|
| 95 |
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": str(e).replace("\n", " | ") }}
|
| 96 |
+
@app.route('/analyzeText/api/v1/toxicity', methods=['POST'])
|
| 97 |
def toxicityAnalys():
|
| 98 |
try:
|
| 99 |
text = request.form.get('text') or request.args.get('text') or request.values.get('text') or ""
|
|
|
|
| 105 |
|
| 106 |
inputs = tc_t(text, return_tensors="pt")
|
| 107 |
|
|
|
|
| 108 |
outputs = tc_m(**inputs)
|
| 109 |
logits = outputs.logits
|
| 110 |
predicted_class = logits.argmax(dim=1).item()
|
|
|
|
| 112 |
|
| 113 |
return {"status": "pass", "toxicity": predicted_sentiment}
|
| 114 |
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": str(e).replace("\n", " | ") }} , 400
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
|
| 116 |
if __name__ == "__main__":
|
| 117 |
config = configFile()
|
requirements.txt
CHANGED
|
@@ -8,7 +8,6 @@ requests
|
|
| 8 |
py-cpuinfo
|
| 9 |
transformers
|
| 10 |
ffmpeg-python
|
| 11 |
-
flask_limiter
|
| 12 |
sentencepiece
|
| 13 |
tensorflow-cpu
|
| 14 |
SpeechRecognition
|
|
|
|
| 8 |
py-cpuinfo
|
| 9 |
transformers
|
| 10 |
ffmpeg-python
|
|
|
|
| 11 |
sentencepiece
|
| 12 |
tensorflow-cpu
|
| 13 |
SpeechRecognition
|
routes/__pycache__/__init__.cpython-310.pyc
DELETED
|
Binary file (250 Bytes)
|
|
|
routes/__pycache__/__init__.cpython-311.pyc
DELETED
|
Binary file (345 Bytes)
|
|
|
routes/__pycache__/helpers.cpython-310.pyc
DELETED
|
Binary file (4.62 kB)
|
|
|
routes/config.json
CHANGED
|
@@ -9,7 +9,5 @@
|
|
| 9 |
"config-path": "/app/routes/config.json",
|
| 10 |
"openapi-yaml-path": "/app/static/api.yaml",
|
| 11 |
|
| 12 |
-
"signatures-db": "/app/signatures.db",
|
| 13 |
-
|
| 14 |
"buildVersion": "1.0 build63"
|
| 15 |
}
|
|
|
|
| 9 |
"config-path": "/app/routes/config.json",
|
| 10 |
"openapi-yaml-path": "/app/static/api.yaml",
|
| 11 |
|
|
|
|
|
|
|
| 12 |
"buildVersion": "1.0 build63"
|
| 13 |
}
|
routes/helpers.py
CHANGED
|
@@ -1,33 +1,7 @@
|
|
| 1 |
import os
|
| 2 |
-
import time
|
| 3 |
import json
|
| 4 |
import random
|
| 5 |
import string
|
| 6 |
-
import sqlite3
|
| 7 |
-
import hashlib
|
| 8 |
-
import requests
|
| 9 |
-
|
| 10 |
-
# SQLite3 class
|
| 11 |
-
class EazySQLite3():
|
| 12 |
-
def __init__(self, db: str = "sqlite.db"):
|
| 13 |
-
self.connection = sqlite3.connect(db)
|
| 14 |
-
#self.cursor = sqlite_connection.cursor()
|
| 15 |
-
def query(self, query: str = ""):
|
| 16 |
-
cursor = self.connection.cursor()
|
| 17 |
-
try:
|
| 18 |
-
cursor.execute(query)
|
| 19 |
-
self.connection.commit()
|
| 20 |
-
try:
|
| 21 |
-
record = cursor.fetchall()
|
| 22 |
-
cursor.close()
|
| 23 |
-
return {"status": True, "details": record}
|
| 24 |
-
except:
|
| 25 |
-
try: cursor.close()
|
| 26 |
-
except: pass
|
| 27 |
-
finally: return {"status": True, "details": None}
|
| 28 |
-
except Exception as e: return {"status": False, "details": str(e)}
|
| 29 |
-
def close(self):
|
| 30 |
-
self.connection.close()
|
| 31 |
|
| 32 |
# Deleting audio
|
| 33 |
def deleteAudio(path: str, waitInSeconds: int = 0):
|
|
@@ -40,19 +14,6 @@ def configFile():
|
|
| 40 |
config = json.loads(file.read())
|
| 41 |
return config
|
| 42 |
|
| 43 |
-
# Signatures check!!! Wow!!!
|
| 44 |
-
def checkSignature(signature: str):
|
| 45 |
-
config = configFile()
|
| 46 |
-
db = EazySQLite3(config['signatures-db'])
|
| 47 |
-
query = db.query(f"SELECT * FROM `table` WHERE (`key` LIKE \"{signature}\" OR `key`=\"{signature}\") AND `endtime`>{time.time()}")
|
| 48 |
-
#if len(query['details']) == 0: return False
|
| 49 |
-
for row in query['details']:
|
| 50 |
-
if signature == row[0]:
|
| 51 |
-
newTTL = round(time.time())+86400
|
| 52 |
-
if newTTL > row[1]: db.query(f"UPDATE `table` SET `endtime`={newTTL} WHERE `key`=\"{signature}\"")
|
| 53 |
-
return True
|
| 54 |
-
return False
|
| 55 |
-
|
| 56 |
# Hook for yt-dlp
|
| 57 |
def thisIsHook(d):
|
| 58 |
try:
|
|
@@ -63,72 +24,7 @@ def thisIsHook(d):
|
|
| 63 |
|
| 64 |
# Get variable from request
|
| 65 |
def getFromRequest(request, thing: str):
|
| 66 |
-
|
| 67 |
-
if request.method == 'POST': reqthing = request.form[thing]
|
| 68 |
-
else: reqthing = request.args[thing]
|
| 69 |
-
return reqthing
|
| 70 |
-
except: return None
|
| 71 |
-
|
| 72 |
-
# Recognizing things
|
| 73 |
-
def req(access_token, meth, path, params, **kwargs):
|
| 74 |
-
full_url = "https://api.wit.ai" + path
|
| 75 |
-
headers = {
|
| 76 |
-
"authorization": "Bearer " + access_token,
|
| 77 |
-
"accept": "application/vnd.wit." + "20221114" + "+json",
|
| 78 |
-
}
|
| 79 |
-
headers.update(kwargs.pop("headers", {}))
|
| 80 |
-
rsp = requests.request(meth, full_url, headers=headers, params=params, **kwargs)
|
| 81 |
-
if rsp.status_code > 200:
|
| 82 |
-
raise Exception(
|
| 83 |
-
str(rsp.status_code)
|
| 84 |
-
+ " ("
|
| 85 |
-
+ rsp.reason
|
| 86 |
-
+ ")"
|
| 87 |
-
)
|
| 88 |
-
try: r = rsp.json()
|
| 89 |
-
except: r = rsp.text
|
| 90 |
-
if "error" in r:
|
| 91 |
-
raise Exception(json["error"])
|
| 92 |
|
| 93 |
-
return r
|
| 94 |
-
def dictation(access_token, audio_file, headers=None, verbose=None):
|
| 95 |
-
params = {}
|
| 96 |
-
headers = headers or {}
|
| 97 |
-
if verbose:
|
| 98 |
-
params["verbose"] = True
|
| 99 |
-
resp = req(
|
| 100 |
-
access_token,
|
| 101 |
-
"POST",
|
| 102 |
-
"/dictation",
|
| 103 |
-
params,
|
| 104 |
-
data=audio_file,
|
| 105 |
-
headers=headers,
|
| 106 |
-
)
|
| 107 |
-
return resp
|
| 108 |
-
def clean(text):
|
| 109 |
-
if text not in ['', None]:
|
| 110 |
-
return text.replace('?', '').replace('!', '').replace(';', '').replace('.', '').replace(',', '')
|
| 111 |
-
def delivering(text):
|
| 112 |
-
result = []
|
| 113 |
-
temp = None
|
| 114 |
-
toPush = None
|
| 115 |
-
tempLength = 0
|
| 116 |
-
for dirtLine in text.split('\n'):
|
| 117 |
-
if '"text"' in dirtLine:
|
| 118 |
-
line = dirtLine[11:-1]
|
| 119 |
-
if temp == None: temp = line
|
| 120 |
-
else:
|
| 121 |
-
if temp in line: toPush = line
|
| 122 |
-
else:
|
| 123 |
-
temp = line
|
| 124 |
-
result.append(toPush)
|
| 125 |
-
return ' '.join(result)
|
| 126 |
-
def devRaw(text):
|
| 127 |
-
result = []
|
| 128 |
-
for line in text.split('\n'): #line[11:-1]
|
| 129 |
-
if '"text"' in line:
|
| 130 |
-
result.append(line[11:-1])
|
| 131 |
-
return result
|
| 132 |
-
|
| 133 |
def randString(len: int = 16):
|
| 134 |
return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(len))
|
|
|
|
| 1 |
import os
|
|
|
|
| 2 |
import json
|
| 3 |
import random
|
| 4 |
import string
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
# Deleting audio
|
| 7 |
def deleteAudio(path: str, waitInSeconds: int = 0):
|
|
|
|
| 14 |
config = json.loads(file.read())
|
| 15 |
return config
|
| 16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
# Hook for yt-dlp
|
| 18 |
def thisIsHook(d):
|
| 19 |
try:
|
|
|
|
| 24 |
|
| 25 |
# Get variable from request
|
| 26 |
def getFromRequest(request, thing: str):
|
| 27 |
+
return request.json.get(thing) if request.is_json else request.form.get(thing)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
def randString(len: int = 16):
|
| 30 |
return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(len))
|
routes/osuApi/__pycache__/__init__.cpython-310.pyc
DELETED
|
Binary file (244 Bytes)
|
|
|
routes/osuApi/__pycache__/findSong.cpython-310.pyc
DELETED
|
Binary file (1.3 kB)
|
|
|
routes/osuApi/__pycache__/getBeatmap.cpython-310.pyc
DELETED
|
Binary file (380 Bytes)
|
|
|
routes/osuApi/__pycache__/getFull.cpython-310.pyc
DELETED
|
Binary file (2.13 kB)
|
|
|
routes/osuApi/__pycache__/getPreview.cpython-310.pyc
DELETED
|
Binary file (1.39 kB)
|
|
|
routes/osuApi/findSong.py
CHANGED
|
@@ -1,19 +1,9 @@
|
|
| 1 |
-
import json
|
| 2 |
from .. import helpers
|
| 3 |
from requests import get
|
| 4 |
from random import randint as rand
|
| 5 |
def findSong(request):
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
else: signature = request.args['signature']
|
| 9 |
-
except: return {"status": "error", "details": { "error_code": 103, "error_details": "No signature" }}
|
| 10 |
-
if not helpers.checkSignature(signature): return {"status": "error", "details": { "error_code": 105, "error_details": "Invalid signature" }}
|
| 11 |
-
|
| 12 |
-
try:
|
| 13 |
-
if request.method == 'POST': query = request.form['query']
|
| 14 |
-
else: query = request.args['query']
|
| 15 |
-
if query.strip() in ['', None]: raise Exception()
|
| 16 |
-
except: return {"status": "error", "details": { "error_code": 133, "error_details": "No query" }}
|
| 17 |
|
| 18 |
tryment = get("https://api.chimu.moe/v1/search", params={"query": query})
|
| 19 |
if int(tryment.status_code) not in [404, 403]:
|
|
@@ -32,4 +22,4 @@ def findSong(request):
|
|
| 32 |
if counter >= rand(3,7): break
|
| 33 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "result": res}}
|
| 34 |
else:
|
| 35 |
-
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}
|
|
|
|
|
|
|
| 1 |
from .. import helpers
|
| 2 |
from requests import get
|
| 3 |
from random import randint as rand
|
| 4 |
def findSong(request):
|
| 5 |
+
query = helpers.getFromRequest(request, "query")
|
| 6 |
+
if not query: return {"status": "error", "details": { "error_code": 133, "error_details": "No query" }}, 400
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
tryment = get("https://api.chimu.moe/v1/search", params={"query": query})
|
| 9 |
if int(tryment.status_code) not in [404, 403]:
|
|
|
|
| 22 |
if counter >= rand(3,7): break
|
| 23 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "result": res}}
|
| 24 |
else:
|
| 25 |
+
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}, 400
|
routes/osuApi/getFull.py
CHANGED
|
@@ -5,27 +5,8 @@ from .findSong import *
|
|
| 5 |
from requests import get
|
| 6 |
from random import randint as rand
|
| 7 |
def getFull(request):
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
else: signature = request.args['signature']
|
| 11 |
-
except: return {"status": "error", "details": { "error_code": 103, "error_details": "No signature" }}
|
| 12 |
-
if not helpers.checkSignature(signature): return {"status": "error", "details": { "error_code": 105, "error_details": "Invalid signature" }}
|
| 13 |
-
|
| 14 |
-
try:
|
| 15 |
-
if request.method == 'POST': beatmapId = request.form['beatmapId']
|
| 16 |
-
else: beatmapId = request.args['beatmapId']
|
| 17 |
-
if beatmapId.strip() in ['', None]:
|
| 18 |
-
raise Exception()
|
| 19 |
-
except: beatmapId = None
|
| 20 |
-
|
| 21 |
-
try:
|
| 22 |
-
if request.method == 'POST': query = request.form['query']
|
| 23 |
-
else: query = request.args['query']
|
| 24 |
-
if query.strip() in ['', None]:
|
| 25 |
-
raise Exception()
|
| 26 |
-
except:
|
| 27 |
-
if beatmapId == None: return {"status": "error", "details": { "error_code": 133, "error_details": "No details for finding preview" }}
|
| 28 |
-
else: query = None
|
| 29 |
|
| 30 |
config = helpers.configFile()
|
| 31 |
if beatmapId != None:
|
|
@@ -40,8 +21,8 @@ def getFull(request):
|
|
| 40 |
helpers.deleteAudio(f"temp/{beatmapId}.ogg")
|
| 41 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "result": f"{config['url']}/static/full/{beatmapId}.ogg"}}
|
| 42 |
else:
|
| 43 |
-
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}
|
| 44 |
-
|
| 45 |
fffff = findSong(request)
|
| 46 |
if fffff['status'] == "error": return fffff
|
| 47 |
beatmapId = fffff['details']['result'][rand(0,len(fffff['details']['result'])-1)]['beatmapId']
|
|
@@ -56,5 +37,5 @@ def getFull(request):
|
|
| 56 |
helpers.deleteAudio(f"temp/{beatmapId}.ogg")
|
| 57 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "name": f"{beatmapId}.ogg", "result": f"{config['url']}/static/full/{beatmapId}.ogg"}}
|
| 58 |
else:
|
| 59 |
-
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}
|
| 60 |
-
return {}
|
|
|
|
| 5 |
from requests import get
|
| 6 |
from random import randint as rand
|
| 7 |
def getFull(request):
|
| 8 |
+
beatmapId = helpers.getFromRequest(request, "beatmapId")
|
| 9 |
+
query = helpers.getFromRequest(request, "query")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
|
| 11 |
config = helpers.configFile()
|
| 12 |
if beatmapId != None:
|
|
|
|
| 21 |
helpers.deleteAudio(f"temp/{beatmapId}.ogg")
|
| 22 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "result": f"{config['url']}/static/full/{beatmapId}.ogg"}}
|
| 23 |
else:
|
| 24 |
+
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}, 400
|
| 25 |
+
elif query != None:
|
| 26 |
fffff = findSong(request)
|
| 27 |
if fffff['status'] == "error": return fffff
|
| 28 |
beatmapId = fffff['details']['result'][rand(0,len(fffff['details']['result'])-1)]['beatmapId']
|
|
|
|
| 37 |
helpers.deleteAudio(f"temp/{beatmapId}.ogg")
|
| 38 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "name": f"{beatmapId}.ogg", "result": f"{config['url']}/static/full/{beatmapId}.ogg"}}
|
| 39 |
else:
|
| 40 |
+
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}, 400
|
| 41 |
+
return {"status": "error", "details": { "error_code": 133, "error_details": "No details for finding preview" }}, 400
|
routes/osuApi/getPreview.py
CHANGED
|
@@ -3,37 +3,18 @@ from .findSong import *
|
|
| 3 |
from requests import get
|
| 4 |
from random import randint as rand
|
| 5 |
def getPreview(request):
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
except: return {"status": "error", "details": { "error_code": 103, "error_details": "No signature" }}
|
| 10 |
-
if not helpers.checkSignature(signature): return {"status": "error", "details": { "error_code": 105, "error_details": "Invalid signature" }}
|
| 11 |
-
|
| 12 |
-
try:
|
| 13 |
-
if request.method == 'POST': beatmapId = request.form['beatmapId']
|
| 14 |
-
else: beatmapId = request.args['beatmapId']
|
| 15 |
-
if beatmapId.strip() in ['', None]:
|
| 16 |
-
raise Exception()
|
| 17 |
-
except: beatmapId = None
|
| 18 |
-
|
| 19 |
-
try:
|
| 20 |
-
if request.method == 'POST': query = request.form['query']
|
| 21 |
-
else: query = request.args['query']
|
| 22 |
-
if query.strip() in ['', None]:
|
| 23 |
-
raise Exception()
|
| 24 |
-
except:
|
| 25 |
-
if beatmapId == None: return {"status": "error", "details": { "error_code": 133, "error_details": "No details for finding preview" }}
|
| 26 |
-
else: query = None
|
| 27 |
-
|
| 28 |
if beatmapId != None:
|
| 29 |
tryment = get(f"https://b.ppy.sh/preview/{beatmapId}.mp3")
|
| 30 |
if int(tryment.status_code) not in [404, 403]:
|
| 31 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "result": f"https://b.ppy.sh/preview/{beatmapId}.mp3"}}
|
| 32 |
else:
|
| 33 |
-
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}
|
| 34 |
-
|
| 35 |
fffff = findSong(request)
|
| 36 |
-
if fffff['status'] == "error": return fffff
|
| 37 |
rBId = fffff['details']['result'][rand(0,len(fffff['details']['result'])-1)]['beatmapId']
|
| 38 |
return {"status": "pass", "details": {"code": fffff['details']['code'], "name": "{rBId}.mp3", "result": f"https://b.ppy.sh/preview/{rBId}.mp3"}}
|
| 39 |
-
return {}
|
|
|
|
| 3 |
from requests import get
|
| 4 |
from random import randint as rand
|
| 5 |
def getPreview(request):
|
| 6 |
+
beatmapId = helpers.getFromRequest(request, "beatmapId")
|
| 7 |
+
query = helpers.getFromRequest(request, "query")
|
| 8 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
if beatmapId != None:
|
| 10 |
tryment = get(f"https://b.ppy.sh/preview/{beatmapId}.mp3")
|
| 11 |
if int(tryment.status_code) not in [404, 403]:
|
| 12 |
return {"status": "pass", "details": {"code": int(tryment.status_code), "result": f"https://b.ppy.sh/preview/{beatmapId}.mp3"}}
|
| 13 |
else:
|
| 14 |
+
return {"status": "error", "details": {"code": int(tryment.status_code), "answer": tryment.text}}, 400
|
| 15 |
+
elif query != None:
|
| 16 |
fffff = findSong(request)
|
| 17 |
+
if fffff['status'] == "error": return fffff, 400
|
| 18 |
rBId = fffff['details']['result'][rand(0,len(fffff['details']['result'])-1)]['beatmapId']
|
| 19 |
return {"status": "pass", "details": {"code": fffff['details']['code'], "name": "{rBId}.mp3", "result": f"https://b.ppy.sh/preview/{rBId}.mp3"}}
|
| 20 |
+
return {"status": "error", "details": { "error_code": 133, "error_details": "No details for finding preview" }}, 400
|
routes/recognizeApi/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
from .recognizeVoice import *
|
|
|
|
|
|
routes/recognizeApi/__pycache__/__init__.cpython-310.pyc
DELETED
|
Binary file (189 Bytes)
|
|
|
routes/recognizeApi/__pycache__/recognizeVoice.cpython-310.pyc
DELETED
|
Binary file (1.98 kB)
|
|
|
routes/recognizeApi/recognizeVoice.py
DELETED
|
@@ -1,58 +0,0 @@
|
|
| 1 |
-
import wget
|
| 2 |
-
import random
|
| 3 |
-
import string
|
| 4 |
-
import ffmpeg
|
| 5 |
-
from .. import helpers
|
| 6 |
-
import speech_recognition as sr
|
| 7 |
-
|
| 8 |
-
def recognizeVoice(request):
|
| 9 |
-
try:
|
| 10 |
-
if request.method == 'POST': url = request.form['url']
|
| 11 |
-
else: url = request.args['url']
|
| 12 |
-
if url.strip() in ['', None]: raise Exception()
|
| 13 |
-
except: return {"status": "error", "details": { "error_code": 101, "error_details": "No link provided" }}
|
| 14 |
-
try:
|
| 15 |
-
if request.method == 'POST': signature = request.form['signature']
|
| 16 |
-
else: signature = request.args['signature']
|
| 17 |
-
except: return {"status": "error", "details": { "error_code": 103, "error_details": "No signature" }}
|
| 18 |
-
if not helpers.checkSignature(signature): return {"status": "error", "details": { "error_code": 105, "error_details": "Invalid signature" }}
|
| 19 |
-
try:
|
| 20 |
-
if request.method == 'POST': lang = request.form['lang']
|
| 21 |
-
else: lang = request.args['lang']
|
| 22 |
-
if lang.lower() in ['en','en-us']: lang = 'en-US'
|
| 23 |
-
elif lang.lower() in ['ru','ru-ru']: lang = 'ru-RU'
|
| 24 |
-
except: lang = "en-US"
|
| 25 |
-
|
| 26 |
-
fileId = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(16))
|
| 27 |
-
fileExt = url[url.rfind('.'):url.rfind('.')+4]
|
| 28 |
-
if fileExt in [".wav",".mp3",".ogg",'.aac']: pass
|
| 29 |
-
else: return {"status": "error", "details": { "error_code": 111, "error_details": "Wrong file format (only ogg, wav, mp3)" }}
|
| 30 |
-
|
| 31 |
-
r = sr.Recognizer()
|
| 32 |
-
|
| 33 |
-
config = helpers.configFile()
|
| 34 |
-
|
| 35 |
-
wget.download(url, f"{config['temp-path']}/{fileId}{fileExt}")
|
| 36 |
-
if fileExt != ".wav":
|
| 37 |
-
audio_input = ffmpeg.input(f"{config['temp-path']}/{fileId}{fileExt}")
|
| 38 |
-
oldFE = fileExt
|
| 39 |
-
fileExt = ".wav"
|
| 40 |
-
audio_output = ffmpeg.output(audio_input.audio, f"{config['temp-path']}/{fileId}{fileExt}")
|
| 41 |
-
ffmpeg.run(audio_output)
|
| 42 |
-
helpers.deleteAudio(f"temp/{fileId}.{oldFE}")
|
| 43 |
-
|
| 44 |
-
rawSource = sr.AudioFile(f"{config['temp-path']}/{fileId}{fileExt}")
|
| 45 |
-
with rawSource as source:
|
| 46 |
-
r.adjust_for_ambient_noise(source)
|
| 47 |
-
audio = r.record(source)
|
| 48 |
-
|
| 49 |
-
try: googleText = r.recognize_google(audio, language=lang)
|
| 50 |
-
except: googleText = ""
|
| 51 |
-
|
| 52 |
-
# at now here's no keys :(
|
| 53 |
-
#try: houndifyText = r.recognize_houndify(audio)
|
| 54 |
-
#except: houndifyText = ""
|
| 55 |
-
|
| 56 |
-
helpers.deleteAudio(f"temp/{fileId}{fileExt}")
|
| 57 |
-
|
| 58 |
-
return {"status": "pass", "result": {"google": googleText, "houndify": "NOT-WORKING"}}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
routes/signatures.db
DELETED
|
Binary file (16.4 kB)
|
|
|
routes/siteRoutes/__init__.py
CHANGED
|
@@ -1,2 +1 @@
|
|
| 1 |
-
from .sigGen import *
|
| 2 |
from .systemInfo import *
|
|
|
|
|
|
|
| 1 |
from .systemInfo import *
|
routes/siteRoutes/__pycache__/__init__.cpython-310.pyc
DELETED
|
Binary file (205 Bytes)
|
|
|
routes/siteRoutes/__pycache__/sigGen.cpython-310.pyc
DELETED
|
Binary file (1.23 kB)
|
|
|
routes/siteRoutes/__pycache__/systemInfo.cpython-310.pyc
DELETED
|
Binary file (1.09 kB)
|
|
|
routes/siteRoutes/sigGen.py
DELETED
|
@@ -1,29 +0,0 @@
|
|
| 1 |
-
import time
|
| 2 |
-
import random
|
| 3 |
-
import hashlib
|
| 4 |
-
from .. import helpers
|
| 5 |
-
|
| 6 |
-
def signatureGen(request):
|
| 7 |
-
endtime = round(time.time())+3600
|
| 8 |
-
|
| 9 |
-
uK = helpers.getFromRequest(request, "key")
|
| 10 |
-
if uK == None: return {"status": "error", "details": {"error_code": -1, "error_details": "No key to generate signature"}}
|
| 11 |
-
|
| 12 |
-
userKey = hashlib.md5(uK.encode()).hexdigest()
|
| 13 |
-
text = f"--START SIGNATURE-- {userKey}{endtime} --END SIGNATURE--"
|
| 14 |
-
salt = hashlib.md5("funapi-salt".encode()).hexdigest()[0:16]
|
| 15 |
-
|
| 16 |
-
creatorKey = hashlib.md5(f"HOST-IP:{request.remote_addr};USERKEY={userKey};DATE={time.strftime('%Y-%m-%d')};".encode()).hexdigest()
|
| 17 |
-
|
| 18 |
-
key = hashlib.blake2b(text.encode(), key=userKey.encode(), salt=salt.encode()).hexdigest().upper()
|
| 19 |
-
|
| 20 |
-
config = helpers.configFile()
|
| 21 |
-
db = helpers.EazySQLite3(config['signatures-db'])
|
| 22 |
-
|
| 23 |
-
query = db.query(f"INSERT INTO `table` (`key`, `endtime`, `creatorKey`) VALUES (\"{key}\", \"{endtime}\", \"{creatorKey}\")")
|
| 24 |
-
|
| 25 |
-
if query['status']:
|
| 26 |
-
return {"status": "pass", "result": key, "endtime": endtime}
|
| 27 |
-
else:
|
| 28 |
-
return {"status": "error", "details": {"error_code": -1, "error_details": "This key already got signature"}}
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
routes/ytApi/get.py
CHANGED
|
@@ -3,33 +3,18 @@ import yt_dlp
|
|
| 3 |
from .. import helpers
|
| 4 |
|
| 5 |
def get(request, check = "huh"):
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
else: signature = request.args['signature']
|
| 9 |
-
except: return {"status": "error", "details": { "error_code": 103, "error_details": "No signature" }}
|
| 10 |
-
if not helpers.checkSignature(signature): return {"status": "error", "details": { "error_code": 105, "error_details": "Invalid signature" }}
|
| 11 |
-
|
| 12 |
-
try:
|
| 13 |
-
if request.method == 'POST': url = request.form['url']
|
| 14 |
-
else: url = request.args['url']
|
| 15 |
-
if url.strip() in ['', None]:
|
| 16 |
-
raise Exception()
|
| 17 |
-
except: return {"status": "error", "details": { "error_code": 101, "error_details": "No link provided" }}
|
| 18 |
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
else: quality = request.args['quality']
|
| 26 |
-
if quality.lower() not in ['best', 'worst']: raise Exception()
|
| 27 |
-
except: quality = 'worst'
|
| 28 |
|
| 29 |
-
urlcode =
|
| 30 |
-
|
| 31 |
-
except: urlcode = helpers.randString()
|
| 32 |
-
if urlcode in ['', None]: urlcode = helpers.randString()
|
| 33 |
|
| 34 |
config = helpers.configFile()
|
| 35 |
|
|
@@ -48,5 +33,5 @@ def get(request, check = "huh"):
|
|
| 48 |
try:
|
| 49 |
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
| 50 |
error_code = ydl.download(url)
|
| 51 |
-
except Exception as e: return {"status": "error", "details": {"error_code": 102, "error_details": str(e)}}
|
| 52 |
return {"status": "pass", 'done-or-not': False, 'ytdlp-code': error_code, 'urlcode': urlcode, "path": f"{config['temp-path']}/{urlcode}.ogg", "quality": quality, "bitrate": bitrate}
|
|
|
|
| 3 |
from .. import helpers
|
| 4 |
|
| 5 |
def get(request, check = "huh"):
|
| 6 |
+
url = helpers.getFromRequest(request, "url")
|
| 7 |
+
if not url: return {"status": "error", "details": { "error_code": 101, "error_details": "No link provided" }}, 400
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
+
bitrate = helpers.getFromRequest(request, "bitrate")
|
| 10 |
+
if not bitrate: bitrate = "64k"
|
| 11 |
+
|
| 12 |
+
quality = helpers.getFromRequest(request, "quality").lower()
|
| 13 |
+
if quality.lower() not in ['best', 'worst']: quality = 'worst'
|
| 14 |
+
else: bitrate = str(bitrate)
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
+
urlcode = url.partition('?v=')[2]
|
| 17 |
+
if not urlcode: urlcode = "NPRNRQh2fAo"
|
|
|
|
|
|
|
| 18 |
|
| 19 |
config = helpers.configFile()
|
| 20 |
|
|
|
|
| 33 |
try:
|
| 34 |
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
| 35 |
error_code = ydl.download(url)
|
| 36 |
+
except Exception as e: return {"status": "error", "details": {"error_code": 102, "error_details": str(e)}}, 400
|
| 37 |
return {"status": "pass", 'done-or-not': False, 'ytdlp-code': error_code, 'urlcode': urlcode, "path": f"{config['temp-path']}/{urlcode}.ogg", "quality": quality, "bitrate": bitrate}
|
routes/ytApi/getFull.py
CHANGED
|
@@ -8,7 +8,7 @@ def getFull(request):
|
|
| 8 |
if answer['status'] == "error": return answer
|
| 9 |
if answer['error']: return answer
|
| 10 |
except KeyError: pass
|
| 11 |
-
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": e }}
|
| 12 |
urlcode = answer['urlcode']
|
| 13 |
bitrate = answer['bitrate']
|
| 14 |
quality = answer['quality']
|
|
@@ -23,6 +23,6 @@ def getFull(request):
|
|
| 23 |
audio_output = ffmpeg.output(audio_input.audio, f"{config['full-path']}/{urlcode}.ogg", audio_bitrate=bitrate)
|
| 24 |
ffmpeg.run(audio_output)
|
| 25 |
helpers.deleteAudio(f"temp/{urlcode}.ogg")
|
| 26 |
-
except Exception as e: return {"status": "error", "details": {"error_code": 102, "error_details": str(e), "result": f"{config['url']}/static/temp/{urlcode}.ogg"}}
|
| 27 |
return {"status": "pass", "details": {"code": error_code, "name":"{}.ogg".format(urlcode), "result": f"{config['url']}/static/full/{urlcode}.ogg"}}
|
| 28 |
|
|
|
|
| 8 |
if answer['status'] == "error": return answer
|
| 9 |
if answer['error']: return answer
|
| 10 |
except KeyError: pass
|
| 11 |
+
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": e }}, 400
|
| 12 |
urlcode = answer['urlcode']
|
| 13 |
bitrate = answer['bitrate']
|
| 14 |
quality = answer['quality']
|
|
|
|
| 23 |
audio_output = ffmpeg.output(audio_input.audio, f"{config['full-path']}/{urlcode}.ogg", audio_bitrate=bitrate)
|
| 24 |
ffmpeg.run(audio_output)
|
| 25 |
helpers.deleteAudio(f"temp/{urlcode}.ogg")
|
| 26 |
+
except Exception as e: return {"status": "error", "details": {"error_code": 102, "error_details": str(e), "result": f"{config['url']}/static/temp/{urlcode}.ogg"}}, 400
|
| 27 |
return {"status": "pass", "details": {"code": error_code, "name":"{}.ogg".format(urlcode), "result": f"{config['url']}/static/full/{urlcode}.ogg"}}
|
| 28 |
|
routes/ytApi/getPreview.py
CHANGED
|
@@ -9,24 +9,17 @@ def getPreview(request):
|
|
| 9 |
if answer['status'] == "error": return answer
|
| 10 |
if answer['error']: return answer
|
| 11 |
except KeyError: pass
|
| 12 |
-
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": e }}
|
| 13 |
urlcode = answer['urlcode']
|
| 14 |
bitrate = answer['bitrate']
|
| 15 |
-
quality = answer['quality']
|
| 16 |
error_code = answer['ytdlp-code']
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
if duration >= 60: duration = 60
|
| 22 |
-
except Exception as e:
|
| 23 |
-
print(e)
|
| 24 |
-
duration = 30
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
else: extension = request.args['extension']
|
| 29 |
-
except: extension = "ogg"
|
| 30 |
|
| 31 |
config = helpers.configFile()
|
| 32 |
if answer['done-or-not']:
|
|
@@ -41,6 +34,6 @@ def getPreview(request):
|
|
| 41 |
audio_output = ffmpeg.output(audio_cut, f"{config['previews-path']}/{urlcode}.{extension}", audio_bitrate=bitrate)
|
| 42 |
ffmpeg.run(audio_output)
|
| 43 |
helpers.deleteAudio(f"temp/{urlcode}.{extension}")
|
| 44 |
-
except Exception as e: return {"status": "error", "details": {"error_code": 102, "error_details": str(e), "result": f"{config['url']}/static/temp/{urlcode}.{extension}"}}
|
| 45 |
return {"status": "pass", "details": {"code": error_code, "name":f"{urlcode}.{extension}", "result": f"{config['url']}/static/previews/{urlcode}.{extension}"}}
|
| 46 |
|
|
|
|
| 9 |
if answer['status'] == "error": return answer
|
| 10 |
if answer['error']: return answer
|
| 11 |
except KeyError: pass
|
| 12 |
+
except Exception as e: return {"status": "error", "details": { "error_code": 123, "error_details": e }}, 400
|
| 13 |
urlcode = answer['urlcode']
|
| 14 |
bitrate = answer['bitrate']
|
|
|
|
| 15 |
error_code = answer['ytdlp-code']
|
| 16 |
|
| 17 |
+
duration = helpers.getFromRequest(request, "duration")
|
| 18 |
+
try: duration = int(duration) if duration.isnumeric() and int(duration) <= 90 else 45
|
| 19 |
+
except: duration = 45
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
+
extension = helpers.getFromRequest(request, "extension")
|
| 22 |
+
if not extension: extension = "ogg"
|
|
|
|
|
|
|
| 23 |
|
| 24 |
config = helpers.configFile()
|
| 25 |
if answer['done-or-not']:
|
|
|
|
| 34 |
audio_output = ffmpeg.output(audio_cut, f"{config['previews-path']}/{urlcode}.{extension}", audio_bitrate=bitrate)
|
| 35 |
ffmpeg.run(audio_output)
|
| 36 |
helpers.deleteAudio(f"temp/{urlcode}.{extension}")
|
| 37 |
+
except Exception as e: return {"status": "error", "details": {"error_code": 102, "error_details": str(e), "result": f"{config['url']}/static/temp/{urlcode}.{extension}"}}, 400
|
| 38 |
return {"status": "pass", "details": {"code": error_code, "name":f"{urlcode}.{extension}", "result": f"{config['url']}/static/previews/{urlcode}.{extension}"}}
|
| 39 |
|
routes/ytApi/search.py
CHANGED
|
@@ -3,20 +3,14 @@ import re
|
|
| 3 |
from .. import helpers
|
| 4 |
|
| 5 |
def search(request):
|
|
|
|
|
|
|
| 6 |
try:
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
except: return {"status": "error", "details": { "error_code": 103, "error_details": "No signature" }}
|
| 16 |
-
if not helpers.checkSignature(signature): return {"status": "error", "details": { "error_code": 105, "error_details": "Invalid signature" }}
|
| 17 |
-
html = urllib.request.urlopen("https://www.youtube.com/results?search_query={}".format(urllib.parse.quote_plus(searchQuery)))
|
| 18 |
-
videoList = re.findall(r"watch\?v=(\S{11})", html.read().decode())
|
| 19 |
-
videoIds = dict()
|
| 20 |
-
for i in range(len(videoList)):
|
| 21 |
-
videoIds.update({i: videoList[i]})
|
| 22 |
-
return {"status": "pass", "query": searchQuery, "videoIds": videoIds}
|
|
|
|
| 3 |
from .. import helpers
|
| 4 |
|
| 5 |
def search(request):
|
| 6 |
+
searchQuery = helpers.getFromRequest(request, "query")
|
| 7 |
+
if not searchQuery: searchQuery = "rickroll"
|
| 8 |
try:
|
| 9 |
+
html = urllib.request.urlopen("https://www.youtube.com/results?search_query={}".format(urllib.parse.quote_plus(searchQuery)))
|
| 10 |
+
videoList = re.findall(r"watch\?v=(\S{11})", html.read().decode())
|
| 11 |
+
videoIds = dict()
|
| 12 |
+
for i in range(len(videoList)): videoIds.update({i: videoList[i]})
|
| 13 |
+
return {"status": "pass", "query": searchQuery, "videoIds": videoIds}
|
| 14 |
+
except Exception as e:
|
| 15 |
+
print(e)
|
| 16 |
+
return {"status": "error", "details": { "error_code": 666, "error_details": "Something went wrong..." }}, 500
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static/api.yaml
CHANGED
|
@@ -5,33 +5,9 @@ info:
|
|
| 5 |
version: $VERSION_VARIABLE$
|
| 6 |
servers:
|
| 7 |
- url: 'https://imperialwool-funapi.hf.space/'
|
| 8 |
-
description: 'You are here!
|
| 9 |
paths:
|
| 10 |
/signatures/api/v1/get:
|
| 11 |
-
get:
|
| 12 |
-
tags:
|
| 13 |
-
- "Authentication"
|
| 14 |
-
parameters:
|
| 15 |
-
- name: 'key'
|
| 16 |
-
description: Key to generate signature.
|
| 17 |
-
in: 'query'
|
| 18 |
-
schema:
|
| 19 |
-
type: 'string'
|
| 20 |
-
example: rickroll
|
| 21 |
-
summary: "Generating auth key with small TTL."
|
| 22 |
-
responses:
|
| 23 |
-
200:
|
| 24 |
-
description: OK
|
| 25 |
-
content:
|
| 26 |
-
application/json:
|
| 27 |
-
schema:
|
| 28 |
-
$ref: "#/components/schemas/AuthSuccessObject"
|
| 29 |
-
400:
|
| 30 |
-
description: Bad Request
|
| 31 |
-
content:
|
| 32 |
-
application/json:
|
| 33 |
-
schema:
|
| 34 |
-
$ref: "#/components/schemas/AuthErrorObject"
|
| 35 |
post:
|
| 36 |
tags:
|
| 37 |
- "Authentication"
|
|
@@ -57,36 +33,6 @@ paths:
|
|
| 57 |
schema:
|
| 58 |
$ref: "#/components/schemas/AuthErrorObject"
|
| 59 |
/osu/api/v1/find-song:
|
| 60 |
-
get:
|
| 61 |
-
tags:
|
| 62 |
-
- "osu! API"
|
| 63 |
-
parameters:
|
| 64 |
-
- name: 'query'
|
| 65 |
-
description: Query to find beatmap.
|
| 66 |
-
in: 'query'
|
| 67 |
-
schema:
|
| 68 |
-
type: 'string'
|
| 69 |
-
example: rickroll
|
| 70 |
-
- name: 'signature'
|
| 71 |
-
description: Special access key.
|
| 72 |
-
in: 'query'
|
| 73 |
-
schema:
|
| 74 |
-
type: 'string'
|
| 75 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 76 |
-
summary: "Finding beatmap by query."
|
| 77 |
-
responses:
|
| 78 |
-
200:
|
| 79 |
-
description: OK
|
| 80 |
-
content:
|
| 81 |
-
application/json:
|
| 82 |
-
schema:
|
| 83 |
-
$ref: "#/components/schemas/FindBeatmapsObject"
|
| 84 |
-
400:
|
| 85 |
-
description: Bad Request
|
| 86 |
-
content:
|
| 87 |
-
application/json:
|
| 88 |
-
schema:
|
| 89 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 90 |
post:
|
| 91 |
tags:
|
| 92 |
- "osu! API"
|
|
@@ -97,12 +43,6 @@ paths:
|
|
| 97 |
schema:
|
| 98 |
type: 'string'
|
| 99 |
example: rickroll
|
| 100 |
-
- name: 'signature'
|
| 101 |
-
description: Special access key.
|
| 102 |
-
in: 'query'
|
| 103 |
-
schema:
|
| 104 |
-
type: 'string'
|
| 105 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 106 |
summary: "Finding beatmap by query."
|
| 107 |
responses:
|
| 108 |
200:
|
|
@@ -118,42 +58,6 @@ paths:
|
|
| 118 |
schema:
|
| 119 |
$ref: "#/components/schemas/ErrorObject"
|
| 120 |
/osu/api/v1/get-full:
|
| 121 |
-
get:
|
| 122 |
-
tags:
|
| 123 |
-
- "osu! API"
|
| 124 |
-
parameters:
|
| 125 |
-
- name: 'query'
|
| 126 |
-
description: Query to find beatmap and download full song.
|
| 127 |
-
in: 'query'
|
| 128 |
-
schema:
|
| 129 |
-
type: 'string'
|
| 130 |
-
example: rickroll
|
| 131 |
-
- name: 'beatmapId'
|
| 132 |
-
description: Beatset id. Not map, set.
|
| 133 |
-
in: 'query'
|
| 134 |
-
schema:
|
| 135 |
-
type: 'integer'
|
| 136 |
-
example: 1
|
| 137 |
-
- name: 'signature'
|
| 138 |
-
description: Special access key.
|
| 139 |
-
in: 'query'
|
| 140 |
-
schema:
|
| 141 |
-
type: 'string'
|
| 142 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 143 |
-
summary: "Get beatmap's full song."
|
| 144 |
-
responses:
|
| 145 |
-
200:
|
| 146 |
-
description: OK
|
| 147 |
-
content:
|
| 148 |
-
application/json:
|
| 149 |
-
schema:
|
| 150 |
-
$ref: "#/components/schemas/SongFullObject"
|
| 151 |
-
400:
|
| 152 |
-
description: Bad Request
|
| 153 |
-
content:
|
| 154 |
-
application/json:
|
| 155 |
-
schema:
|
| 156 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 157 |
post:
|
| 158 |
tags:
|
| 159 |
- "osu! API"
|
|
@@ -170,12 +74,6 @@ paths:
|
|
| 170 |
schema:
|
| 171 |
type: 'integer'
|
| 172 |
example: 1
|
| 173 |
-
- name: 'signature'
|
| 174 |
-
description: Special access key.
|
| 175 |
-
in: 'query'
|
| 176 |
-
schema:
|
| 177 |
-
type: 'string'
|
| 178 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 179 |
summary: "Get beatmap's full song."
|
| 180 |
responses:
|
| 181 |
200:
|
|
@@ -191,42 +89,6 @@ paths:
|
|
| 191 |
schema:
|
| 192 |
$ref: "#/components/schemas/ErrorObject"
|
| 193 |
/osu/api/v1/get-preview:
|
| 194 |
-
get:
|
| 195 |
-
tags:
|
| 196 |
-
- "osu! API"
|
| 197 |
-
parameters:
|
| 198 |
-
- name: 'query'
|
| 199 |
-
description: Query to find beatmap and download full song.
|
| 200 |
-
in: 'query'
|
| 201 |
-
schema:
|
| 202 |
-
type: 'string'
|
| 203 |
-
example: rickroll
|
| 204 |
-
- name: 'beatmapId'
|
| 205 |
-
description: Beatset id. Not map, set.
|
| 206 |
-
in: 'query'
|
| 207 |
-
schema:
|
| 208 |
-
type: 'integer'
|
| 209 |
-
example: 1
|
| 210 |
-
- name: 'signature'
|
| 211 |
-
description: Special access key.
|
| 212 |
-
in: 'query'
|
| 213 |
-
schema:
|
| 214 |
-
type: 'string'
|
| 215 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 216 |
-
summary: "Get beatmap's song preview."
|
| 217 |
-
responses:
|
| 218 |
-
200:
|
| 219 |
-
description: OK
|
| 220 |
-
content:
|
| 221 |
-
application/json:
|
| 222 |
-
schema:
|
| 223 |
-
$ref: "#/components/schemas/SongPreviewObject"
|
| 224 |
-
400:
|
| 225 |
-
description: Bad Request
|
| 226 |
-
content:
|
| 227 |
-
application/json:
|
| 228 |
-
schema:
|
| 229 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 230 |
post:
|
| 231 |
tags:
|
| 232 |
- "osu! API"
|
|
@@ -243,12 +105,6 @@ paths:
|
|
| 243 |
schema:
|
| 244 |
type: 'integer'
|
| 245 |
example: 1
|
| 246 |
-
- name: 'signature'
|
| 247 |
-
description: Special access key.
|
| 248 |
-
in: 'query'
|
| 249 |
-
schema:
|
| 250 |
-
type: 'string'
|
| 251 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 252 |
summary: "Get beatmap's song preview."
|
| 253 |
responses:
|
| 254 |
200:
|
|
@@ -263,104 +119,7 @@ paths:
|
|
| 263 |
application/json:
|
| 264 |
schema:
|
| 265 |
$ref: "#/components/schemas/ErrorObject"
|
| 266 |
-
/recognize/api/v1/voice:
|
| 267 |
-
get:
|
| 268 |
-
tags:
|
| 269 |
-
- Recognize API
|
| 270 |
-
parameters:
|
| 271 |
-
- name: 'url'
|
| 272 |
-
description: URL-link to voice message. Should be mp3, ogg or wav.
|
| 273 |
-
in: 'query'
|
| 274 |
-
schema:
|
| 275 |
-
type: 'string'
|
| 276 |
-
example: https://cdn-102.anonfiles.com/q8v0o5O5y8/3d62dac1-1671893935/j4893hg894g4.mp3
|
| 277 |
-
- name: 'extendInfo'
|
| 278 |
-
description: Provide additional information or not.
|
| 279 |
-
in: 'query'
|
| 280 |
-
schema:
|
| 281 |
-
type: 'string'
|
| 282 |
-
default: False
|
| 283 |
-
example: False
|
| 284 |
-
- name: 'signature'
|
| 285 |
-
description: Special access key.
|
| 286 |
-
in: 'query'
|
| 287 |
-
schema:
|
| 288 |
-
type: 'string'
|
| 289 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 290 |
-
summary: "This method can help with converting voice into the text."
|
| 291 |
-
responses:
|
| 292 |
-
200:
|
| 293 |
-
description: OK
|
| 294 |
-
content:
|
| 295 |
-
application/json:
|
| 296 |
-
schema:
|
| 297 |
-
$ref: "#/components/schemas/RecognizeObject"
|
| 298 |
-
400:
|
| 299 |
-
description: Bad Request
|
| 300 |
-
content:
|
| 301 |
-
application/json:
|
| 302 |
-
schema:
|
| 303 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 304 |
-
post:
|
| 305 |
-
tags:
|
| 306 |
-
- Recognize API
|
| 307 |
-
parameters:
|
| 308 |
-
- name: 'url'
|
| 309 |
-
description: URL-link to voice message. Should be mp3, ogg or wav.
|
| 310 |
-
in: 'query'
|
| 311 |
-
schema:
|
| 312 |
-
type: 'string'
|
| 313 |
-
example: https://cdn-102.anonfiles.com/q8v0o5O5y8/3d62dac1-1671893935/j4893hg894g4.mp3
|
| 314 |
-
- name: 'file'
|
| 315 |
-
description: Upload file to recognize voice. **NOT SUPPORTED NOW**
|
| 316 |
-
in: 'query'
|
| 317 |
-
schema:
|
| 318 |
-
type: 'string'
|
| 319 |
-
- name: 'extendInfo'
|
| 320 |
-
description: Provide additional information or not.
|
| 321 |
-
in: 'query'
|
| 322 |
-
schema:
|
| 323 |
-
type: 'string'
|
| 324 |
-
default: False
|
| 325 |
-
example: False
|
| 326 |
-
- name: 'signature'
|
| 327 |
-
description: Special access key.
|
| 328 |
-
in: 'query'
|
| 329 |
-
schema:
|
| 330 |
-
type: 'string'
|
| 331 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 332 |
-
summary: "This method can help with converting voice into the text."
|
| 333 |
-
responses:
|
| 334 |
-
200:
|
| 335 |
-
description: OK
|
| 336 |
-
content:
|
| 337 |
-
application/json:
|
| 338 |
-
schema:
|
| 339 |
-
$ref: "#/components/schemas/RecognizeObject"
|
| 340 |
-
400:
|
| 341 |
-
description: Bad Request
|
| 342 |
-
content:
|
| 343 |
-
application/json:
|
| 344 |
-
schema:
|
| 345 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 346 |
/system-info/api/v1/get:
|
| 347 |
-
get:
|
| 348 |
-
tags:
|
| 349 |
-
- "System information"
|
| 350 |
-
summary: "Information about server."
|
| 351 |
-
responses:
|
| 352 |
-
200:
|
| 353 |
-
description: OK
|
| 354 |
-
content:
|
| 355 |
-
application/json:
|
| 356 |
-
schema:
|
| 357 |
-
$ref: "#/components/schemas/SysinfoObject"
|
| 358 |
-
400:
|
| 359 |
-
description: Bad Request
|
| 360 |
-
content:
|
| 361 |
-
application/json:
|
| 362 |
-
schema:
|
| 363 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 364 |
post:
|
| 365 |
tags:
|
| 366 |
- "System information"
|
|
@@ -379,36 +138,6 @@ paths:
|
|
| 379 |
schema:
|
| 380 |
$ref: "#/components/schemas/ErrorObject"
|
| 381 |
/yt/api/v1/search:
|
| 382 |
-
get:
|
| 383 |
-
tags:
|
| 384 |
-
- "Youtube: Becoming Music Platform"
|
| 385 |
-
parameters:
|
| 386 |
-
- name: 'query'
|
| 387 |
-
description: Query for YouTube to find videos.
|
| 388 |
-
in: 'query'
|
| 389 |
-
schema:
|
| 390 |
-
type: 'string'
|
| 391 |
-
example: never gonna give you up
|
| 392 |
-
- name: 'signature'
|
| 393 |
-
description: Special access key.
|
| 394 |
-
in: 'query'
|
| 395 |
-
schema:
|
| 396 |
-
type: 'string'
|
| 397 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 398 |
-
summary: "This method can help with searching videos on YouTube."
|
| 399 |
-
responses:
|
| 400 |
-
200:
|
| 401 |
-
description: OK
|
| 402 |
-
content:
|
| 403 |
-
application/json:
|
| 404 |
-
schema:
|
| 405 |
-
$ref: "#/components/schemas/YTSearchObject"
|
| 406 |
-
400:
|
| 407 |
-
description: Bad Request
|
| 408 |
-
content:
|
| 409 |
-
application/json:
|
| 410 |
-
schema:
|
| 411 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 412 |
post:
|
| 413 |
tags:
|
| 414 |
- "Youtube: Becoming Music Platform"
|
|
@@ -419,12 +148,7 @@ paths:
|
|
| 419 |
schema:
|
| 420 |
type: 'string'
|
| 421 |
example: never gonna give you up
|
| 422 |
-
|
| 423 |
-
description: Special access key.
|
| 424 |
-
in: 'query'
|
| 425 |
-
schema:
|
| 426 |
-
type: 'string'
|
| 427 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 428 |
summary: "This method can help with searching videos on YouTube."
|
| 429 |
responses:
|
| 430 |
200:
|
|
@@ -440,47 +164,6 @@ paths:
|
|
| 440 |
schema:
|
| 441 |
$ref: "#/components/schemas/ErrorObject"
|
| 442 |
/yt/api/v1/get-full:
|
| 443 |
-
get:
|
| 444 |
-
tags:
|
| 445 |
-
- "Youtube: Becoming Music Platform"
|
| 446 |
-
parameters:
|
| 447 |
-
- name: 'url'
|
| 448 |
-
description: Url to video from YouTube. (TikTok also works sometimes.)
|
| 449 |
-
in: 'query'
|
| 450 |
-
schema:
|
| 451 |
-
type: 'string'
|
| 452 |
-
- name: 'bitrate'
|
| 453 |
-
description: Bitrate of final audio.
|
| 454 |
-
in: 'query'
|
| 455 |
-
schema:
|
| 456 |
-
type: 'string'
|
| 457 |
-
example: "64k"
|
| 458 |
-
- name: 'quality'
|
| 459 |
-
description: Quality of final audio. Only 'worst' or 'best'.
|
| 460 |
-
in: 'query'
|
| 461 |
-
schema:
|
| 462 |
-
type: 'string'
|
| 463 |
-
example: "worst"
|
| 464 |
-
- name: 'signature'
|
| 465 |
-
description: Special access key.
|
| 466 |
-
in: 'query'
|
| 467 |
-
schema:
|
| 468 |
-
type: 'string'
|
| 469 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 470 |
-
summary: "Download video as audio and providing link for you."
|
| 471 |
-
responses:
|
| 472 |
-
200:
|
| 473 |
-
description: OK
|
| 474 |
-
content:
|
| 475 |
-
application/json:
|
| 476 |
-
schema:
|
| 477 |
-
$ref: "#/components/schemas/YTFullObject"
|
| 478 |
-
400:
|
| 479 |
-
description: Bad Request
|
| 480 |
-
content:
|
| 481 |
-
application/json:
|
| 482 |
-
schema:
|
| 483 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 484 |
post:
|
| 485 |
tags:
|
| 486 |
- "Youtube: Becoming Music Platform"
|
|
@@ -502,12 +185,7 @@ paths:
|
|
| 502 |
schema:
|
| 503 |
type: 'string'
|
| 504 |
example: "worst"
|
| 505 |
-
|
| 506 |
-
description: Special access key.
|
| 507 |
-
in: 'query'
|
| 508 |
-
schema:
|
| 509 |
-
type: 'string'
|
| 510 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 511 |
summary: "Download video as audio and providing link for you."
|
| 512 |
responses:
|
| 513 |
200:
|
|
@@ -523,53 +201,6 @@ paths:
|
|
| 523 |
schema:
|
| 524 |
$ref: "#/components/schemas/ErrorObject"
|
| 525 |
/yt/api/v1/get-preview:
|
| 526 |
-
get:
|
| 527 |
-
tags:
|
| 528 |
-
- "Youtube: Becoming Music Platform"
|
| 529 |
-
parameters:
|
| 530 |
-
- name: 'url'
|
| 531 |
-
description: Url to video from YouTube. (TikTok also works sometimes.)
|
| 532 |
-
in: 'query'
|
| 533 |
-
schema:
|
| 534 |
-
type: 'string'
|
| 535 |
-
- name: 'bitrate'
|
| 536 |
-
description: Bitrate of final audio.
|
| 537 |
-
in: 'query'
|
| 538 |
-
schema:
|
| 539 |
-
type: 'string'
|
| 540 |
-
example: "64k"
|
| 541 |
-
- name: 'quality'
|
| 542 |
-
description: Quality of final audio. Only 'worst' or 'best'.
|
| 543 |
-
in: 'query'
|
| 544 |
-
schema:
|
| 545 |
-
type: 'string'
|
| 546 |
-
example: "worst"
|
| 547 |
-
- name: 'duration'
|
| 548 |
-
description: Duration of preview. Maximum 60 seconds.
|
| 549 |
-
in: 'query'
|
| 550 |
-
schema:
|
| 551 |
-
type: 'integer'
|
| 552 |
-
example: 30
|
| 553 |
-
- name: 'signature'
|
| 554 |
-
description: Special access key.
|
| 555 |
-
in: 'query'
|
| 556 |
-
schema:
|
| 557 |
-
type: 'string'
|
| 558 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 559 |
-
summary: "Download video as cutted audio and providing link for you."
|
| 560 |
-
responses:
|
| 561 |
-
200:
|
| 562 |
-
description: OK
|
| 563 |
-
content:
|
| 564 |
-
application/json:
|
| 565 |
-
schema:
|
| 566 |
-
$ref: "#/components/schemas/YTPreviewResult"
|
| 567 |
-
400:
|
| 568 |
-
description: Bad Request
|
| 569 |
-
content:
|
| 570 |
-
application/json:
|
| 571 |
-
schema:
|
| 572 |
-
$ref: "#/components/schemas/ErrorObject"
|
| 573 |
post:
|
| 574 |
tags:
|
| 575 |
- "Youtube: Becoming Music Platform"
|
|
@@ -597,12 +228,6 @@ paths:
|
|
| 597 |
schema:
|
| 598 |
type: 'integer'
|
| 599 |
example: 30
|
| 600 |
-
- name: 'signature'
|
| 601 |
-
description: Special access key.
|
| 602 |
-
in: 'query'
|
| 603 |
-
schema:
|
| 604 |
-
type: 'string'
|
| 605 |
-
example: 'B46AAB1A3F1E33625C1B6BD9507453B928DE69BA638E7098DB533A2184ED288EFB899D563EF8AB5487DACBCAD909A801E4C81FD6D34B639F6591295CD1D10A5B'
|
| 606 |
summary: "Download video as cutted audio and providing link for you."
|
| 607 |
responses:
|
| 608 |
200:
|
|
|
|
| 5 |
version: $VERSION_VARIABLE$
|
| 6 |
servers:
|
| 7 |
- url: 'https://imperialwool-funapi.hf.space/'
|
| 8 |
+
description: 'You are here! ^�^'
|
| 9 |
paths:
|
| 10 |
/signatures/api/v1/get:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
post:
|
| 12 |
tags:
|
| 13 |
- "Authentication"
|
|
|
|
| 33 |
schema:
|
| 34 |
$ref: "#/components/schemas/AuthErrorObject"
|
| 35 |
/osu/api/v1/find-song:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
post:
|
| 37 |
tags:
|
| 38 |
- "osu! API"
|
|
|
|
| 43 |
schema:
|
| 44 |
type: 'string'
|
| 45 |
example: rickroll
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
summary: "Finding beatmap by query."
|
| 47 |
responses:
|
| 48 |
200:
|
|
|
|
| 58 |
schema:
|
| 59 |
$ref: "#/components/schemas/ErrorObject"
|
| 60 |
/osu/api/v1/get-full:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
post:
|
| 62 |
tags:
|
| 63 |
- "osu! API"
|
|
|
|
| 74 |
schema:
|
| 75 |
type: 'integer'
|
| 76 |
example: 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
summary: "Get beatmap's full song."
|
| 78 |
responses:
|
| 79 |
200:
|
|
|
|
| 89 |
schema:
|
| 90 |
$ref: "#/components/schemas/ErrorObject"
|
| 91 |
/osu/api/v1/get-preview:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
post:
|
| 93 |
tags:
|
| 94 |
- "osu! API"
|
|
|
|
| 105 |
schema:
|
| 106 |
type: 'integer'
|
| 107 |
example: 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
summary: "Get beatmap's song preview."
|
| 109 |
responses:
|
| 110 |
200:
|
|
|
|
| 119 |
application/json:
|
| 120 |
schema:
|
| 121 |
$ref: "#/components/schemas/ErrorObject"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
/system-info/api/v1/get:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
post:
|
| 124 |
tags:
|
| 125 |
- "System information"
|
|
|
|
| 138 |
schema:
|
| 139 |
$ref: "#/components/schemas/ErrorObject"
|
| 140 |
/yt/api/v1/search:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
post:
|
| 142 |
tags:
|
| 143 |
- "Youtube: Becoming Music Platform"
|
|
|
|
| 148 |
schema:
|
| 149 |
type: 'string'
|
| 150 |
example: never gonna give you up
|
| 151 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 152 |
summary: "This method can help with searching videos on YouTube."
|
| 153 |
responses:
|
| 154 |
200:
|
|
|
|
| 164 |
schema:
|
| 165 |
$ref: "#/components/schemas/ErrorObject"
|
| 166 |
/yt/api/v1/get-full:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
post:
|
| 168 |
tags:
|
| 169 |
- "Youtube: Becoming Music Platform"
|
|
|
|
| 185 |
schema:
|
| 186 |
type: 'string'
|
| 187 |
example: "worst"
|
| 188 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
summary: "Download video as audio and providing link for you."
|
| 190 |
responses:
|
| 191 |
200:
|
|
|
|
| 201 |
schema:
|
| 202 |
$ref: "#/components/schemas/ErrorObject"
|
| 203 |
/yt/api/v1/get-preview:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
post:
|
| 205 |
tags:
|
| 206 |
- "Youtube: Becoming Music Platform"
|
|
|
|
| 228 |
schema:
|
| 229 |
type: 'integer'
|
| 230 |
example: 30
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 231 |
summary: "Download video as cutted audio and providing link for you."
|
| 232 |
responses:
|
| 233 |
200:
|