运行环境
Windows 10 、python 3.5.1
需要到pypinyin模块,请通过下面的命令安装:
pip install pypinyin
代码如下:
#-*_coding:utf-8-*-
#视频资源0day名的命名方式一般是:
#视频名+年份+季/集数+来源+分辨率+视频编码格式+音频编码格式+小组名
#对形如以下形式的链接有效:
#http://v.qq.com/x/cover/1velzvrkiyetht3/t0019clqihf.html
#http://v.qq.com/detail/1/1velzvrkiyetht3.html
#http://v.qq.com/x/page/q0017kuphxo.html
#待解决:对单集视频只会输出拼音的形式
#适用于腾讯的电视剧(包括网剧),动漫,电影,不适于个人用户上传的视频
import re,requests
from sys import argv
from pypinyin import lazy_pinyin
def getoriginname(pageurl):#获取中文名和英文名
if "detail" not in pageurl:
pagecid=pageurl
info=pageurl.replace("http://","").replace(".","/").split("/")
vid=info[-2]
pageurl="http://vv.video.qq.com/getinfo?vid="+vid
pagecontent=requests.get(pageurl).content.decode("UTF-8");#从接口匹配视频信息
if "vid is wrong" in pagecontent:#换个方式匹配下
pageurl="http://vv.video.qq.com/getinfo?cid="+vid
pagecontent=requests.get(pageurl).content.decode("UTF-8");
namearray=list(re.findall("<ti>([\s\S]*?)</ti>[\s\S]*<vid>([\s\S]*)</vid>",pagecontent)[0])
namearray[1]=""#此处是vid,无用,故删除之。至于为什么前面要匹配它又删,是为了避免被后续函数把vid认为是英文名...
getcid=requests.get(pagecid).content.decode("UTF-8");
detailid=re.findall("/cover/([\s\S]*?).html",getcid)[0];
#detailid这里用于判断有没有英文名,有的话就把英文名一并返回
pageurl="http://v.qq.com/detail/"+detailid[0]+"/"+detailid+".html";
namearray[1]=getoriginname(pageurl)[1];
else:
pagecontent=requests.get(pageurl).content.decode("UTF-8")#从网页中匹配视频信息
namearray=list(re.findall("info:title\">([\s\S]*?)</a>[\s\S]*itemprop=\"alternateName\">([\s\S]*?)</span>",pagecontent)[0])
for i in range(len(namearray)):
namearray[i]=namearray[i].replace('\xa0', ' ').replace(':', ' ')
return (namearray)
def enddottoline(str0day):#将一串名字的最后的一个点替换为 -
tmplist=list(str0day)
tmplist[str0day.rfind(".")]="-"
str0day=''.join(tmplist)
return(str0day)
def EXorSX(originname):#根据不同类型名称返回是某一季或者某一集
if "_" in originname:
EorS="E"+originname.split("_")[1].zfill(2);#季或集一般都是两位数,这里对其补全填0
originname=originname.split("_")[0];
else:
chnum1=['零','一','二','三','四','五','六','七','八','九']
chnum2=['0','1','2','3','4','5','6','7','8','9']
ES=re.findall("第([\s\S]*?)季",originname);
if ES==[]:
EorS="Complete"
else:
originname=originname[:originname.find("第")]
for i in range(len(chnum1)):#判断是第几集或者第几季
if ES[0]==chnum1[i]:
j=i;break
for i in range(len(chnum2)):
if ES[0]==chnum2[i]:
j=i;break
EorS="S"+repr(j).zfill(2)
return(originname,EorS)
key1,key2= argv
key2=key2.replace("https","http")
originname=getoriginname(key2)
print(originname)
originname[0],EorS = EXorSX(originname[0])
if "第" and "季" in list(originname[0]):#单集的视频从网页中得到的值可能是XXX第X季_XX的形式,再一次用EXorSX()函数得到是哪一季
Season=EorS
originname[0],EorS = EXorSX(originname[0])
EorS=EorS+Season
nametail=["2017",EorS,"WEB-DL","1080P","H264","AAC","WeiMo"]#列表中能够的元素可以加入读取视频信息的函数进行替换
if originname[1]=="":#没有英文名,那么以拼音命名
namehead=lazy_pinyin(originname[0].replace(" ","").replace(":",""))
for i in range(len(namehead)):
namehead[i]=namehead[i].capitalize()#大写每个拼音的首字母
else:
namehead=originname[1].replace(":","").split(" ")#网页上的名字可能有冒号,去掉
for i in range(len(namehead)):
namehead[i]=namehead[i].capitalize()
print(namehead)
for i in range(len(nametail)):#将名字部分后0day格式后面的部分放在一个列表中
namehead.append(nametail[i])
full0dayname=".".join(namehead);#把列表中的元素用点连接起来
full0dayname=enddottoline(full0dayname)
print(full0dayname)
运行效果图:
其他:
- 命名中的年份请无视,可手动修改
- 音视频编码信息可在下载好视频后读取获得,也可以在下载中处理成指定格式
- 小组名随便写的