django实现音乐播放功能

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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小福不认命

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值