import os
import random
from datetime import datetime
from django.http import StreamingHttpResponse, JsonResponse
from rest_framework.views import APIView
from music_project import settings
from music_project.home.index.models import Singer, Music, SongList, SysDictQuery
from music_project.home.mine.models import MineSistenList
from music_project.home.user.models import UserInformation
from music_project.util.res import SerMusic, SerSinger, \
SerResponseMusic, SerSongList, SerReSongList, SerHotSonglist, SerMineSistenList
from music_project.util.util import response_failure, response_success, GetPage, TimeIdentifcation, Pagina_success, \
formatSize
from music_project.util.util import upload_music, upload_image, \
upload_lrc, upload_Singerimage, UploadImg, file_iterator
# Create your views here.
# json问题
def set_default(obj):
if isinstance(obj, set):
return list(obj)
raise TypeError
# 判断是否存在
def isT(lis, data):
for i in lis:
if i == data:
return False
return True
# 修改音乐LLLL
class Modify(APIView):
# 修改音乐
def post(self,request):
newpath = ''
try:
data = request.data
musicId = data.get('id')
mus = data.get('url')
music = Music.objects.filter(id=int(musicId)).values('url').first()
if music is not None:
url = music.get('url')
print("8" * 80)
if os.path.exists(url):
newpath = upload_music(mus)
print("8" * 80,newpath)
Ok = Music.objects.filter(id=int(musicId)).update(url=newpath)
if Ok:
os.remove(url)
print("老歌曲已经移除url", url)
return response_success(code=200,message='删除成功',
data={'url':newpath})
else:
os.remove(newpath)
print("没有更新")
return response_failure(code=400,message="失败")
else:
return response_failure(code=400,message="没有这首歌")
else:
return response_failure(code=400, message="没有这首歌")
except Exception as e:
print(e)
if newpath:
os.remove(newpath)
return response_failure(code=500)
# 查询歌曲大小
def get(self,request):
try:
data = request.GET
word = data.get('word')
mus = Music.objects.filter(musicName__contains=word).first()
if mus:
dat = SerResponseMusic(mus)
size = formatSize(mus.url)
return response_success(code=200,data={'size':size,'data':dat.data})
else:
response_failure(code=404,message="没有找到")
except Exception as e:
print(e)
return response_failure(code=500)
# 上传音乐
class Upmusic(APIView):
# 修改歌曲文件
def put(self, request):
try:
data = request.data
if data:
id = data.get('id')
if id:
pa = Music.objects.filter(id=int(id)).first()
if pa is not None:
res = SerMusic(pa, data=data)
if res.is_valid():
res.save()
return response_success(code=200, message='保存成功')
else:
return response_failure(code=400, message='保存失败')
else:
return response_failure(code=404, message='没有找到该歌曲')
else:
return response_failure(code=400, message='缺少参数')
except Exception as e:
print(e)
return response_failure(code=500)
# 上传音乐文件
def post(self, request):
img = ''
url = ''
lrc_path = ''
try:
data = request.data
music_name = data.get('music_name')
if data:
singerName = data.get('singername')
nameId = ''
singername = str(singerName).split('&')
for i in range(len(singername)):
id = Singer.objects.filter(singer=singername[i]).first()
if id is None:
return response_failure(code=404, message='该{}歌手还没有注册'.format(singername[i]))
if i == len(singername) - 1:
nameId += str(id.id)
else:
nameId += str(id.id) + ','
isName = Music.objects.filter(musicName=music_name, singerId=nameId).first()
if isName is not None:
return response_failure(code=200, message='该歌曲与歌手已添加')
url = upload_music(data.get('url'))
if url == '':
return response_failure(code=400, message='歌曲文件格式错误,ape,mp3,flac')
img = upload_image(data.get('img_url'))
if img == '':
return response_failure(code=400, message='歌曲图片格式错误,jpg,png')
lrc = data.get('lyrics')
if lrc != 'undefined':
lrc_path = upload_lrc(lrc)
if lrc_path == '':
return response_failure(code=400, message='歌词格式错误,lrc,txt')
saveData = {
'singerId': nameId,
'musicName': music_name,
'brief': data.get('brief'),
'type': str(data.get('type')),
'date': str(datetime.now()),
'url': url,
'img_url': img,
'count': 0,
'lyrics': lrc_path
}
res = SerMusic(data=saveData)
if res.is_valid():
res.save()
return response_failure(code=200)
else:
print(res.errors)
if img:
os.remove(img)
if url:
os.remove(url)
if lrc_path:
os.remove(lrc_path)
return response_failure(code=400, message=res.errors)
else:
if img:
os.remove(img)
if url:
os.remove(url)
if lrc_path:
os.remove(lrc_path)
return response_failure(code=400)
except Exception as e:
print(e)
if img:
os.remove(img)
if url:
os.remove(url)
if lrc_path:
os.remove(lrc_path)
return response_failure(code=505, message='上传文件缺少,图片以及歌曲文件必须有,歌词可无')
# 歌手添加
class Upsinger(APIView):
def post(self, request):
url = ''
try:
data = request.data
if data:
singer = data.get('singer')
if singer == 'undefined':
return response_failure(code='歌手名没有填写')
name = Singer.objects.filter(singer=singer).first()
if name:
return response_failure(code=400, message='该歌手已注册')
else:
img = data.get('img')
if img != 'undefined':
url = upload_Singerimage(img)
if url == '':
return response_failure(code=500, message='图片保存错误')
else:
return response_failure(code=400, message='图片没有添加')
save_data = {
'singer': singer,
'date': data.get('date') if data.get('date') else '',
'brief': data.get('brief') if data.get('brief') else '',
'create_date': str(datetime.now()),
'url': url,
'date_type': int(data.get('type')) if data.get('type') else '',
}
res = SerSinger(data=save_data)
if res.is_valid():
res.save()
return response_success(code=200, message='添加成功')
else:
print(res.errors)
if url:
os.remove(url)
return response_failure(code=400, message='保存失败,检查时间或文件')
except Exception as e:
print(e)
if url:
os.remove(url)
response_failure(code=500)
# 搜索音乐功能
class SearchMusic(APIView):
def get(self, request):
try:
data = request.GET
word = data.get('word')
page = data.get('page')
if page is None:
return response_failure(code=400, message='参数缺失')
if word:
count = 0
resMusic = []
resMusicData = ''
if word == '国风' or word == '流行' or word == '经典' or word == '摇滚' or \
word == '轻音乐' or word == '日韩' or word == '欧美' or \
word == '网络' or word == '热门' or \
word == '伤感' or word == '其他':
ty = SysDictQuery.objects.filter(dict_type='type', dict_label=word).values('dict_sort').first()
type = ty.get('dict_sort')
musData = Music.objects.filter(type__contains=type).order_by('-count')
da, count = GetPage(musData, int(page), 20)
resMusicData = SerResponseMusic(da, many=True)
else:
musicData = Music.objects.filter(musicName__contains=word).first()
if musicData is not None:
musicData = Music.objects.filter(musicName__contains=word).order_by('-count')
for j in musicData:
resMusic.append(j)
singer = Singer.objects.filter(singer__contains=word)
if singer.first() is not None:
for i in singer:
music = Music.objects.filter(singerId=i.id).order_by('-count')
for j in music:
resMusic.append(j)
count = len(resMusic)
g = count / 20
q = str(g).split('.')
thPage = 0
if int(q[1]) != 0:
thPage = int(q[0]) + 1
else:
thPage = int(q[0])
page = int(page)
if page > thPage:
return response_failure(code=404, message="参数页码超出")
da = resMusic[(page-1)*20 : page*20]
resMusicData = SerResponseMusic(da, many=True)
if resMusicData:
data = {
'music': resMusicData.data,
'count': count
}
return response_success(code=200, data=data)
else:
return response_failure(code=404, message='没有找到该歌曲或者歌手,数据还未添加!')
else:
return response_failure(code=404, message='请输入歌名或者歌手名')
except Exception as e:
print(e)
return response_failure(code=500, message='程序错误')
# 添加歌单列表数据
class upMusicList(APIView):
def post(self, request):
img = ''
try:
data = request.data
if data:
musicId = data.get('musicId')
name = str(data.get('name'))
account_num = data.get('account_num')
if not all([musicId, name, account_num]):
return response_failure(code=400, message='参数缺失')
userId = UserInformation.objects. \
filter(account_num=int(account_num)).values('id').first()
if userId is None:
return response_failure(code=404, message="请先登录")
getall = SongList.objects.filter(name=name).first()
if getall is not None:
return response_failure(code=400, message="该歌单名已经存在")
if musicId is not None:
musicId = [i for i in eval(musicId)]
num = len(musicId)
else:
return response_failure(code=400, message='请填写歌曲')
img_url = data.get('img_url')
if img_url == 'undefined':
firstid = musicId[0]
img_url = Music.objects.filter(id=int(firstid)).first().img_url
else:
img_url = UploadImg(img_url, 'static/musiclistimg/')
img = img_url
id = int(userId.get('id'))
sdata = {
'name': name,
'musicId': str(musicId),
'brief': str(data.get('brief')),
'type': data.get('type'),
'img_url': img_url,
'music_num': num,
'userId': id,
'date': str(datetime.now())
}
res = SerSongList(data=sdata)
if res.is_valid():
res.save()
return response_success(code=200, message='歌单添加成功')
else:
if img:
os.remove(img)
return response_failure(code=400, message='数据添加失败')
else:
if img:
os.remove(img)
return response_failure(code=400, message='请填写正确的格式')
except Exception as e:
print(e)
if img:
os.remove(img)
return response_failure(code=500)
# 添加歌单歌曲
def put(self, request):
try:
data = request.data
print(data)
try:
date = int(data.get('date'))
except Exception as e:
return response_failure(code=400,message="时间格式错误")
try:
account_num = int(data.get('account_num'))
except Exception as e:
return response_failure(code=400,message="账号格式错误")
try:
musicId = int(data.get('musicId'))
except Exception as e:
return response_failure(code=400,message="音乐格式错误")
try:
listId = int(data.get('listId'))
except Exception as e:
return response_failure(code=400,message="歌单格式错误")
if not all([date, account_num, musicId, listId]):
return response_failure(code=400)
if TimeIdentifcation(date):
user = UserInformation.objects.filter(account_num=account_num).values('id','power').first()
if user is None:
return response_failure(code=404,message="账号未找到")
userId = user.get('id')
power = user.get('power')
songList = SongList.objects.filter(id=listId).values('userId', 'musicId').first()
if songList is None :
return response_failure(code=404, message="歌单未找到")
if songList.get('userId') !=userId and power ==0:
return response_failure(code=400, message="歌单并非该账号创建")
music = eval(songList.get('musicId'))
if isT(music, musicId):
if len(music) >= 100:
return response_failure(code=400,message="歌单歌曲已达上限,无法添加")
else:
music.append(musicId)
num = len(music)
isture = SongList.objects.filter(id=listId).update(musicId=str(music),music_num=num)
if isture == 1:
return response_success(code=200, message='添加成功')
else:
return response_failure(code=400, message='添加失败')
else:
return response_failure(code=400, message="歌曲已存在歌单")
else:
return response_failure(code=400)
except Exception as e:
print(e)
return response_failure(code=500)
# 根据用户移除歌单中的歌曲
def delete(self,request):
try:
data = request.data
accountnum = int(data.get('accountnum'))
listId = int(data.get('listId'))
musicId = int(data.get('musicId'))
date = int(data.get('date'))
if not all([accountnum, listId, date, musicId]):
return response_failure(code=400)
user = UserInformation.objects.filter(account_num=accountnum).values('id','power').first()
if user is None:
return response_failure(code=404,message="用户存在")
userId = user.get('id')
power = user.get('power')
listdata = SongList.objects.filter(id=listId).values('userId', 'musicId').first()
if listdata is None:
return response_failure(code=404,message="歌单未找到")
list_userId = listdata.get('userId')
List_musicId = eval(listdata.get('musicId'))
if userId !=list_userId or power ==0:
return response_failure(code=403,message="权限不足")
if isT(List_musicId, musicId):
return response_failure(code=404,message="该歌曲不在歌单中")
else:
List_musicId.remove(musicId)
num = len(List_musicId)
istrue = SongList.objects.filter(id=listId).update(musicId=str(List_musicId),music_num=num)
if istrue ==1:
return response_failure(code=200,message="移除成功")
else:
return response_failure(code=400,message="移除失败")
except Exception as e:
print(e)
return response_failure(code=500)
# 获取歌词数据
class GetLrc(APIView):
# 获取歌词文件
def get(self, request):
try:
data = request.GET
if data:
id = data.get('id')
if id:
path = Music.objects.filter(id=int(id)).values('lyrics').first()
if path.get('lyrics'):
path = str(path.get('lyrics'))
c = ''
with open(path, 'r', encoding='utf-8') as f:
for line in f:
c = c + line
return response_success(code=200, data=[{'lrc': c}])
else:
return response_failure(code=404, message='没有找到这首歌的歌词')
else:
return response_failure(code=400, message='缺少参数')
except Exception as e:
print(e)
return response_failure(code=500)
# 实现音乐播放功能
class PlayMusic(APIView):
# 播放音乐
def get(self, request):
try:
data = request.GET
if data:
Id = data.get('id')
if Id:
Id = int(Id)
path = Music.objects.filter(id=Id).values('count', 'singerId', 'url').first()
num = path.get('count') + 1
singerId = str(path.get('singerId')).split(',')
for i in singerId:
id = int(i)
Singernum = Singer.objects.filter(id=id).values('hotCount').first()
if Singernum is not None:
hotnum = int(Singernum.get('hotCount')) + 1
Singer.objects.filter(id=id).update(hotCount=hotnum)
# 修改播放次数
Music.objects.filter(id=Id).update(count=num)
response = StreamingHttpResponse(file_iterator(str(path.get('url'))))
response['Content-Type'] = "audio/mpeg"
response['Accept-Range'] = 'bytes'
response['Accept-Ranges'] = 'bytes'
response['Content-Length'] = os.path.getsize(str(path.get('url')))
fileName = str(path.get('url')).split('/')[-1]
response['Content-Disposition'] = 'inline; filename="{}"'.format(fileName)
return response
else:
return response_failure(code=400)
else:
return response_failure(code=400, message='链接错误')
except Exception as e:
print(e)
response_failure(code=500)
# 查询音乐歌单歌曲
def post(self, request):
try:
data = request.data
if data:
listId = data.get('id')
date = data.get('date')
if not all([listId, date]):
return response_failure(code=400)
if TimeIdentifcation(date):
account_num = data.get('account_num')
if account_num != '':
userData = UserInformation.objects.filter(account_num=account_num).values('id').first()
if userData is not None:
sda = MineSistenList.objects.filter(account_num=account_num).values('musiclistid').first()
if sda is None:
Sdata = {
'musiclistid': str([int(listId)]),
'date': str(datetime.now()),
'account_num': account_num,
}
res = SerMineSistenList(data=Sdata)
if res.is_valid():
res.save()
else:
print(res.errors)
else:
Li = eval(sda.get('musiclistid'))
listId = int(listId)
if isT(Li, listId):
if len(Li) < 20:
Li.insert(0, listId)
elif len(Li) >= 20:
Li.insert(0, listId)
Li = Li[0:-1]
isOk = MineSistenList.objects.filter(account_num=account_num).update(musiclistid=Li)
if isOk == 1:
print('保存成功')
else:
print("保存失败")
else:
if len(Li) < 20:
Li.remove(listId)
Li.insert(0, listId)
elif len(Li) >= 20:
Li.remove(listId)
Li.insert(0, listId)
isOk = MineSistenList.objects.filter(account_num=account_num).update(musiclistid=Li)
if isOk == 1:
print('保存成功')
else:
print("保存失败")
lisstdata = SongList.objects.filter(id=int(listId)).first()
if lisstdata is None:
return response_failure(code=404)
data = []
for i in eval(lisstdata.musicId):
da = Music.objects.filter(id=i).first()
if da is not None:
data.append(SerResponseMusic(da).data)
else:
print('这个没有查到{}'.format(i))
re = SerReSongList(lisstdata).data
listaccount_num = UserInformation.objects.filter(id=lisstdata.userId).values('account_num').first()
redata = {
'id': re.get('id'),
'data': data,
'brief': re.get('brief'),
'type': re.get('type'),
'music_num': re.get('music_num'),
'count': re.get('count'),
'img_url': re.get('img_url'),
'date': re.get('date'),
'user':listaccount_num.get('account_num')
}
ist = SongList.objects.filter(id=int(listId)).update(count=int(lisstdata.count + 1))
if ist == 1:
return response_success(code=200, data=redata)
else:
return response_failure(code=500, message='数据库修改失败')
else:
return response_failure(code=400, message='参数错误')
else:
return response_failure(code=400, message='参数缺失')
except Exception as e:
print(e)
return response_failure(code=500)
# 获取最热的首歌
class GetHot(APIView):
def get(self, request):
try:
data = request.GET
date = data.get('date')
count = data.get('count')
# 2021/10/28-15:14:56-星期四
if not all([count, date]):
return response_failure(code=400, message='参数缺失')
else:
if TimeIdentifcation(date):
music = Music.objects.filter().order_by("-count")[:int(count)]
res = SerResponseMusic(music, many=True)
return response_success(code=200, data=res.data)
else:
return response_failure(code=400, message='参数错误')
except Exception as e:
print(e)
return response_failure(code=500)
# 获取热门列表
class getHotList(APIView):
# 获取歌单
def get(self, request):
try:
data = request.GET
if data:
date = data.get('date')
type = data.get('type')
if not all([date, type]):
return response_failure(code=400)
if TimeIdentifcation(date):
if type=='hot':
reData = list(SongList.objects.filter().order_by('-date').order_by('-count')[:30])
reData = random.sample(reData, 24)
elif type== 'new':
reData = list(SongList.objects.filter().order_by('-date')[:30])
reData = random.sample(reData, 24)
else:
reData = list(SongList.objects.filter().order_by('-count')[:30])
reData = random.sample(reData, 24)
if len(reData)<= 0:
return response_failure(code=404)
pa, sData = GetPage(reData, 1, 12)
res = SerHotSonglist(pa, many=True)
return response_success(code=200, data=res.data)
else:
return response_failure(code=400, message='参数错误')
else:
return response_failure(code=400, message="参数缺失")
except Exception as e:
print(e)
return response_failure(code=500)
# 根据类型获取歌单
class TypeList(APIView):
def get(self, request):
try:
date = request.GET.get('date')
type = request.GET.get('type')
if not all([date, type]):
return response_failure(code=400)
if TimeIdentifcation(date):
ListData = SongList.objects.filter(type__contains=type).order_by('-date').order_by('-count')[:10]
if ListData.first() is None:
return response_failure(code=404)
res = SerReSongList(ListData, many=True)
return response_success(code=200, data=res.data)
else:
return response_failure(code=400)
except Exception as e:
print(e)
return response_failure(code=500)
# 获取热门歌单列表默认十个
class HotList(APIView):
def get(self, request):
try:
date = request.GET.get('date')
if date:
if TimeIdentifcation(date):
data = SongList.objects.filter().order_by('-date').order_by('-count')[:10]
if data.first() is None:
return response_failure(code=404)
res = SerReSongList(data,many=True)
return response_success(code=200,data=res.data)
else:
return response_failure(code=400)
except Exception as e:
print(e)
return response_failure(code=500)
django实现音乐播放功能
于 2023-07-15 10:29:27 首次发布