diff --git a/api.py b/api.py index 36cf7be..538f3d8 100644 --- a/api.py +++ b/api.py @@ -1,11 +1,16 @@ import fastapi -import os +from fastapi.security import OAuth2PasswordRequestForm +from fastapi_login.exceptions import InvalidCredentialsException +from datetime import timedelta import requests import uvicorn +from fastapi import Depends from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from service.userservice import * -from service.rank_data import * +from fastapi_login import LoginManager +from server.user_server import * +from server.rank_data import * +from server.music_server import * env = os.environ app = FastAPI() @@ -19,58 +24,135 @@ app.add_middleware( 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") -async def register(username: str = fastapi.Form(..., description="用户名"), - password: str = fastapi.Form(..., description="密码")): +@app.post("/user/register") +async def user_register( + username: str = fastapi.Query(..., description="用户名"), + password: str = fastapi.Query(..., description="密码"), + email: str = fastapi.Query(None, description="邮箱")): """ - 注册新用户 - :param username: 用户名 - :param password: 密码 - :return: 注册结果 + 注册 + :param username: + :param password: + :param email: + :return: """ - # 读取现有的用户信息 - existing_users = read_users() - - # 检查用户名是否已存在 - 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": "注册成功"} + create_user(username, password) + # 获取Token + token_info = get_token(OAuth2PasswordRequestForm(username=username, password=password)) + return {"success": True, "message": "注册成功", "token": token_info} # 登陆 -@app.post("/login") -async def login(username: str = fastapi.Form(..., description="用户名"), - password: str = fastapi.Form(..., description="密码")): +@app.post("/user/login") +async def user_login( + username: str = fastapi.Query(..., description="用户名"), + password: str = fastapi.Query(..., description="密码")): """ - 用户登录 - :param username: 用户名 - :param password: 密码 - :return: 登录结果 + 登陆并获取Token + :param username: + :param password: + :return: """ - # 读取用户信息 - existing_users = read_users() - - # 验证用户名和密码 - user = existing_users.get(username) - if user and user["password"] == password: - return {"success": True, "message": "登录成功"} - return {"success": False, "message": "用户名或密码错误"} + # 请求auth/token接口获取token + token_info = get_token(OAuth2PasswordRequestForm(username=username, password=password)) + login_info = user_login(username, password) + if login_info: + return {"success": True, "message": "登陆成功", "token": token_info} + else: + return {"success": False, "message": "登陆失败"} # 榜单获取 @app.get("/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: 19723756 云音乐飙升榜 @@ -82,7 +164,7 @@ async def get_rank( 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" + " 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}" @@ -90,57 +172,26 @@ async def get_rank( response = requests.get(url, headers=headers) # 如果请求code为-447 那么继续返回json 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: # 检测是否含有带rank_id的缓存文件 cached_data = read_cache(rank_id) if cached_data: - return {"message": "本地JSON数据", "data": cached_data} + return {"message": "local json data", "data": cached_data} + # 将榜单数据写入缓存文件 write_cache(rank_id, response.json()) print(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") async def search_song_by_name( - name: str = fastapi.Query(..., description="歌曲名称")): + name: str = fastapi.Query(..., description="歌曲名称"), + # current_user=Depends(manager.get_current_user) +): payload = { "input": name, "filter": "name", @@ -187,9 +238,11 @@ async def search_song_by_name( # 根据歌曲id搜索歌曲 @app.get("/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 = { - "input": id, + "input": music_id, "filter": "id", "type": "netease", # netease, tencent, kugou, xiami, baidu "page": 1 @@ -219,13 +272,20 @@ async def search_song_by_id( if response.status_code == 200: # Parse the response JSON data data = response.json() + print(data) + try: + save_search_music(data) + except Exception as e: + print(e) return {"message": "success", "data": data} else: print(f"Failed to get data. Status code: {response.status_code}") return {"message": "failed", "data": []} + + if __name__ == '__main__': 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) diff --git a/data/users.csv b/data/users.csv deleted file mode 100644 index 1f6e851..0000000 --- a/data/users.csv +++ /dev/null @@ -1,4 +0,0 @@ -username,password -user1,password1 -user2,password2 -username1,123456 diff --git a/requirements.txt b/requirements.txt index 7487cd0..f6f8ca2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 anyio==3.7.1 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 +blinker==1.6.2 bs4==0.0.1 -certifi==2023.7.22 -charset-normalizer==3.2.0 -click==8.1.6 +certifi==2023.5.7 +charset-normalizer==3.1.0 +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 -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 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 +httpcore==0.17.3 +httpx==0.24.1 +huggingface-hub==0.16.4 idna==3.4 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 -pydantic==2.1.1 -pydantic_core==2.4.0 +passlib==1.7.4 +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 +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 +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 +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-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 +sortedcontainers==2.4.0 soupsieve==2.4.1 +SQLAlchemy==1.4.49 starlette==0.27.0 +termcolor==2.3.0 +threadpoolctl==3.2.0 +tokenizers==0.13.3 +toolz==0.12.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 +uc-micro-py==1.0.2 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 +websocket==0.2.1 +websocket-client==0.57.0 websockets==10.4 -zipp==3.16.2 -python-multipart==0.0.6 +Werkzeug==2.3.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 diff --git a/service/id_search.py b/server/id_search.py similarity index 100% rename from service/id_search.py rename to server/id_search.py diff --git a/server/music_server.py b/server/music_server.py new file mode 100644 index 0000000..b2f8b8b --- /dev/null +++ b/server/music_server.py @@ -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 can’t 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 can’t 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) diff --git a/service/name_search.py b/server/name_search.py similarity index 100% rename from service/name_search.py rename to server/name_search.py diff --git a/service/rank_data.py b/server/rank_data.py similarity index 100% rename from service/rank_data.py rename to server/rank_data.py diff --git a/service/soar_rank.py b/server/soar_rank.py similarity index 100% rename from service/soar_rank.py rename to server/soar_rank.py diff --git a/server/user_server.py b/server/user_server.py new file mode 100644 index 0000000..0cf8b1b --- /dev/null +++ b/server/user_server.py @@ -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"} + diff --git a/service/userservice.py b/service/userservice.py deleted file mode 100644 index 4c0c2c6..0000000 --- a/service/userservice.py +++ /dev/null @@ -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. diff --git a/sql/create_UserPlayList.py b/sql/create_UserPlayList.py new file mode 100644 index 0000000..4e83572 --- /dev/null +++ b/sql/create_UserPlayList.py @@ -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("创建表失败") diff --git a/sql/create_database.py b/sql/create_database.py new file mode 100644 index 0000000..fc2b184 --- /dev/null +++ b/sql/create_database.py @@ -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("创建表失败") + diff --git a/sql/create_music.py b/sql/create_music.py new file mode 100644 index 0000000..a81b6c4 --- /dev/null +++ b/sql/create_music.py @@ -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("创建表失败") diff --git a/sql/create_playlistsong.py b/sql/create_playlistsong.py new file mode 100644 index 0000000..c41bf5c --- /dev/null +++ b/sql/create_playlistsong.py @@ -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("创建表失败") diff --git a/sql/create_user.py b/sql/create_user.py new file mode 100644 index 0000000..b51f1f8 --- /dev/null +++ b/sql/create_user.py @@ -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("创建表失败") + diff --git a/test/key_test.py b/test/key_test.py new file mode 100644 index 0000000..b48e5a0 --- /dev/null +++ b/test/key_test.py @@ -0,0 +1,2 @@ +import os + diff --git a/test/sql_test.py b/test/sql_test.py new file mode 100644 index 0000000..25a005f --- /dev/null +++ b/test/sql_test.py @@ -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) + + diff --git a/untils.py b/untils.py new file mode 100644 index 0000000..90209be --- /dev/null +++ b/untils.py @@ -0,0 +1,7 @@ +import pymysql + +mysql_host = "nas.icezhb.work" +mysql_port = 12345 +mysql_user = "root" +mysql_password = "ICEzhb0000@" +mysql_database = "music_sql" \ No newline at end of file