feat:新增fastapi-login,数据库表
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Joe 2023-08-16 19:40:35 +08:00
parent 3c96772a56
commit 3d73f1ad10
18 changed files with 856 additions and 161 deletions

226
api.py
View File

@ -1,11 +1,16 @@
import fastapi import fastapi
import os from fastapi.security import OAuth2PasswordRequestForm
from fastapi_login.exceptions import InvalidCredentialsException
from datetime import timedelta
import requests import requests
import uvicorn import uvicorn
from fastapi import Depends
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from service.userservice import * from fastapi_login import LoginManager
from service.rank_data import * from server.user_server import *
from server.rank_data import *
from server.music_server import *
env = os.environ env = os.environ
app = FastAPI() app = FastAPI()
@ -19,58 +24,135 @@ app.add_middleware(
allow_headers=["*"], # 允许所有请求头 allow_headers=["*"], # 允许所有请求头
) )
SECRET = os.urandom(24).hex()
manager = LoginManager(SECRET, token_url='/auth/token', use_cookie=False)
try:
# mysql数据配置
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password, port=mysql_port,
charset="utf8", database=mysql_database)
# cursor = con.cursor()
except Exception as e:
print(e)
print("数据库连接失败")
@manager.user_loader()
def load_user(username: int):
"""
获取用户信息
:param username:
:return:
"""
try:
with con.cursor() as cursor:
cursor.execute("SELECT * FROM User WHERE username = %s", (username,))
user = cursor.fetchone()
if user:
user_dict = dict(username=user[1], password=user[3])
return user_dict
else:
return None
except Exception as e:
print(e)
return None
# @app.get('/auth/cookie')
# def auth(response: Response, user=Depends(manager)):
# """
# 通过cookie验证用户
# :param response:
# :param user:
# :return:
# """
# # 查询用户信息
# cursor.execute("SELECT * FROM User WHERE email = %s", (user['sub'],))
# user = cursor.fetchone()
# # 生成token
# token = manager.create_access_token(
# data=dict(sub=user[2])
# )
# manager.set_cookie(response, token)
# return response
@app.post('/auth/get_token')
def get_token(data: OAuth2PasswordRequestForm = Depends()):
username = data.username
password = md5(data.password)
user = load_user(username) # we are using the same function to retrieve the user
if not user:
raise InvalidCredentialsException # you can also use your own HTTPException
elif password != user['password']:
raise InvalidCredentialsException
access_token = manager.create_access_token(
data=dict(sub=username),
expires=timedelta(hours=12)
)
return {'access_token': access_token, 'token_type': 'bearer'}
# 验证Token
@app.get('/token/verify_user')
def get_current_user(current_user=Depends(manager.get_current_user)):
if current_user:
return {"status":200 ,"success": True, "message": "Validated successfully"}
else:
return {"status":400 ,"success": False, "message": "Invalid token"}
# @app.get('/protected')
# def protected_route(user=Depends(manager)):
# return "验证通过"
# 注册 # 注册
@app.post("/register") @app.post("/user/register")
async def register(username: str = fastapi.Form(..., description="用户名"), async def user_register(
password: str = fastapi.Form(..., description="密码")): username: str = fastapi.Query(..., description="用户名"),
password: str = fastapi.Query(..., description="密码"),
email: str = fastapi.Query(None, description="邮箱")):
""" """
注册新用户 注册
:param username: 用户名 :param username:
:param password: 密码 :param password:
:return: 注册结果 :param email:
:return:
""" """
# 读取现有的用户信息 create_user(username, password)
existing_users = read_users() # 获取Token
token_info = get_token(OAuth2PasswordRequestForm(username=username, password=password))
# 检查用户名是否已存在 return {"success": True, "message": "注册成功", "token": token_info}
if username in existing_users:
return {"success": False, "message": "用户名已存在"}
# 添加新用户信息
new_user = {"username": username, "password": password}
existing_users[username] = new_user
# 将用户信息保存到CSV文件
save_users(existing_users)
return {"success": True, "message": "注册成功"}
# 登陆 # 登陆
@app.post("/login") @app.post("/user/login")
async def login(username: str = fastapi.Form(..., description="用户名"), async def user_login(
password: str = fastapi.Form(..., description="密码")): username: str = fastapi.Query(..., description="用户名"),
password: str = fastapi.Query(..., description="密码")):
""" """
用户登录 登陆并获取Token
:param username: 用户名 :param username:
:param password: 密码 :param password:
:return: 登录结果 :return:
""" """
# 读取用户信息 # 请求auth/token接口获取token
existing_users = read_users() token_info = get_token(OAuth2PasswordRequestForm(username=username, password=password))
login_info = user_login(username, password)
# 验证用户名和密码 if login_info:
user = existing_users.get(username) return {"success": True, "message": "登陆成功", "token": token_info}
if user and user["password"] == password: else:
return {"success": True, "message": "登录成功"} return {"success": False, "message": "登陆失败"}
return {"success": False, "message": "用户名或密码错误"}
# 榜单获取 # 榜单获取
@app.get("/get_rank") @app.get("/get_rank")
async def get_rank( async def get_rank(
rank_id: str = fastapi.Query(..., description="榜单类型")): rank_id: str = fastapi.Query(..., description="榜单类型"),
current_user=Depends(manager.get_current_user)):
""" """
:param rank_id: :param rank_id:
19723756 云音乐飙升榜 19723756 云音乐飙升榜
@ -82,7 +164,7 @@ async def get_rank(
headers = { headers = {
"Referer": "https://music.163.com/", "Referer": "https://music.163.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
" AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36" " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"
} }
url = f"https://music.163.com/api/playlist/detail?id={rank_id}" url = f"https://music.163.com/api/playlist/detail?id={rank_id}"
@ -90,57 +172,26 @@ async def get_rank(
response = requests.get(url, headers=headers) response = requests.get(url, headers=headers)
# 如果请求code为-447 那么继续返回json # 如果请求code为-447 那么继续返回json
if response.status_code == -447: if response.status_code == -447:
return {"message": "请求code为-447传入本地JSON数据", "data": response.json()} return {"message": "response code is -447, local json data", "data": response.json()}
else: else:
# 检测是否含有带rank_id的缓存文件 # 检测是否含有带rank_id的缓存文件
cached_data = read_cache(rank_id) cached_data = read_cache(rank_id)
if cached_data: if cached_data:
return {"message": "本地JSON数据", "data": cached_data} return {"message": "local json data", "data": cached_data}
# 将榜单数据写入缓存文件 # 将榜单数据写入缓存文件
write_cache(rank_id, response.json()) write_cache(rank_id, response.json())
print(response.json()) print(response.json())
data = response.json() data = response.json()
return {"message": "请求网易云并缓存本地JSON成功", "data": data} return {"message": "Request Netease Cloud And Local Cache JSON Success", "data": data}
# @app.get("/get_rank")
# async def get_rank(rank_id: str = fastapi.Query(..., description="榜单类型")):
# """
# 获取音乐榜单数据
# :param rank_id: 榜单ID
# 19723756 云音乐飙升榜
# 3779629 云音乐新歌榜
# 3778678 云音乐热歌榜
# 2884035 云音乐原创榜
# :return: 榜单数据
# """
# # 检查是否有缓存数据
# cached_data = read_cache(rank_id)
# if cached_data:
# return {"message": "success", "data": cached_data}
#
# headers = {
# "Referer": "https://music.163.com/",
# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
# " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"
# }
# # 缓存数据不存在,从网络获取榜单数据
# url = f"https://music.163.com/api/playlist/detail?id={rank_id}"
# response = requests.get(url, headers=headers)
# data = response.json()
#
# # 将数据写入缓存文件
# write_cache(rank_id, data)
#
# return {"message": "success", "data": data}
# 根据歌曲名称搜索歌曲
@app.get("/search_song_by_name") @app.get("/search_song_by_name")
async def search_song_by_name( async def search_song_by_name(
name: str = fastapi.Query(..., description="歌曲名称")): name: str = fastapi.Query(..., description="歌曲名称"),
# current_user=Depends(manager.get_current_user)
):
payload = { payload = {
"input": name, "input": name,
"filter": "name", "filter": "name",
@ -187,9 +238,11 @@ async def search_song_by_name(
# 根据歌曲id搜索歌曲 # 根据歌曲id搜索歌曲
@app.get("/search_song_by_id") @app.get("/search_song_by_id")
async def search_song_by_id( async def search_song_by_id(
id: str = fastapi.Query(..., description="歌曲id")): music_id: str = fastapi.Query(..., description="歌曲id"),
# current_user=Depends(manager.get_current_user)
):
payload = { payload = {
"input": id, "input": music_id,
"filter": "id", "filter": "id",
"type": "netease", # netease, tencent, kugou, xiami, baidu "type": "netease", # netease, tencent, kugou, xiami, baidu
"page": 1 "page": 1
@ -219,13 +272,20 @@ async def search_song_by_id(
if response.status_code == 200: if response.status_code == 200:
# Parse the response JSON data # Parse the response JSON data
data = response.json() data = response.json()
print(data)
try:
save_search_music(data)
except Exception as e:
print(e)
return {"message": "success", "data": data} return {"message": "success", "data": data}
else: else:
print(f"Failed to get data. Status code: {response.status_code}") print(f"Failed to get data. Status code: {response.status_code}")
return {"message": "failed", "data": []} return {"message": "failed", "data": []}
if __name__ == '__main__': if __name__ == '__main__':
host = env.get("HOST") if env.get("HOST") is not None else "0.0.0.0" host = env.get("HOST") if env.get("HOST") is not None else "0.0.0.0"
port = int(env.get("PORT")) if env.get("PORT") is not None else 7788 port = int(env.get("PORT")) if env.get("PORT") is not None else 7888
uvicorn.run(app='api:app', host=host, port=port, reload=True) uvicorn.run(app='api:app', host=host, port=port, reload=True)

View File

@ -1,4 +0,0 @@
username,password
user1,password1
user2,password2
username1,123456
1 username password
2 user1 password1
3 user2 password2
4 username1 123456

View File

@ -1,35 +1,306 @@
aiofiles==23.1.0
aiohttp==3.8.5
aiosignal==1.3.1
altair==5.0.1
annotated-types==0.5.0 annotated-types==0.5.0
anyio==3.7.1 anyio==3.7.1
appdirs==1.4.4 appdirs==1.4.4
async-generator==1.10
async-timeout==4.0.2
attrs==23.1.0
Babel==2.12.1
bce-python-sdk==0.8.87
bcrypt==4.0.1
beautifulsoup4==4.12.2 beautifulsoup4==4.12.2
blinker==1.6.2
bs4==0.0.1 bs4==0.0.1
certifi==2023.7.22 certifi==2023.5.7
charset-normalizer==3.2.0 charset-normalizer==3.1.0
click==8.1.6 click==8.1.3
cloudscraper==1.2.71
colorama==0.4.6
colorlog==6.7.0
comtypes==1.2.0
contourpy==1.1.0
cssselect==1.2.0 cssselect==1.2.0
exceptiongroup==1.1.2 cycler==0.11.0
databases==0.7.0
datasets==2.14.0
dill==0.3.4
docopt==0.6.2
easydict==1.10
et-xmlfile==1.1.0
exceptiongroup==1.1.1
fake-useragent==1.1.3 fake-useragent==1.1.3
fastapi==0.100.0 fastapi==0.100.0
fastapi-login==1.9.1
ffmpy==0.3.1
filelock==3.12.2
fire==0.5.0
Flask==2.3.2
Flask-Babel==2.0.0
fonttools==4.41.0
frozenlist==1.4.0
fsspec==2023.6.0
future==0.18.3
gevent==22.10.2
gradio==3.39.0
gradio_client==0.3.0
greenlet==2.0.2
gunicorn==21.2.0
h11==0.14.0 h11==0.14.0
httpcore==0.17.3
httpx==0.24.1
huggingface-hub==0.16.4
idna==3.4 idna==3.4
importlib-metadata==6.8.0 importlib-metadata==6.8.0
lxml==4.9.3 importlib-resources==6.0.0
itsdangerous==2.1.2
jieba==0.42.1
Jinja2==3.1.2
joblib==1.3.1
jsonschema==4.18.4
jsonschema-specifications==2023.7.1
kenlm==0.1
kiwisolver==1.4.4
libretranslatepy==2.1.1
linkify-it-py==2.0.2
loguru==0.7.0
lxml==4.9.2
markdown-it-py==2.2.0
MarkupSafe==2.1.3
matplotlib==3.7.2
mdit-py-plugins==0.3.3
mdurl==0.1.2
multidict==6.0.4
multiprocess==0.70.12.2
numpy==1.25.0
opencv-python==4.8.0.74
openpyxl==3.1.2
orjson==3.9.2
outcome==1.2.0
packaging==23.1
paddle2onnx==1.0.5
paddlefsl==1.1.0
paddlehub==2.3.1
paddlenlp==2.5.2
pandas==1.3.5
parse==1.19.1 parse==1.19.1
pydantic==2.1.1 passlib==1.7.4
pydantic_core==2.4.0 pdf2docx==0.5.6
pdf2image==1.16.3
Pillow==9.5.0
pipreqs==0.4.13
playsound==1.3.0
protobuf==4.23.4
pyarrow==12.0.1
PyAudio==0.2.13
pycorrector==0.5.0
pycryptodome==3.18.0
pydantic==2.0.3
pydantic_core==2.3.0
pydub==0.25.1
pyee==8.2.2 pyee==8.2.2
pygame==2.5.0
Pygments==2.15.1
PyJWT==2.8.0
PyMuPDF==1.22.5
PyMySQL==1.1.0
pyobjc==9.2
pyobjc-core==9.2
pyobjc-framework-Accounts==9.2
pyobjc-framework-AddressBook==9.2
pyobjc-framework-AdSupport==9.2
pyobjc-framework-AppleScriptKit==9.2
pyobjc-framework-AppleScriptObjC==9.2
pyobjc-framework-ApplicationServices==9.2
pyobjc-framework-AudioVideoBridging==9.2
pyobjc-framework-AuthenticationServices==9.2
pyobjc-framework-AutomaticAssessmentConfiguration==9.2
pyobjc-framework-Automator==9.2
pyobjc-framework-AVFoundation==9.2
pyobjc-framework-AVKit==9.2
pyobjc-framework-BusinessChat==9.2
pyobjc-framework-CalendarStore==9.2
pyobjc-framework-CFNetwork==9.2
pyobjc-framework-CloudKit==9.2
pyobjc-framework-Cocoa==9.2
pyobjc-framework-Collaboration==9.2
pyobjc-framework-ColorSync==9.2
pyobjc-framework-Contacts==9.2
pyobjc-framework-ContactsUI==9.2
pyobjc-framework-CoreAudio==9.2
pyobjc-framework-CoreAudioKit==9.2
pyobjc-framework-CoreBluetooth==9.2
pyobjc-framework-CoreData==9.2
pyobjc-framework-CoreHaptics==9.2
pyobjc-framework-CoreLocation==9.2
pyobjc-framework-CoreMedia==9.2
pyobjc-framework-CoreMediaIO==9.2
pyobjc-framework-CoreMIDI==9.2
pyobjc-framework-CoreML==9.2
pyobjc-framework-CoreMotion==9.2
pyobjc-framework-CoreServices==9.2
pyobjc-framework-CoreSpotlight==9.2
pyobjc-framework-CoreText==9.2
pyobjc-framework-CoreWLAN==9.2
pyobjc-framework-CryptoTokenKit==9.2
pyobjc-framework-DeviceCheck==9.2
pyobjc-framework-DictionaryServices==9.2
pyobjc-framework-DiscRecording==9.2
pyobjc-framework-DiscRecordingUI==9.2
pyobjc-framework-DiskArbitration==9.2
pyobjc-framework-DVDPlayback==9.2
pyobjc-framework-EventKit==9.2
pyobjc-framework-ExceptionHandling==9.2
pyobjc-framework-ExecutionPolicy==9.2
pyobjc-framework-ExternalAccessory==9.2
pyobjc-framework-FileProvider==9.2
pyobjc-framework-FileProviderUI==9.2
pyobjc-framework-FinderSync==9.2
pyobjc-framework-FSEvents==9.2
pyobjc-framework-GameCenter==9.2
pyobjc-framework-GameController==9.2
pyobjc-framework-GameKit==9.2
pyobjc-framework-GameplayKit==9.2
pyobjc-framework-ImageCaptureCore==9.2
pyobjc-framework-IMServicePlugIn==9.2
pyobjc-framework-InputMethodKit==9.2
pyobjc-framework-InstallerPlugins==9.2
pyobjc-framework-InstantMessage==9.2
pyobjc-framework-Intents==9.2
pyobjc-framework-IOBluetooth==9.2
pyobjc-framework-IOBluetoothUI==9.2
pyobjc-framework-IOSurface==9.2
pyobjc-framework-iTunesLibrary==9.2
pyobjc-framework-LatentSemanticMapping==9.2
pyobjc-framework-LaunchServices==9.2
pyobjc-framework-libdispatch==9.2
pyobjc-framework-libxpc==9.2
pyobjc-framework-LinkPresentation==9.2
pyobjc-framework-LocalAuthentication==9.2
pyobjc-framework-MapKit==9.2
pyobjc-framework-MediaAccessibility==9.2
pyobjc-framework-MediaLibrary==9.2
pyobjc-framework-MediaPlayer==9.2
pyobjc-framework-MediaToolbox==9.2
pyobjc-framework-Metal==9.2
pyobjc-framework-MetalKit==9.2
pyobjc-framework-MetalPerformanceShaders==9.2
pyobjc-framework-ModelIO==9.2
pyobjc-framework-MultipeerConnectivity==9.2
pyobjc-framework-NaturalLanguage==9.2
pyobjc-framework-NetFS==9.2
pyobjc-framework-Network==9.2
pyobjc-framework-NetworkExtension==9.2
pyobjc-framework-NotificationCenter==9.2
pyobjc-framework-OpenDirectory==9.2
pyobjc-framework-OSAKit==9.2
pyobjc-framework-OSLog==9.2
pyobjc-framework-PencilKit==9.2
pyobjc-framework-Photos==9.2
pyobjc-framework-PhotosUI==9.2
pyobjc-framework-PreferencePanes==9.2
pyobjc-framework-PushKit==9.2
pyobjc-framework-Quartz==9.2
pyobjc-framework-QuickLookThumbnailing==9.2
pyobjc-framework-SafariServices==9.2
pyobjc-framework-SceneKit==9.2
pyobjc-framework-ScreenSaver==9.2
pyobjc-framework-ScriptingBridge==9.2
pyobjc-framework-SearchKit==9.2
pyobjc-framework-Security==9.2
pyobjc-framework-SecurityFoundation==9.2
pyobjc-framework-SecurityInterface==9.2
pyobjc-framework-ServiceManagement==9.2
pyobjc-framework-Social==9.2
pyobjc-framework-SoundAnalysis==9.2
pyobjc-framework-Speech==9.2
pyobjc-framework-SpriteKit==9.2
pyobjc-framework-StoreKit==9.2
pyobjc-framework-SyncServices==9.2
pyobjc-framework-SystemConfiguration==9.2
pyobjc-framework-SystemExtensions==9.2
pyobjc-framework-UserNotifications==9.2
pyobjc-framework-VideoSubscriberAccount==9.2
pyobjc-framework-VideoToolbox==9.2
pyobjc-framework-Vision==9.2
pyobjc-framework-WebKit==9.2
pyparsing==3.0.9
PyPDF2==3.0.1
pypinyin==0.49.0
pyppeteer==1.0.2 pyppeteer==1.0.2
pyproject==1.3.1
PyQt5==5.15.4
pyqt5-plugins==5.15.4.2.2
PyQt5-Qt5==5.15.2
PyQt5-sip==12.12.1
pyqt5-tools==5.15.4.3.2
pyquery==2.0.0 pyquery==2.0.0
PySide2==5.15.2.1
PySocks==1.7.1
pytesseract==0.3.10
python-dateutil==2.8.2
python-docx==0.8.11
python-dotenv==1.0.0
python-multipart==0.0.6
python-pptx==0.6.21
pyttsx3==2.90
pytz==2023.3
PyYAML==6.0.1
pyzmq==25.1.0
qt5-applications==5.15.2.2.3
qt5-tools==5.15.2.1.3
rarfile==4.0
referencing==0.30.0
regex==2023.6.3
reportlab==4.0.4
requests==2.31.0 requests==2.31.0
requests-html==0.10.0 requests-html==0.10.0
requests-toolbelt==1.0.0
rich==13.4.2
rpds-py==0.9.2
safetensors==0.3.1
scikit-learn==1.3.0
scipy==1.11.1
selenium==4.10.0
semantic-version==2.10.0
sentencepiece==0.1.99
seqeval==1.2.2
shiboken2==5.15.2.1
six==1.16.0
sniffio==1.3.0 sniffio==1.3.0
sortedcontainers==2.4.0
soupsieve==2.4.1 soupsieve==2.4.1
SQLAlchemy==1.4.49
starlette==0.27.0 starlette==0.27.0
termcolor==2.3.0
threadpoolctl==3.2.0
tokenizers==0.13.3
toolz==0.12.0
tqdm==4.65.0 tqdm==4.65.0
transformers==4.31.0
translate==3.6.1
trio==0.21.0
trio-websocket==0.10.3
typer==0.9.0
typing_extensions==4.7.1 typing_extensions==4.7.1
uc-micro-py==1.0.2
urllib3==1.26.16 urllib3==1.26.16
uvicorn==0.20.0 uvicorn @ file:///private/var/folders/sy/f16zz6x50xz3113nwtb9bvq00000gp/T/abs_d80hhx7s7h/croot/uvicorn-split_1678090080474/work
visualdl==2.4.2
w3lib==2.1.1 w3lib==2.1.1
websocket==0.2.1
websocket-client==0.57.0
websockets==10.4 websockets==10.4
zipp==3.16.2 Werkzeug==2.3.6
python-multipart==0.0.6 wsproto==1.2.0
wxPython==4.2.1
xlrd==2.0.1
XlsxWriter==3.1.2
xxhash==3.2.0
yarg==0.1.9
yarl==1.9.2
zipp==3.16.0
zope.event==5.0
zope.interface==6.0

146
server/music_server.py Normal file
View File

@ -0,0 +1,146 @@
import pymysql
import untils
import hashlib
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
mysql_database = untils.mysql_database
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password, port=mysql_port, charset="utf8",
database=mysql_database)
def save_search_music(music_id_json):
music_info_all = music_id_json['data'][0]
for music_info in music_info_all:
try:
with con.cursor() as cursor:
# Create a new record
sql = "INSERT INTO Music(type, link, songid, title, author, lrc, url, pic) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
cursor.execute(sql, (music_info['type'], music_info['link'], music_info['songid'], music_info['title'], music_info['author'],
music_info['lrc'], music_info['url'], music_info['pic']))
con.commit()
return {"message": "success"}
except Exception as e:
con.rollback()
return {"message": "error", "error": str(e)}
finally:
con.close()
if __name__ == '__main__':
music_id_json = {
"message": "success",
"data": {
"data": [
{
"type": "netease",
"link": "http://music.163.com/#/song?id=2007985520",
"songid": 2007985520,
"title": "我爱你",
"author": "刘大拿,刘思达LOFTHESTAR",
"lrc": "[00:00.00] 作词 : 卢广仲/刘思达LOFTHESTAR\n[00:00.09] 作曲 : 卢广仲/刘思达LOFTHESTAR\n[00:00.19] 编曲 : 天秤Dav\n[00:00.29] 原唱 : 卢广仲\n[00:00.39]出品:网易飓风\n[00:00.75]OP:添翼创越工作室\n[00:01.26]【此版本为正式授权翻唱作品。未经著作权人许可,不得翻唱、翻录或使用】\n[00:03.18]曾经在我眼前\n[00:03.60]却又消失不见\n[00:05.79]这是今天的第六遍\n[00:11.16]电影里的配乐\n[00:13.74]好像你的双眼\n[00:16.20]我爱你快回到我身边\n[00:22.23]有些感情像是金子但不能拿来抵换\n[00:24.60]是你带我起航却不负责到达彼岸\n[00:27.18]为了追随你我的心换了籍贯\n[00:29.67]但却有太多的不得已让习惯变成遗憾\n[00:32.16]你怎么不说话呢\n[00:33.90]一直沉默\n[00:35.13]要怎么理清瓜葛\n[00:36.42]不甘心占多\n[00:38.13]你陪我看过的风景都还记得\n[00:40.65]在你离开后这一切都变灰色\n[00:42.36]再也猜不到重点\n[00:43.32]你做的一切都像是让我更加痛点\n[00:45.81]又过了一夜\n[00:46.68]惊醒在又一次的梦魇\n[00:48.15]一次次的\n[00:48.48]循环之中\n[00:49.26]看到你模糊的脸\n[00:50.67]觉得这不是惩罚更像奖励多些\n[00:53.55]I dont want be saved now\n[00:55.83]My brain thought is all about u\n[00:58.59]Don't let me down again\n[01:02.25]曾经在我眼前却又消失不见\n[01:07.26]这是今天的第六遍\n[01:12.42]电影里的配乐 好像你的双眼\n[01:17.10]我爱你 快回到我身边\n[01:22.17]我在你之后变想的多\n[01:24.33]有话也不爱说\n[01:25.26]外面再吵闹也一个人听歌\n[01:27.33]歌里唱的你和我\n[01:29.07]它就像旁观者\n[01:30.03]每一句旋律都刺在我心窝\n[01:32.67]找你不是没想过意料中的失落总会让我退缩\n[01:37.62]我也不想再听说你如何又如何只会更折磨\n[01:42.72]总是会在释怀和不舍中不停的切换\n[01:46.14]唯独遗憾给的痛苦从不间断\n[01:48.60]每当我想通回忆又来添乱\n[01:50.94]不在身边的你自动变成我的牵绊\n[01:53.97]这感觉何时能够停止 notyet\n[01:56.34]好像时间又慢了些\n[01:59.43]今天的第六遍\n[02:03.57]曾经在我眼前却又消失不见\n[02:07.92]这是今天的第六遍\n[02:13.02]电影里的配乐 好像你的双眼\n[02:17.79]我爱你 快回到我身边\n[02:23.79]曾经在我眼前却又消失不见\n[02:28.14]这是今天的第六遍\n[02:33.21]电影里的配乐 好像你的双眼\n[02:37.98]我爱你 快回到我身边\n[02:41.97]制作人:李彦泽\n[02:42.36]吉他:张振\n[02:42.75]混音/母带工程师:沙栩帆\n[02:48.42]和声编写&和声:沙栩帆/俞建明\n[02:51.24]统筹企划:蔡梦珏\n[02:52.68]监制:徐思灵/胡圣羽/张泽宥\n[02:53.40]封面设计:武中奇\n[02:53.85]音乐营销:网易飓风\n[02:54.33]出品人:谢奇笛\n",
"url": "http://music.163.com/song/media/outer/url?id=2007985520.mp3",
"pic": "http://p1.music.126.net/iy39tO2gJt_DPctRSYt8ag==/109951168160088998.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=205421",
"songid": 205421,
"title": "P.S.我爱你",
"author": "黄丽玲",
"lrc": "[00:00.000] 作词 : 邬裕康\n[00:01.000] 作曲 : 刘勇志\n[00:16.440]我想要成为你的眼\n[00:22.140]把最美的风景\n[00:26.500]收进你的心中\n[00:31.710]我想要成为你的手\n[00:38.200]好让我 从现在到以后\n[00:42.640]占有你温柔 一刻不放过\n[00:48.170]恨不得把明天没收\n[00:52.100]让你永远不会变动\n[00:56.720]专注的爱着我\n[01:03.000]我爱你没有保留\n[01:06.710]我爱你就到最后\n[01:10.700]有些人值得等候\n[01:13.420]有些悲伤值得忍受\n[01:18.790]我爱你不是冲动\n[01:23.200]生命尽头反正一场空\n[01:26.700]只要你记得 我们那么爱过\n[01:41.300]\n[01:52.100]我要替你收集笑容\n[01:57.710]怕未来 快乐变得贵重\n[02:03.300]要是少了我 你有多寂寞\n[02:09.420]恨不得把明天没收\n[02:13.110]让你永远不会变动\n[02:17.900]专注的爱着我\n[02:22.490]我爱你没有保留\n[02:26.700]我爱你就到最后\n[02:30.129]有些人值得等候\n[02:33.400]有些悲伤值得忍受\n[02:37.570]我爱你不是冲动\n[02:41.450]生命尽头反正一场空\n[02:45.400]只要你记得 我们那么爱过\n[02:52.100]太阳不会放弃天空\n[02:57.400]哪怕你不再属于我\n[03:01.330]我会在不同的窗口 给你拥抱\n[03:12.110]我爱你没有保留\n[03:16.170]我爱你就到最后\n[03:20.080]有些人值得等候\n[03:23.160]有些悲伤值得忍受\n[03:28.010]我爱你不是冲动\n[03:31.810]生命尽头反正一场空\n[03:36.060]只要你记得 我们那么爱过\n[03:44.490]我忘不掉 你第一次吻我\n",
"url": "http://music.163.com/song/media/outer/url?id=205421.mp3",
"pic": "http://p1.music.126.net/Td7zYX0OXWRu0CWP7aw8ow==/109951164163127618.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=504652401",
"songid": 504652401,
"title": "我爱你 Luv Is Luv",
"author": "贺仙人",
"lrc": "[00:00.00] 作词 : 贺仙人\n[00:01.00] 作曲 : 贺仙人\n[00:02.00] 编曲 : 王晓夫/St.K4N3/2Majik\n[00:03.00] 录音 : 王晓夫\n[00:04.00] 混音 : 王晓夫\n[00:05.00] 制作 : 王晓夫\n[00:06.00] 吉他 : 徐可\n[00:12.59]你是否属于我这不重要\n[00:20.77]你在我的心里面\n[00:24.36]你存在于\n[00:27.86]我的每个习惯和每次呼吸\n[00:33.13]蔓延在我的血液\n[00:37.25]hey 我孤单的灵魂被你照亮\n[00:45.53]你是最温暖的光\n[00:48.67]oh 你的爱\n[00:52.40]她平静而又深邃让我着迷\n[00:56.79]oh baby I just cant leave u now\n[01:01.82]我 对你的爱就像河流\n[01:06.00]穿越平原和山丘\n[01:09.27]从不畏艰险 不远万里而向你奔流\n[01:15.35]我的心如此疯狂\n[01:18.55]前所未有的明朗\n[01:21.84]我想这一定是因为我爱你就像…\n[01:36.07]因为我爱你就像…\n[01:50.98]hey 我孤单的灵魂被你照亮\n[01:59.41]你是最温暖的光\n[02:02.47]oh 你的爱\n[02:06.36]她平静而又深邃让我着迷\n[02:10.69]oh baby I just cant leave u now\n[02:15.68]我 对你的爱就像河流\n[02:19.91]穿越平原和山丘\n[02:23.00]从不畏艰险 不远万里而向你奔流\n[02:29.19]我的心如此疯狂\n[02:32.36]前所未有的明朗\n[02:35.44]我想这一定是因为我爱你就像…\n[02:49.93]因为我爱你就像…\n",
"url": "http://music.163.com/song/media/outer/url?id=504652401.mp3",
"pic": "http://p1.music.126.net/h2zkaSqvw3ufLilm2R1sQw==/109951163021924377.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=26601421",
"songid": 26601421,
"title": "我爱你(live版)",
"author": "卢广仲",
"lrc": "[00:00.00] 作词 : 卢广仲\n[00:01.00] 作曲 : 卢广仲\n[00:47.82]曾...曾经在我眼前\n[01:26.39]却又消失不见\n[01:33.00]这是今天的第六遍\n[01:43.83]电影里的配乐\n[01:48.58]好像你的双眼\n[01:53.89]我爱你 快回到 我身边\n[02:20.01]\n[02:29.34]好不好 好不好 好不好\n[02:31.89]答案没有什么好不好\n[02:34.15]不知道 不知道 不知道\n[02:37.09]不知道是什么好预兆\n[02:39.27]好不好 好不好 好不好\n[02:42.09]答答答答答答答答答\n[02:44.41]不知道 不知道 不知道\n[02:47.24]不知道是什么好预兆\n[02:49.35]太阳公公出来了\n[02:54.65]他对我呀笑呀笑\n[02:59.77]我爱你 你知不知道\n[03:06.93]曾经在我眼前\n[03:09.59]却又消失不见\n[03:12.09]这是今天的第六遍\n[03:17.25]电影里的配乐\n[03:19.89]好像你的双眼\n[03:22.09]我爱你 快回到 我身边\n[03:35.52]\n[03:38.68]好不好 好不好 好不好\n[03:41.18]答答答答答答答答答\n[03:43.57]不知道 不知道 不知道\n[03:46.39]不知道是什么好预兆\n[03:48.59]太阳公公出来了\n[03:53.54]他对我呀笑呀笑\n[03:58.88]我爱你 你知不知道\n[04:05.78]曾经在我眼前\n[04:08.49]却又消失不见\n[04:11.04]这是今天的第六遍\n[04:16.20]电影里的配乐\n[04:18.88]好像你的双眼\n[04:21.09]我爱你 快回到 我身边\n[04:40.60]\n[05:08.61]太阳公公出来了\n[05:12.85]他对我呀笑呀笑\n[05:18.19]我爱你 你知不知道\n[05:25.57]曾经在我眼前\n[05:28.10]却又消失不见\n[05:30.64]我不要比赛交白卷\n[05:35.81]电影里的配乐\n[05:38.34]好像你的双眼\n[05:40.50]我爱你 快回到\n[05:45.85]我爱你 快回到\n[05:51.05]我爱你 快回到 我身边\n",
"url": "http://music.163.com/song/media/outer/url?id=26601421.mp3",
"pic": "http://p1.music.126.net/w-bF0DCMxMcESCBYXJmlDw==/4439827952972968.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=526935815",
"songid": 526935815,
"title": "อยากรู้...แต่ไม่อยากถาม",
"author": "Pop Pongkool",
"lrc": "[00:00.00] 作词 : วิวัฒน์ ฉัตรธีรภาพ\n[00:01.00] 作曲 : อพิสิษฎ์ ณ ตะกั่วทุ่ง\n[00:16.88]ได้ชิดเพียงลมหายใจ\n[00:20.23]แค่ได้ใช้เวลาร่วมกัน\n[00:23.62]แค่เพื่อนเท่านั้น\n[00:26.30]แต่มันเกินห้ามใจ\n[00:31.84]ที่ค้างในความรู้สึก\n[00:35.35]ว่าลึกๆเธอคิดยังไง\n[00:38.59]รักเธอเท่าไร\n[00:41.39]แต่ไม่เคยพูดกัน\n[00:45.99]อะไรที่อยู่ในใจก็เก็บเอาไว้\n[00:53.77]มันมีความสุขแค่นี้ก็ดีมากมาย\n[01:01.06]เธอจะมีใจหรือเปล่า\n[01:04.96]เธอเคยมองมาที่ฉันหรือเปล่า\n[01:09.48]ที่เราเป็นอยู่นั้นคืออะไร\n[01:16.28]เธอจะมีใจหรือเป\n[01:19.94]มันคือความจริงที่ฉันอยากรู้ติดอยู่ในใจ\n[01:25.20]แต่ไม่อยากถาม\n[01:28.22]กลัวว่าเธอเปลี่ยนไป\n[01:35.80]ไม่ถามยังดีซะกว่า\n[01:38.86]เพราะฉันรู้ถ้าเราถามกัน\n[01:42.40]กลัวคำๆนั้น อาจทำร้ายหัวใจ\n[01:49.88]อะไรที่อยู่ในใจก็เก็บเอาไว้\n[01:57.27]มันมีความสุขแค่นี้ก็ดีมากมาย\n[02:04.87]เธอจะมีใจหรือเปล่า\n[02:08.71]เธอเคยมองมาที่ฉันหรือเปล่า\n[02:13.35]ที่เราเป็นอยู่นั้นคืออะไร\n[02:19.97]เธอจะมีใจหรือเปล่า\n[02:23.58]มันคือความจริงที่ฉันอยากรู้ติดอยู่ในใจ\n[02:28.76]แต่ไม่อยากถาม\n[02:32.10]กลัวรับมันไม่ไหว\n[02:49.84]เธอจะมีใจหรือเปล่า\n[02:53.62]มันคือความจริงที่ฉันอยากรู้ติดอยู่ในใจ\n[02:58.92]แต่ไม่อยากถาม\n[03:01.97]กลัวรับมันไม่ไหว\n",
"url": "http://music.163.com/song/media/outer/url?id=526935815.mp3",
"pic": "http://p1.music.126.net/YHJf5d-3r4CdhVm1ZsNlrw==/109951163095371221.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=1829162380",
"songid": 1829162380,
"title": "Ayasa绚沙-Ayasa绚沙-我爱你(小提琴虹 remix",
"author": "violin琪虹",
"lrc": "",
"url": "http://music.163.com/song/media/outer/url?id=1829162380.mp3",
"pic": "http://p1.music.126.net/vsrq8MI6dWo_mVxY1Vzyow==/109951165806756872.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=1988565276",
"songid": 1988565276,
"title": "我爱你",
"author": "法老,MC脏脏",
"lrc": "[00:00.000] 作词 : 法老/MC脏脏\n[00:01.000] 作曲 : 法老/MC脏脏\n[00:02.521]混音:隆历奇\n[00:04.640]编曲:隆历奇\n[00:07.295]录音:杨秋儒\n[00:09.693]我好爱你\n[00:20.851]我此刻不会再隐瞒你\n[00:22.442]在开始恋情之前我说\n[00:24.300]我没资格去评判你\n[00:25.362]你那么美丽\n[00:26.422]从头到尾散发魅力\n[00:28.281]我想和你环游世界一起去看看北极\n[00:30.404]你说 我会一直陪你陪你 一切的习惯都随你\n[00:33.335]在酒吧的前厅 窗外又开始响起雷雨\n[00:35.722]我们走出户外 在雨中开始漫长的接吻\n[00:38.641]两个不羁的人格 决定一起对世界泄愤\n[00:41.030]自由是我们的信条\n[00:42.357]心跳是信号\n[00:43.694]一起去滑板摔出青泡\n[00:45.286]但只要两个人浸泡在一起那温柔的就像摔进天堂的音道\n[00:49.002]让我们互相眼里只有彼此 把所有荷尔蒙都引爆\n[00:52.186]但世界末日我们也会分开\n[00:54.045]因为宇宙塌了下来 所以我要去为你撑开\n[00:56.707]火车轨道 只是为了我们存在\n[00:59.362]我们马上出发 就让不相干的人全滚蛋\n[01:02.016]在一刹那woman\n[01:03.115]特别的话woman\n[01:04.178]你是我见过镜头里最完美那woman\n[01:06.833]在一刹那woman\n[01:08.160]特别的话woman\n[01:09.487]我一定不会认错那就是爱woman\n[01:12.138](那就是爱)越过山河和你拥吻\n[01:15.071]这就是爱in this moment\n[01:17.191]要多伟大的爱才能把爱这个字写的工整\n[01:20.110]我可以停止呼吸\n[01:21.437]但我不能停止爱你 woman\n[01:22.766]你说你爱听摇滚\n[01:24.623]可居然陪我喜欢听说唱\n[01:25.950]你说这世界的音乐就像动物多种多样\n[01:28.349]别藐视\n[01:29.144]看海岸路边的礁石\n[01:30.472]麋鹿在天际消失\n[01:31.800]当我拉着你的手时 自然的十指交织\n[01:33.656]我们和所有当地艺术家都成为了朋友\n[01:36.576]或许他们没有成就\n[01:37.913]但从未忘记奋斗\n[01:39.242]就像现在并非旺季\n[01:40.832]我们却牵手在海边贩卖我们的手工制品\n[01:43.488]青青子衿,悠悠我心\n[01:45.078]你美的好像来自诗经\n[01:46.936]你却说为我感到有文化而吃惊\n[01:48.804]我生气地在后面追着你划过了海岸线\n[01:51.458]转瞬我们就在呼伦贝尔的羊群里面 过夜\n[01:54.111]每次贴近你 我都感到大脑与呼吸 脱节\n[01:56.768]我好爱你 爱到想把此刻的时间 全部终结\n[01:59.429]我不关心火星是否有水 只关心这个冬天\n[02:02.085]我找了好几辈子的人就 站在我的身边\n[02:04.738]在一刹那woman\n[02:05.535]特别的话woman\n[02:06.874]你是我见过镜头里最完美那woman\n[02:09.530]在一刹那woman\n[02:10.866]特别的话woman\n[02:12.192]我一定不会认错那就是爱woman\n[02:14.582](那就是爱)越过山河和你拥吻\n[02:17.503]这就是爱in this moment\n[02:19.623]要多伟大的爱才能把爱这个字写的工整\n[02:22.553]我可以停止呼吸\n[02:23.879]但我不能停止爱你 woman\n[02:25.472]我们搭建了两个人的家庭\n[02:27.328]建在房车里的咖啡厅\n[02:28.922]让那些忙碌的人 带来故事由我们聆听\n[02:31.350]我说再也不回城市\n[02:33.139]我想要自由真实\n[02:34.200]我想和你一起老去化成分子\n[02:36.067]那暖熏的风暴将把我们\n[02:37.926]卷上天空\n[02:38.723]降下雨水\n[02:39.253]滋润雄伟的天山最高尖峰\n[02:41.377]这不就是我们所追求的吗\n[02:42.969]哪怕这臭水沟 连喝水都会 硌牙\n[02:45.359]我们也做相依伴的荷花\n[02:46.960]我看着她的眼睛\n[02:48.300]语气坚定\n[02:49.098]她却 突然闪烁地像是画布上的剪影\n[02:51.485]开始变形\n[02:52.282]奇怪的光线开始交织\n[02:53.874]我大喊她的名字\n[02:54.934]她只是微笑 直到变成了蝴蝶消失\n[02:57.059]再睁开眼睛 是泪水 是害怕地把呼吸屏住\n[03:00.252]是黑暗里找她的手却摸到件工作服\n[03:03.173]忙碌的窗外 没有爱情\n[03:04.764]有混凝土 有风声在呼 有东方 明珠\n[03:07.153]在一刹那woman\n[03:08.225]特别的话woman\n[03:09.552]你是我见过镜头里最完美那woman\n[03:12.207]在一刹那woman\n[03:13.531]特别的话woman\n[03:14.596]我一定不会认错那就是爱woman\n[03:17.287](那就是爱)越过山河和你拥吻\n[03:19.940]这就是爱in this moment\n[03:22.065]要多伟大的爱才能把爱这个字写的工整\n[03:25.449]我可以停止呼吸\n[03:26.510]但我不能停止爱你\n[03:33.110]监制:邓思楚\n[03:35.527]出品公司AYO\n",
"url": "http://music.163.com/song/media/outer/url?id=1988565276.mp3",
"pic": "http://p1.music.126.net/WEOaWIg8WAG_kBhmAx7zbA==/109951168688783089.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=68378",
"songid": 68378,
"title": "我爱你",
"author": "新裤子",
"lrc": "[00:00.000] 作词 : 新裤子\n[00:00.193] 作曲 : 新裤子\n[00:00.386] 编曲 : 新裤子\n[00:00.580]我爱你,我总怕见不到你\n[00:07.650]看着你,我要把全部给你\n[00:14.120]纷纷乱乱的记忆 无拘无束的哭泣\n[00:21.380]反反复复的想你 我终于失去你\n[00:27.530]分离 和你在一起\n[00:32.700]\n[00:34.370]KeyBoard Solo\n[01:03.300]我爱你,我总怕见不到你\n[01:09.940]看着你,我要把全部给你\n[01:16.570]纷纷乱乱的记忆 无拘无束的哭泣\n[01:23.710]反反复复的想你 我终于失去你\n[01:30.360]分离 和你在一起\n[01:37.990]\n[01:38.180]Music新裤子我爱你\n[01:51.930]我爱你,我总怕见不到你\n[01:58.880]看着你,我要把全部给你\n[02:05.400]纷纷乱乱的记忆 无拘无束的哭泣\n[02:12.530]反反复复的想你 我终于失去你\n[02:18.980]分离 和你在一起\n[02:25.760]Music\n[40:39.990]\n",
"url": "http://music.163.com/song/media/outer/url?id=68378.mp3",
"pic": "http://p1.music.126.net/PHmfQN1ssTM56sjHU9AuSQ==/86861418607081.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=1459498368",
"songid": 1459498368,
"title": "我爱你(抖音完整版)(翻自 卢广仲)",
"author": "徐心愉",
"lrc": "[00:00.000] 作词 : 卢广仲/群可/邢书郡\n[00:01.000] 作曲 : 卢广仲/邢书郡\n[00:02.000] 编曲 : 王中易\n[00:07.230] 制作人:王中易\n[00:08.660] 吉他:陈柏彤\n[00:09.819] 和声:栗可\n[00:11.076] 混音:王宇呈/王中易\n[00:12.674] 制作团队:伊格赛听\n[00:22.114] 曾经在我眼前 却又消失不见\n[00:27.352] 这是今天的第六遍\n[00:32.413] 电影里的配乐 好像你的双眼\n[00:37.394] 我爱你 快回到 我身边\n[00:42.751] 曾经在我眼前 却又消失不见\n[00:47.680] 这是今天的第六遍\n[00:52.794] 电影里的配乐 好像你的双眼\n[00:57.495] 我爱你 快回到 我身边\n[01:03.540] One Two Three\n[01:06.293] 有没有 这样的一封信\n[01:11.319] 上面 记载着你的心情\n[01:16.440] 有没有 这样的一首歌\n[01:21.460] 唱 出人们的悲欢离合\n[01:26.526] 有没有 这样的一场电影\n[01:31.425] 能让你我 触景伤情\n[01:35.629] O mY BABY\n[01:37.964] 原来你早已经 带走了我的心\n[01:46.320] 听到爱听的音乐 想起熟悉的你\n[01:48.646] 快要陌生的轴距 可能触景生情\n[01:51.142] 哈 我想我 都不属于自己\n[01:53.854] 或许 自己的心情 不再删除那记忆\n[01:56.539] 看不见你的时候 勉强的我好累\n[01:58.906] 从第一眼见到你的时候 就感觉很对\n[02:01.790] 那么也请你 给我一次机会\n[02:04.171] 不要让我每天 带着安慰入睡\n[02:06.716] 在我眼前 却又消失不见\n[02:10.927] 这是今天的第六遍\n[02:16.232] 电影里的情节 好像你的双眼\n[02:20.636] 我爱你 快回到 我身边\n[02:26.707] 在我眼前 却又消失不见\n[02:31.121] 这是今天的第六遍\n[02:36.241] 电影里的配乐 好像你的双眼\n[02:41.051] 我爱你 快回到 我身边\n[03:06.993] 听到爱听的音乐 想起熟悉的你\n[03:09.268] 快要陌生的轴距 可能触景生情\n[03:11.872] 哈 我想我 都不属于自己\n[03:14.327] 或许 自己的心情 不再删除那记忆\n[03:17.339] 看不见你的时候 勉强的我好累\n[03:19.799] 从第一眼见到你的时候 就感觉很对\n[03:22.422] 那么也请你 给我一次机会\n[03:24.983] 不要让我每天 带着安慰入睡\n[03:27.535] 在我眼前 却又消失不见\n[03:31.766] 这是今天的第六遍\n[03:36.988] 电影里的情节 好像你的双眼\n[03:41.508] 我爱你 快回到 我身边\n[03:47.572] 在我眼前 却又消失不见\n[03:52.030] 这是今天的第六遍\n[03:57.088] 电影里的配乐 好像你的双眼\n[04:01.859] 我爱你 快回到 我身边\n",
"url": "http://music.163.com/song/media/outer/url?id=1459498368.mp3",
"pic": "http://p1.music.126.net/HRUorxaQMCzcQh89nEe6YQ==/109951165100677013.jpg?param=300x300"
},
{
"type": "netease",
"link": "http://music.163.com/#/song?id=2000142344",
"songid": 2000142344,
"title": "我爱你-程佳佳",
"author": "打造完美音乐",
"lrc": "[00:00.00] 作词 : 打造完美音乐\n[00:00.00] 作曲 : 打造完美音乐\n[00:00.00] 编曲 : 打造完美音乐\n[00:00.00]那么也请你给我一次机会\n[00:08.46]不要让我每天带着安慰入睡\n[00:10.91]在我眼前\n[00:12.82]却又消失不见\n[00:15.39]这是今天的第六遍\n[00:20.58]电影里的情节\n[00:23.05]好像你的双眼\n[00:25.38]我爱你 快回到 我 身边\n[00:31.22]oh~在我眼前\n[00:33.27]却又消失不见\n[00:35.84]这是今天的第六遍\n[00:40.87]电影里的情节\n[00:43.48]好像你的双眼\n[00:45.74]我爱你 快回到 我身边\n",
"url": "http://music.163.com/song/media/outer/url?id=2000142344.mp3",
"pic": "http://p1.music.126.net/-XOM0P5Jw7ELN5ufko05lw==/109951167900715199.jpg?param=300x300"
}
],
"code": 200,
"error": ""
}
}
music_id_json = music_id_json['data']
print(music_id_json)
save_search_music(music_id_json)

62
server/user_server.py Normal file
View File

@ -0,0 +1,62 @@
import csv
import pymysql
import untils
import hashlib
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
mysql_database = untils.mysql_database
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password, port=mysql_port, charset="utf8",
database=mysql_database)
# md5加密
def md5(password):
md5 = hashlib.md5()
md5.update(password.encode("utf-8"))
return md5.hexdigest()
def create_user(username, password):
password = md5(password)
try:
with con.cursor() as cur:
# 判断用户是否存在
if cur.execute("SELECT * FROM User WHERE username = %s", (username,)):
return {"status": 400, "msg": "User Already Exists"}
# 创建用户
sql = """
INSERT INTO User (username, password) VALUES (%s, %s);
"""
cur.execute(sql, (username, password))
con.commit()
return {"status": 200, "msg": "Success Create User"}
except Exception as e:
con.rollback()
print(e)
return {"status": 400, "msg": "Failed Create User"}
def login_user(username, password):
password = md5(password)
try:
with con.cursor() as cur:
# 判断用户是否存在
if cur.execute("SELECT * FROM User WHERE username = %s", (username,)):
# 判断密码是否正确
if cur.execute("SELECT * FROM User WHERE username = %s AND password = %s", (username, password)):
return {"status": 200, "msg": "Success Login"}
else:
return {"status": 400, "msg": "Password Error"}
else:
return {"status": 400, "msg": "User Not Exists"}
except Exception as e:
print(e)
return {"status": 400, "msg": "Failed Login"}

View File

@ -1,64 +0,0 @@
import csv
def register(username, password):
# 读取现有的用户信息
existing_users = read_users()
# 检查用户名是否已存在
if username in existing_users:
return False, "Username already exists."
# 添加新用户信息
new_user = {"username": username, "password": password}
existing_users[username] = new_user
# 将用户信息保存到CSV文件
save_users(existing_users)
return True, "Registration successful."
def login(username, password):
# 读取用户信息
existing_users = read_users()
# 验证用户名和密码
user = existing_users.get(username)
if user and user["password"] == password:
return True, "Login successful."
return False, "Invalid credentials."
def read_users():
# 从CSV文件中读取用户信息
users = {}
try:
with open("data/users.csv", "r", newline="") as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
users[row["username"]] = {"username": row["username"], "password": row["password"]}
except FileNotFoundError:
pass # 如果文件不存在,说明还没有注册用户,返回一个空字典
return users
def save_users(users):
# 将用户信息保存到CSV文件
with open("data/users.csv", "w", newline="") as csvfile:
fieldnames = ["username", "password"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for user in users.values():
writer.writerow(user)
# 测试注册功能
# register("user1", "password1")
# register("user2", "password2")
# 测试登录功能
# login_success, message = login("user1", "password1")
# print(message) # 输出Login successful.
#
# login_success, message = login("user3", "password3")
# print(message) # 输出Invalid credentials.

View File

@ -0,0 +1,38 @@
# 导入pymysql
import pymysql
import untils
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
mysql_database = untils.mysql_database
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password,port=mysql_port, charset="utf8", database=mysql_database)
# 创建游标对象
cur = con.cursor()
# 编写创建表的sql
# UserPlayList是用户的歌单表关联用户表
sql = """
CREATE TABLE UserPlayList (
playlist_id INT AUTO_INCREMENT PRIMARY KEY,
playlist_name VARCHAR(255) NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES User(user_id)
);
"""
try:
# 执行创建表的sql
cur.execute(sql)
print("创建成功")
# 关闭游标连接
cur.close()
# 关闭数据库连接
con.close()
except Exception as e:
print(e)
print("创建表失败")

32
sql/create_database.py Normal file
View File

@ -0,0 +1,32 @@
# 导入pymysql
import pymysql
import untils
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password,port=mysql_port, charset="utf8")
# 创建游标对象
cur = con.cursor()
# 编写创建表的sql
sql = """
create database music_sql;
"""
try:
# 执行创建表的sql
cur.execute(sql)
print("创建数据库成功")
# 关闭游标连接
cur.close()
# 关闭数据库连接
con.close()
except Exception as e:
print(e)
print("创建表失败")

44
sql/create_music.py Normal file
View File

@ -0,0 +1,44 @@
# 导入pymysql
import pymysql
import untils
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
mysql_database = untils.mysql_database
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password,port=mysql_port, charset="utf8", database=mysql_database)
# 创建游标对象
cur = con.cursor()
# 编写创建表的sql
sql = """
CREATE TABLE Music (
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(50),
link VARCHAR(255),
songid INT,
title VARCHAR(255),
author VARCHAR(255),
lrc TEXT,
url VARCHAR(255),
pic VARCHAR(255),
UNIQUE KEY unique_songid (songid)
);
"""
try:
# 执行创建表的sql
cur.execute(sql)
print("创建成功")
# 关闭游标连接
cur.close()
# 关闭数据库连接
con.close()
except Exception as e:
print(e)
print("创建表失败")

View File

@ -0,0 +1,39 @@
# 导入pymysql
import pymysql
import untils
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
mysql_database = untils.mysql_database
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password,port=mysql_port, charset="utf8", database=mysql_database)
# 创建游标对象
cur = con.cursor()
# 编写创建表的sql
# PlaylistSong是歌单的歌曲表关联歌单表和歌曲表
sql = """
CREATE TABLE PlaylistSong (
id INT AUTO_INCREMENT PRIMARY KEY,
playlist_id INT NOT NULL,
songid INT NOT NULL,
FOREIGN KEY (playlist_id) REFERENCES UserPlayList(playlist_id),
FOREIGN KEY (songid) REFERENCES Music(songid)
);
"""
try:
# 执行创建表的sql
cur.execute(sql)
print("创建成功")
# 关闭游标连接
cur.close()
# 关闭数据库连接
con.close()
except Exception as e:
print(e)
print("创建表失败")

39
sql/create_user.py Normal file
View File

@ -0,0 +1,39 @@
# 导入pymysql
import pymysql
import untils
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
mysql_database = untils.mysql_database
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password,port=mysql_port, charset="utf8", database=mysql_database)
# 创建游标对象
cur = con.cursor()
# 编写创建表的sql
sql = """
CREATE TABLE User (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
date_joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
"""
try:
# 执行创建表的sql
cur.execute(sql)
print("创建成功")
# 关闭游标连接
cur.close()
# 关闭数据库连接
con.close()
except Exception as e:
print(e)
print("创建表失败")

2
test/key_test.py Normal file
View File

@ -0,0 +1,2 @@
import os

23
test/sql_test.py Normal file
View File

@ -0,0 +1,23 @@
# 导入pymysql
import pymysql
import untils
mysql_host = untils.mysql_host
mysql_port = untils.mysql_port
mysql_user = untils.mysql_user
mysql_password = untils.mysql_password
mysql_database = untils.mysql_database
# 创建连接
con = pymysql.connect(host=mysql_host, user=mysql_user, password=mysql_password,port=mysql_port, charset="utf8", database=mysql_database)
# 创建游标对象
cursor = con.cursor()
email = "1264204425@qq.com"
# 编写创建表的sql
cursor.execute("SELECT * FROM User WHERE email = %s", (email,))
user = cursor.fetchone()
print(user)

7
untils.py Normal file
View File

@ -0,0 +1,7 @@
import pymysql
mysql_host = "nas.icezhb.work"
mysql_port = 12345
mysql_user = "root"
mysql_password = "ICEzhb0000@"
mysql_database = "music_sql"