/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	采集核心程序		~~~*/
#模块名称	= "官方通用模块"
#模块版本号	= "200912031032"

解释列表内容(内容, 列表URL){
	列表内容	= 截取文本中间B(内容, 影片列表开始代码, 影片列表结束代码)
	影片链接数组	= 分割文本段(列表内容, 影片链接开始代码, 影片链接结束代码)
	如果(影片链接特殊处理 == #真)
		影片链接数组 = 替换特殊链接组(影片链接数组, 影片要替换的地址, 影片替换为的地址)
	结束如果
	影片链接数组	= 解释绝对网址(影片链接数组, 列表URL)
	影片链接数组	= 移除数组重复值(影片链接数组)
	如果(获取影片图片方式 == 1 && 影片图片开始代码&影片图片结束代码 != "")
		映象文件	= 创建映象文件(#进程标识ID)
		图片组		= 处理图片地址(列表内容)
		图片组		= 解释绝对网址(图片组, 列表URL)
		成员数		= 如果真(取数组成员数(图片组)<取数组成员数(影片链接数组),取数组成员数(图片组),取数组成员数(影片链接数组))
		计数循环(计数=0; 计数<=成员数; 计数++)
			影片链接	= 影片链接数组[计数]
			映象文件[影片链接]=图片组[计数]
		结束计数循环
	结束如果
	影片数			= 取数组成员数(影片链接数组) + 1
	采集进程.itemsize	= 影片数
	调试输出("<pre>")
	调试输出("添加待采集影片：("& 影片数 &"部)"& #换行符)
	调试输出(数组到文本(影片链接数组,#换行符))
	调试输出("</pre>")
	如果(倒序采集 == #真)
		影片链接数组	= 数组顺序颠倒(影片链接数组)
	结束如果
	采集影片任务.add(影片链接数组)
}

处理图片地址(临时内容){
	图片组		= 分割文本段(临时内容, 文本替换(影片图片开始代码,"[变量]",""), 文本替换(影片图片结束代码,"[变量]",""))
	如果(影片图片替换变量 != "")
		计数循环(计数=0; 计数<=取数组成员数(图片组); 计数++)
			图片 = 图片组[计数]
			如果(图片 != "")
				如果(寻找文本位置(影片图片开始代码,"[变量]") != -1)
					图片 = 影片图片替换变量 & 图片
				结束如果
				如果(寻找文本位置(影片图片结束代码,"[变量]") != -1)
					图片 &= 影片图片替换变量
				结束如果
			结束如果
			图片组[计数]=图片
		结束计数循环
	结束如果
	返回(图片组)
}

是数组(变量){
	返回(类型名(变量) == "Variant()")
}

解释影片资料(内容, 临时内容, 影片URL){
	影片 = 创建影片信息类()
	影片["来自"]	= 影片URL
	影片["来源"]	= 播放来源
	影片["名称"]	= 规则替换(过滤字典(删除HTML代码(截取文本中间(临时内容, 影片名称开始代码, 影片名称结束代码),#所有HTML标签), #标题过滤),"/(^\s*)|(\s*$)/g","")
	如果(影片图片开始代码&影片图片结束代码 != "")
		图片=""
		如果(获取影片图片方式 == 1)
			映象文件	= 创建映象文件(#进程标识ID)
			图片		= 映象文件[影片URL]
			映象文件.remove(影片URL)
		否则
			图片组		= 处理图片地址(临时内容)
			图片组		= 解释绝对网址(图片组,影片URL)
			图片		= 弹出首成员(图片组)
		结束如果
		影片["图片"]		= 删除HTML代码(图片,#所有HTML标签)
	结束如果
	如果(截取影片列表范围 == #真)
		内容2 = 截取文本中间(内容, 播放列表开始代码, 播放列表结束代码)
	否则
		内容2 = 内容
	结束如果
	如果(获取影片地址方式 == 0)
		临时内容2=内容2
	否则
		播放链接组 = 分割文本段(内容2, 播放链接开始代码, 播放链接结束代码)
		如果(播放链接特殊处理 = #真)
			播放链接组 = 替换特殊链接组(播放链接组, 播放要替换的地址, 播放替换为的地址)
		结束如果
		播放链接组 = 移除数组重复值(解释绝对网址(播放链接组, 影片URL))
		临时内容2=""
		总数	= 取数组成员数(播放链接组)+1
		如果(总数 > 0)
			如果(获取影片地址方式==1)
				调试输出("正在截取<font color=red>"& 总数 &"</font>页面上的影片地址，可能要花上几分钟。请稍候...<br />")
				计数循环(计数=0; 计数<总数; 计数++)
					临时内容2 &= HTTP读文本文件(播放链接组[计数],网页编码)
				结束计数循环
			否则
				临时内容2 = HTTP读文本文件(播放链接组[0],网页编码)
			结束如果
		结束如果
	结束如果
	如果(采集影片分集名称 == #真)
		分集名数组		= 分割文本段(内容2, 分集名称开始代码, 分集名称结束代码)
		影片["分集名数组"]	= 分集名数组
	结束如果
	影片地址数组	= 分割文本段(临时内容2, 影片地址开始代码, 影片地址结束代码)
	计数循环(计数=0; 计数<=取数组成员数(影片地址数组); 计数++)
		影片地址数组[计数]	= 删首尾空(删除HTML代码(影片地址数组[计数],#所有HTML标签))
	结束计数循环
	影片["影片地址数组"] = 影片地址数组
	结果	= "<pre>来源地址: " & 影片URL & #换行符
	如果(删全部空(影片["名称"])!="" && 取数组成员数(影片地址数组)!=-1)
		如果(自动归类==#假)
			分类ID	= 所属分类ID
			分类名	= 分类ID到名称(分类ID)
		否则
			分类名	= 删除HTML代码(截取文本中间(临时内容, 影片分类开始代码, 影片分类结束代码),#所有HTML标签)
			分类ID	= 智能归类(分类名,影片["名称"])
		结束如果
		影片["分类ID"]=分类ID
		影片["分类名"]=分类名
		如果(是否更新时间==#真)
			影片["日期"] = 取系统时间()
		结束如果
		如果(影片演员开始代码&影片演员结束代码 != "")
			影片["演员"]	= 规则替换(文本替换(文本替换(删除HTML代码(截取文本中间(临时内容, 影片演员开始代码, 影片演员结束代码),#所有HTML标签),"/"," "),"|"," "),"/(\s+)/g"," ")
		结束如果
		如果(影片导演开始代码&影片导演结束代码 != "")
			影片["导演"]	= 规则替换(文本替换(文本替换(删除HTML代码(截取文本中间(临时内容, 影片导演开始代码, 影片导演结束代码),#所有HTML标签),"/"," "),"|"," "),"/(\s+)/g"," ")
		结束如果
		如果(影片语言开始代码&影片语言结束代码 != "")
			影片["语言"]	= 规则替换(文本替换(文本替换(删除HTML代码(截取文本中间(临时内容, 影片语言开始代码, 影片语言结束代码),#所有HTML标签),"/"," "),"|"," "),"/(\s+)/g"," ")
		结束如果
		如果(关键词开始代码&关键词结束代码 != "")
			影片["关键词"]	= 规则替换(文本替换(文本替换(删除HTML代码(截取文本中间(临时内容, 关键词开始代码, 关键词结束代码),#所有HTML标签),"/"," "),"|"," "),"/(\s+)/g"," ")
		结束如果
		如果(影片地区开始代码&影片地区结束代码 != "")
			影片["地区"]	= 删首尾空(删除HTML代码(截取文本中间(临时内容, 影片地区开始代码, 影片地区结束代码),#所有HTML标签))
		结束如果
		如果(影片年份开始代码&影片年份结束代码 != "")
			年份	= 删首尾空(删除HTML代码(截取文本中间(临时内容, 影片年份开始代码, 影片年份结束代码),#所有HTML标签))
			如果(是日期(年份))
				影片["年份"]	= 取年份(年份)
			否则
				数字年	= 到数字(规则替换(年份,"/[^\d]*(\d+).*/i","$1"))
				如果(数字年<=取年份(取日期()))
					影片["年份"]	= 数字年
				结束如果
			结束如果
		结束如果
		如果(影片连载开始代码&影片连载结束代码 != "")
			连载	= 文本替换(删除HTML代码(截取文本中间(临时内容, 影片连载开始代码, 影片连载结束代码),#所有HTML标签),影片["名称"],"")
			连载	= 文本替换(文本替换(文本替换(文本替换(文本替换(文本替换(文本替换(连载,"连载",""),"集",""),"全",""),"至",""),"话",""),"季",""),"级","")
			连载	= 到数字(文本替换(文本替换(文本替换(文本替换(文本替换(文本替换(文本替换(连载,"[",""),"]",""),"第",""),"更新",""),"结局",""),"完",""),"_",""))
			如果(连载 > 0)
				影片["连载状态"] = 连载
			结束如果
		结束如果
		如果(影片备注开始代码&影片备注结束代码 != "")
			影片["备注"]	= 删首尾空(删除HTML代码(截取文本中间(临时内容, 影片备注开始代码, 影片备注结束代码),#所有HTML标签))
		结束如果
		如果(影片介绍开始代码&影片介绍结束代码 != "")
			影片["介绍"]		= 删首尾空(过滤字典(删除HTML代码(截取文本中间(内容, 影片介绍开始代码, 影片介绍结束代码), 过滤选项), #剧情过滤))
		结束如果
		如果(初始点击数 == -1)
			影片["初始点击数"] = 到长整数(10000 * 取随机数())
		否则
			影片["初始点击数"] = 初始点击数
		结束如果
		电影入库(影片, 如果真(分类ID==0, #临时库, 入库方式), #当前模式)
		结果	&= "名 称: " & 影片["名称"] & #换行符
		结果	&= "图 片: " & 影片["图片"] & #换行符
		结果	&= "分 类: " & 分类名 & #换行符
		结果	&= "演 员: " & 影片["演员"] & #换行符
		结果	&= "导 演: " & 影片["导演"] & #换行符
		结果	&= "连 载: " & 影片["连载状态"] & #换行符
		结果	&= "备 注: " & 影片["备注"] & #换行符
		结果	&= "关键词: " & 影片["关键字"] & #换行符
		结果	&= "年 份: " & 影片["年份"] & #换行符
		结果	&= "地 区: " & 影片["地区"] & #换行符
		结果	&= "语 言: " & 影片["语言"] & #换行符
		结果	&= "日 期: " & 如果真(是否更新时间,影片["日期"],"不更新") & #换行符
		结果	&= "地 址: " & #换行符 & 数组到文本(影片地址数组,#换行符) & #换行符 & #换行符
		如果(是数组(分集名数组))
			结果	&= "影片集名: " & #换行符 & 数组到文本(分集名数组,#换行符) & #换行符
		结束如果
		结果	&= "数据介绍: " & HTML编码(影片["介绍"]) & #换行符
	否则
		结果	&= "忽略无效数据: " & 影片["名称"] & " 原因: " & 如果真(删全部空(影片["名称"])=="","没有数据名称","没有数据地址")
	结束如果
	调试输出(结果 & "</pre>")
}

解释影片内容(内容, 影片URL){
	跳过	= #假
	如果(资料范围开始代码 != "" || 资料范围结束代码 != "")
		临时内容 = 截取文本中间(内容, 资料范围开始代码, 资料范围结束代码)
	否则
		临时内容 = 内容
	结束如果

	如果(只采集最近 > 0 && #当前模式 != 0)
		日期 = 文本替换(删除HTML代码(截取文本中间(临时内容, 影片日期开始代码, 影片日期结束代码),过滤选项),".","-")
		如果(是日期(日期))
			如果(取时间间隔(#日, 到日期(日期), 取日期()) >= 只采集最近)
				调试输出("数据日期: " & 日期 & "<br />超过只采 "& 只采集最近 & " 天内影片限制,被忽略的地址为: " & 影片URL)
				跳过	= #真
			结束如果
		否则
			调试输出("不是有效的日期格式,跳过" & 影片URL)
			跳过	= #真
		结束如果
	结束如果
	如果(跳过 == #假)
		解释影片资料(内容, 临时内容, 影片URL)
	结束如果
}

采集失败(错误代码, 错误信息, 地址){
	调试输出(错误代码&","&错误信息&","&地址)
}

秒转时间格式(秒){
	如果(秒==0)
		返回("00:00:00")
	结束如果
	时 = 到长整数(秒 / 3600)
	分 = 到长整数((秒 % 3600) / 60)
	秒 = 到长整数(秒 % 3600 % 60)
	时=如果真(取文本长度(时)<2,"0","")&时
	分=如果真(取文本长度(分)<2,"0","")&分
	秒=如果真(取文本长度(秒)<2,"0","")&秒
	返回(时&":"&分&":"&秒)
}

进度显示(差数, 当前, 地址){
	如果(是日期(采集进程.startTime) != #真)
		采集进程.startTime=取系统时间()
	结束如果
	总刻度	= 采集进程.count
	刻度	= 总刻度 - 采集列表任务.Count + (采集进程.itemsize - 采集影片任务.count) / 采集进程.itemsize
	总数	= 四舍五入(刻度 * 采集进程.itemsize / (刻度 / 总刻度)) + 差数 + 总刻度
	秒	= 取时间间隔(#秒, 采集进程.startTime, 取系统时间())
	已用时间 = 秒转时间格式(秒)
	剩余时间 = 秒转时间格式(到长整数(到长整数(秒 / 当前) * (总数 - 当前)))
	百分比	= 四舍五入(刻度 / (总刻度+1) * 100)
	调试输出("<hr style=\"border:1px solid #DEEFFA\" /><table><tr><td width=250>项目: <font color='red'>"& 采集名称 &"</font></td><td>地址: <a href=\"javascript:void(0);\" onclick=\"window.open('"&地址&"','_blank');\"><font color='red'>"& 地址 &"</font></a></td></tr></table><table><tr><td width=35>进度:</td><td width=230><table width=150 border=0 cellpadding=0 cellspacing=0 style='float:left'><tr><td bgcolor=#0000FF height=12 align=right width='"&百分比&"%'></td><td bgcolor=red width='"&(100-百分比)&"%'></td></tr></table> "&百分比&"%</td><td width=120>统计：<font color=red>"&当前&"/" &总数& "<\/font></td><td width=100>待采列表 <font color=red>"&采集列表任务.count&"</font></td><td width=120>待采影片 <font color=red>"&采集影片任务.count&"</font></td><td width=150>剩余时间 <font color=red>" & 剩余时间 & "</font></td><td width=150>已用时间 <font color=red>" & 已用时间 & "</font></td></tr></table><hr style=\"border:1px solid #DEEFFA\" />")
}

采集完成(){
	采集进程.NextRunTime=获得下次执行时间(定时日段,定时时段)
	采集进程.ExitRun("采集完成")
	如果(获取影片图片方式 == 1)
		释放映象文件(#进程标识ID)
	结束如果
}

初始化(进程){
	如果(获取影片图片方式 == 1)
		释放映象文件(#进程标识ID)
	结束如果
	进程.startTime=取系统时间()
	如果(分页设置 == 0)
		采集列表任务.Add(采集网址)
	否则如果(分页设置 == 1)
		采集列表任务.Add(生成批量地址(生成分页,"{$ID}",开始页, 结束页, 倒序采集))
	否则如果(分页设置 == 2)
		采集列表任务.Add(分割文本(手动分页,#换行符))
	否则如果(分页设置 == 3)
		采集影片任务.Add(采集网址)
	结束如果
	进程.Count=如果真(分页设置 == 3,采集影片任务.Count,采集列表任务.Count)
}

只采集最近 = 到数字(只采集最近)
采集进程		= 创建采集进程(#进程标识ID,#当前模式)
采集进程.charset	= 网页编码
采集进程.onprogress	= 取函数指针(进度显示)
采集进程.oncomplete	= 取函数指针(采集完成)

采集列表任务		= 采集进程.CreateTask()
采集列表任务.onerror	= 取函数指针(采集失败)
采集列表任务.onsuccess	= 取函数指针(解释列表内容)

采集影片任务		= 采集进程.CreateTask()
采集影片任务.onerror	= 取函数指针(采集失败)
采集影片任务.onsuccess	= 取函数指针(解释影片内容)
采集进程.init		= 取函数指针(初始化)