def search_user(): """搜索用户""" form = SearchForm().validate_for_api() page_data = BaseUser.query.filter(BaseUser.name.like("%" + form.q.data + "%")). \ paginate(error_out=False, page=int(form.page.data), per_page=20) baseusers = [] for i in page_data.items: user = User.query.filter(User.id == i.id).first() baseuser = { "id": i.id, "name": i.name, "info": user.info, "face": user.face, "post_num": 0, "fannum": num_assign(Follow.query.filter(Follow.follow_id == i.id).count()), "follownum": num_assign(Follow.query.filter(Follow.user_id == i.id).count()), } baseusers.append(baseuser) r = { "has_next": page_data.has_next, "has_prev": page_data.has_prev, "pages": page_data.pages, "page": page_data.page, "total": page_data.total, "baseusers": baseusers } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_latest(): """获取最新投稿""" form = NewForm().validate_for_api() tag = None if form.tag_id.data == -1: videos = Video.query.limit(form.number.data).all() else: # 获取标签及其子标签 sub_tags = [i.id for i in Tag.query.filter(Tag.parent_id == form.tag_id.data).all()] videos = Video.query.filter(or_(Video.tag_id == form.tag_id.data, Video.tag_id.in_(sub_tags))).order_by( Video.create_time.desc()).limit(form.number.data).all() tag = Tag.query.filter(Tag.id == form.tag_id.data).first() random.shuffle(videos) r = { "tag": tag.name if tag else "全部", "total": len(videos), "videos": [{ "id": i.id, "name": i.name, "playnum": num_assign(i.playnum), "commentnum": num_assign(i.commentnum), "logo": i.logo, "length": i.length, "is_bangumi": False } for i in videos] } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_relevant(): """获得视频页面下的相关推荐视频""" form = TagForm().validate_for_api() videos = Video.query.filter(Video.tag_id == form.tag_id.data). \ order_by(Video.create_time.desc()).limit(30).all() random.shuffle(videos) if len(videos) <= 10: pass else: videos = random.sample(videos, random.randint(len(videos) - random.randint(2, 9), len(videos))) tmp = [] for i in videos: baseuser = BaseUser.query.filter(BaseUser.id == i.user_id).first() video = { "id": i.id, "name": i.name, "logo": i.logo, "playnum": num_assign(i.playnum), "commentnum": num_assign(i.commentnum), "user": { "id": baseuser.id, "name": baseuser.name }, "length": i.length, "is_bangumi": False } tmp.append(video) r = { "total": len(videos), "videos": tmp } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_user(): """查看用户信息""" baseuser = BaseUser.query.filter(BaseUser.id == current_user.id). \ first_or_404(description="找不到该用户") user = User.query.filter(User.id == baseuser.id).first() r = { "user": { "id": baseuser.id, "name": baseuser.name, "account": baseuser.account, "gender": GenderEnum(baseuser.gender).name, "email": user.email if user else None, "phone": user.phone if user else None, "info": user.info if user else None, "face": user.face if user else None, "create_time": baseuser.create_time.strftime("%Y-%m-%d %H:%M:%S") }, "follownum": num_assign( Follow.query.filter(Follow.user_id == current_user.id).count()), "fannum": num_assign( Follow.query.filter(Follow.follow_id == current_user.id).count()) } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_fan_or_follow(): """查看粉丝或者关注""" form = FanOrFollowForm().validate_for_api() if form.tag_id.data == 1: # 查找粉丝,查找Follow表中follow_id等于自己的id fans = Follow.query.order_by(Follow.create_time.desc()).filter( Follow.follow_id == current_user.id).all() fans = [i.user_id for i in fans] r = { "fans": [{ "id": i.id, "name": BaseUser.query.filter(BaseUser.id == i.id).first().name, "info": i.info, "follownum": num_assign( Follow.query.filter( Follow.user_id == current_user.id).count()), "fannum": num_assign( Follow.query.filter( Follow.follow_id == current_user.id).count()), "face": i.face } for i in User.query.filter(User.id.in_(fans))], "total": int(len(fans)) } else: # 查找Follow表中user_id等于自己的id follows = Follow.query.filter(Follow.user_id == current_user.id).all() follows = [i.follow_id for i in follows] r = { "follows": [{ "id": i.id, "name": BaseUser.query.filter(BaseUser.id == i.id).first().name, "info": i.info, "follownum": num_assign( Follow.query.filter(Follow.user_id == i.id).count()), "fannum": num_assign( Follow.query.filter(Follow.follow_id == i.id).count()), "face": i.face } for i in User.query.filter(User.id.in_(follows))], "total": int(len(follows)) } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_one(): """通过视频id获取视频信息""" form = IdForm().validate_for_api() video = Video.query.filter(Video.id == form.id.data).first_or_404(description="找不到该视频资源") baseuser = BaseUser.query.filter(BaseUser.id == video.user_id).first() user = User.query.filter(User.id == baseuser.id).first() if baseuser else None # 子标签 sub = Tag.query.filter(Tag.id == video.tag_id).first() # 父标签 index = Tag.query.filter(Tag.id == sub.parent_id).first() if sub else None r = { "id": video.id, "name": video.name, "url": video.url, "logo": video.logo, "info": video.info, "user": { "id": baseuser.id, "name": baseuser.name, "face": user.face, "fannum": num_assign(Follow.query.filter(Follow.follow_id == baseuser.id).count()), "follownum": num_assign(Follow.query.filter(Follow.user_id == baseuser.id).count()), "info": user.info } if baseuser else None, "tag": { "id": index.id if index else None, "name": index.name if index else None, "sub_id": sub.id if sub else None, "sub_name": sub.name if sub else None }, "is_bangumi": False, "playnum": num_assign(video.playnum), "commentnum": num_assign(video.commentnum), "colnum": num_assign(video.colnum), "release_time": video.release_time.strftime("%Y-%m-%d %H:%M:%S") } with db.auto_commit(): viewlog = ViewLog.query.filter(ViewLog.user_id == current_user.id, ViewLog.video_id == video.id).first() if not viewlog: viewlog = ViewLog() viewlog.user_id = current_user.id viewlog.video_id = video.id viewlog.update_time = datetime.datetime.now() db.session.add(viewlog) return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_relevant(): """获取番剧页面下的相关推荐视频""" videos = Video.query.filter(Video.name.like("%" + "" + "%")).limit(10).all() r = { "total": 10, "videos": [{ "id": i.id, "name": i.name, "logo": i.logo, "playnum": num_assign(i.playnum), "commentnum": num_assign(i.commentnum), "length": i.length } for i in videos] } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_rank(): """获取排行榜""" form = RankForm().validate_for_api() # 获取标签及其子标签 sub_tags = [i.id for i in Tag.query.filter(Tag.parent_id == form.tag_id.data).all()] now_time = datetime.datetime.now() if form.tag_id.data == -1: videos = Video.query.filter( Video.release_time.between(now_time - datetime.timedelta(days=form.time.data), now_time)). \ order_by(Video.score.desc()).limit(form.number.data).all() else: videos = Video.query.filter( Video.release_time.between(now_time - datetime.timedelta(days=form.time.data), now_time), or_( Video.tag_id == form.tag_id.data, Video.tag_id.in_(sub_tags))). \ order_by(Video.score.desc()).limit(form.number.data).all() tmp = [] for i in videos: baseuser = BaseUser.query.filter(BaseUser.id == i.user_id).first() video = { "id": i.id, "name": i.name, "score": i.score, "info": i.info, "playnum": num_assign(i.playnum), "commentnum": num_assign(i.commentnum), "colnum": num_assign(i.colnum), "logo": i.logo, "user": { "id": baseuser.id, "name": baseuser.name }, "is_bangumi": False, "release_time": i.release_time.strftime("%Y-%m-%d %H:%M:%S") } tmp.append(video) tag = Tag.query.filter(Tag.id == form.tag_id.data).first() r = { "time": form.time.data, "tag": tag.name if tag else "全部", "total": len(videos), "videos": tmp } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_one(): """通过bangumi的id获取信息""" form = IdForm().validate_for_api() bangumi = Bangumi.query.filter(Bangumi.id == form.id.data, Bangumi.status == 1). \ first_or_404(description="找不到该番剧") videos = [{ "video_id": i.video_id, "piece": i.piece } for i in Episode.query.filter(Episode.bangumi_id == bangumi.id).all()] episodes = [] for i in videos: video = Video.query.filter(Video.id == i["video_id"]).first() episode = { "id": video.id, "piece": i["piece"], "name": video.name, "logo": video.logo, "is_bangumi": True } episodes.append(episode) r = { "id": bangumi.id, "name": bangumi.name, "logo": bangumi.logo, "info": bangumi.info, "playnum": num_assign(bangumi.playnum), "commentnum": num_assign(bangumi.commentnum), "colnum": num_assign(bangumi.colnum), "fannum": num_assign(bangumi.fannum), "grade": bangumi.grade, "voice_actors": bangumi.voice_actors, "staff": bangumi.staff, "episodes": episodes, "is_finish": bangumi.is_finish, "start_date": bangumi.start_date.strftime("%Y-%m-%d"), "update_time": bangumi.update_time.strftime("%H:%M:%S"), "update_weekday": bangumi.update_weekday } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_rank(): """获取番剧/国产动画排行榜""" form = RankForm().validate_for_api() if form.tag_id.data == -1 or form.tag_id.data == 2: # 查找番剧排行榜 bangumis = Bangumi.query.filter( Bangumi.tag_id == 2, Bangumi.status == 1).order_by( Bangumi.score.desc()).limit(form.number.data).all() else: # 查找国产动画排行榜 bangumis = Bangumi.query.filter( Bangumi.tag_id == 1, Bangumi.status == 1).order_by( Bangumi.score.desc()).limit(form.number.data).all() tmp = [] for i in bangumis: fannum = BangumiCol.query.filter(BangumiCol.bangumi_id == i.id).count() bangumi = { "id": i.id, "name": i.name, "score": i.score, "playnum": num_assign(i.playnum), "commentnum": num_assign(i.commentnum), "colnum": num_assign(i.colnum), "fannum": num_assign(fannum), "logo": i.logo, "new_piece": i.new_piece, "is_finish": i.is_finish, "episodes": i.episodes } tmp.append(bangumi) r = { "time": form.time.data, "tag": "国产动画" if form.tag_id.data == 1 else "番剧", "total": len(bangumis), "bangumis": tmp } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_recommend(): """获取首页及分区的推荐视频""" form = RankForm().validate_for_api() now_time = datetime.datetime.now() # now_time = now_time.replace(hour=12, minute=0, second=0) if form.tag_id.data == -1: videos = Video.query.filter( Video.release_time.between(now_time - datetime.timedelta(days=form.time.data), now_time)). \ order_by(Video.score.desc()).limit(form.number.data).all() else: # 获取标签及其子标签 sub_tags = [i.id for i in Tag.query.filter(Tag.parent_id == form.tag_id.data).all()] videos = Video.query.filter( Video.release_time.between(now_time - datetime.timedelta(days=form.time.data), now_time), or_(Video.tag_id == form.tag_id.data, Video.tag_id.in_(sub_tags))). \ order_by(Video.score.desc()).limit(form.number.data).all() tmp = [] for i in videos: baseuser = BaseUser.query.filter(BaseUser.id == i.user_id).first() video = { "id": i.id, "name": i.name, "playnum": num_assign(i.playnum), "logo": i.logo, "user": { "id": baseuser.id, "name": baseuser.name }, "is_bangumi": False } tmp.append(video) r = { "time": form.time.data, "total": 8, "videos": tmp } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def load_comment(): """加载评论,用于观看视频时加载""" form = LoadComForm().validate_for_api() page_data = Comment.query.filter(Comment.video_id == form.video_id.data, Comment.root_id == None). \ paginate(error_out=False,page=int(form.page.data), per_page=int(current_app.config["PER_COM_PAGE"])) comments = [] for i in page_data.items: # 查找根节点评论下的评论 reply = Comment.query.filter(Comment.root_id == i.id).all() reply_comments = [] for j in reply: # 查找评论所属的用户 baseuser = BaseUser.query.filter(BaseUser.id == j.user_id).first() user = User.query.filter(User.id == j.user_id).first() # 查找回复评论的用户 reply_baseuser = None reply_user = None tmp_com = Comment.query.filter(Comment.id == j.parent_id).first() if tmp_com: # 如果评论的parent_id存在则说明有回复用户 reply_baseuser = BaseUser.query.filter( BaseUser.id == tmp_com.user_id).first() reply_user = User.query.filter( User.id == tmp_com.user_id).first() reply_comment = { "id": j.id, "content": j.content, "create_time": j.create_time.strftime("%Y-%m-%d %H:%M:%S"), "user": { "id": baseuser.id, "name": baseuser.name, "face": user.face, "follownum": num_assign( Follow.query.filter( Follow.user_id == i.user_id).count()), "fannum": num_assign( Follow.query.filter( Follow.follow_id == i.user_id).count()), "info": user.info, "gender": baseuser.gender }, "reply_user": { "id": reply_baseuser.id, "name": reply_baseuser.name, "face": reply_user.face, "follownum": num_assign( Follow.query.filter( Follow.user_id == reply_baseuser.id).count()), "fannum": num_assign( Follow.query.filter( Follow.follow_id == reply_baseuser.id).count()), "info": reply_user.info, "gender": reply_baseuser.gender } if reply_baseuser else None } reply_comments.append(reply_comment) # 查找当前根节点评论的所属用户 user = User.query.filter(User.id == i.user_id).first() baseuser = BaseUser.query.filter(BaseUser.id == i.user_id).first() comment = { "id": i.id, "content": i.content, "create_time": i.create_time.strftime("%Y-%m-%d %H:%M:%S"), "user": { "id": baseuser.id, "name": baseuser.name, "face": user.face, "follownum": num_assign( Follow.query.filter(Follow.user_id == i.user_id).count()), "fannum": num_assign( Follow.query.filter( Follow.follow_id == i.user_id).count()), "info": user.info, "gender": baseuser.gender }, "reply_comments": reply_comments } comments.append(comment) r = { "has_next": page_data.has_next, "has_prev": page_data.has_prev, "pages": page_data.pages, "page": page_data.page, "total": Comment.query.filter(Comment.video_id == form.video_id.data).count(), "comments": comments } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def search_video(): """根据名字或者ID搜索视频""" form = SearchVideoForm().validate_for_api() select = Video.query.filter(Video.tag_id != None) # 排序筛选 order = Video.score.desc() if form.order.data == -1: pass elif form.order.data == 1: order = Video.playnum.desc() elif form.order.data == 2: order = Video.release_time.desc() elif form.order.data == 3: order = Video.danmunum.desc() elif form.order.data == 4: order = Video.colnum.desc() # 时长筛选 if form.length.data == -1: pass elif form.length.data == 1: select = select.filter(Video.length.between(0, 10 * 60)) elif form.length.data == 2: select = select.filter(Video.length.between(10 * 60, 30 * 60)) elif form.length.data == 3: select = select.filter(Video.length.between(30 * 60, 60 * 60)) elif form.length.data == 4: select = select.filter(Video.length > 60 * 60) # 分区筛选 if form.tag_id.data == -1: pass else: select = select.filter(Video.tag_id == form.tag_id.data) page_data = select.filter( or_(Video.name.like("%" + form.q.data + "%"), Video.id == form.q.data.lower().replace( "av", ""))).order_by(order).paginate(error_out=False, page=int(form.page.data), per_page=20) videos = [] for i in page_data.items: baseuser = BaseUser.query.filter(BaseUser.id == i.user_id).first() video = { "id": i.id, "name": i.name, "length": i.length, "playnum": num_assign(i.playnum), "logo": i.logo, "user": { "id": baseuser.id, "name": baseuser.name } if baseuser else None, "release_time": i.release_time.strftime("%Y-%m-%d"), } videos.append(video) r = { "has_next": page_data.has_next, "has_prev": page_data.has_prev, "pages": page_data.pages, "page": page_data.page, "total": page_data.total, "videos": videos } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)
def get_index(): """获取番剧索引""" form = IndexForm().validate_for_api() select = Bangumi.query.filter(Bangumi.tag_id == 2, Bangumi.status == 1) # 地区筛选 if form.area.data == -1: pass elif form.area.data == 0: select = select.filter(Bangumi.area == "日本") elif form.area.data == 1: select = select.filter(Bangumi.area == "美国") # 是否完结筛选 if form.is_finish.data == -1: pass elif form.is_finish.data == 0: select = select.filter(Bangumi.is_finish == 0) elif form.is_finish.data == 1: select = select.filter(Bangumi.is_finish == 1) # 季节筛选 if form.season.data == -1: pass elif form.season.data == 1: select = select.filter(Bangumi.season == 1) elif form.season.data == 2: select = select.filter(Bangumi.is_finish == 2) elif form.season.data == 3: select = select.filter(Bangumi.is_finish == 3) elif form.season.data == 4: select = select.filter(Bangumi.is_finish == 4) # 年份筛选 if form.pub_date.data == -1: pass else: select = select.filter( Bangumi.start_date.between( datetime.date(year=form.pub_date.data, month=1, day=1), datetime.datetime.now().date())) # 类型筛选 if form.order.data == 1: order = Bangumi.fannum elif form.order.data == 2: order = Bangumi.update_time elif form.order.data == 3: order = Bangumi.score elif form.order.data == 4: order = Bangumi.playnum elif form.order.data == 5: order = Bangumi.start_date if form.sort.data == 0: order = order.desc() page_data = select.order_by(order).paginate(error_out=False, page=int(form.page.data), per_page=20) r = { "has_next": page_data.has_next, "has_prev": page_data.has_prev, "pages": page_data.pages, "page": page_data.page, "total": page_data.total, "bangumis": [{ "id": i.id, "name": i.name, "logo": i.logo, "playnum": num_assign(i.playnum), "fannum": num_assign(i.fannum), "score": i.score, "start_date": i.start_date.strftime("%Y-%m-%d") } for i in page_data.items] } return ReturnObj.get_response(ReturnEnum.SUCCESS.value, "success", data=r)