mirror of
https://github.com/ProudMuBai/GoFilm.git
synced 2026-02-28 07:44:41 +08:00
optimize updates
This commit is contained in:
@@ -12,4 +12,6 @@ func TableInIt() {
|
||||
system.CreateSearchTable()
|
||||
// 创建图片信息管理表
|
||||
system.CreateFileTable()
|
||||
// 创建采集失效记录表
|
||||
system.CreateFailureRecordTable()
|
||||
}
|
||||
|
||||
@@ -21,20 +21,21 @@ func FilmSourceInit() {
|
||||
return
|
||||
}
|
||||
var l []system.FilmSource = []system.FilmSource{
|
||||
{Id: util.GenerateSalt(), Name: "HD(LZ)", Uri: `https://cj.lzcaiji.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
{Id: util.GenerateSalt(), Name: "HD(BF)", Uri: `https://bfzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true, Interval: 2500},
|
||||
{Id: util.GenerateSalt(), Name: "HD(FF)", Uri: `http://cj.ffzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
{Id: util.GenerateSalt(), Name: "HD(OK)", Uri: `https://okzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
{Id: util.GenerateSalt(), Name: "HD(HM)", Uri: `https://json.heimuer.xyz/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
{Id: util.GenerateSalt(), Name: "HD(LY)", Uri: `https://360zy.com/api.php/provide/vod/at/json`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
{Id: util.GenerateSalt(), Name: "HD(YZ)", Uri: `https://api.1080zyku.com/inc/apijson.php`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
{Id: util.GenerateSalt(), Name: "HD(kk)", Uri: `https://kuaikan-api.com/api.php/provide/vod/from/kuaikan/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
{Id: util.GenerateSalt(), Name: "HD(SN)", Uri: `https://suoniapi.com/api.php/provide/vod/from/snm3u8/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true, Interval: 2000},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(LZ)", Uri: `https://cj.lziapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(lzBk)", Uri: `https://cj.lzcaiji.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(fs)", Uri: `https://www.feisuzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(bfApp)", Uri: `http://app.bfzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: true},
|
||||
//Id: util.GenerateSalt(), {Name: "HD(bfBk)", Uri: `http://by.bfzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false,CollectType:system.CollectVideo, State: false},
|
||||
{Id: util.GenerateSalt(), Name: "HD(LZ)", Uri: `https://cj.lziapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
{Id: util.GenerateSalt(), Name: "HD(BF)", Uri: `https://bfzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false, Interval: 2500},
|
||||
{Id: util.GenerateSalt(), Name: "HD(FF)", Uri: `http://cj.ffzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
{Id: util.GenerateSalt(), Name: "HD(OK)", Uri: `https://okzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
{Id: util.GenerateSalt(), Name: "HD(HM)", Uri: `https://json.heimuer.xyz/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
{Id: util.GenerateSalt(), Name: "HD(LY)", Uri: `https://360zy.com/api.php/provide/vod/at/json`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
{Id: util.GenerateSalt(), Name: "HD(SN)", Uri: `https://suoniapi.com/api.php/provide/vod/from/snm3u8/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false, Interval: 2000},
|
||||
{Id: util.GenerateSalt(), Name: "HD(DB)", Uri: `https://caiji.dbzy.tv/api.php/provide/vod/from/dbm3u8/at/josn/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
{Id: util.GenerateSalt(), Name: "HD(IK)", Uri: `https://ikunzyapi.com/api.php/provide/vod/at/json`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
//{Id: util.GenerateSalt(), Name: "WX(T2)", Uri: `https://api.wuxianzy.net/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
//{Id: util.GenerateSalt(), Name: "OK(BK)", Uri: `https://api.okzy.org/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(HW)", Uri: `https://cjhwba.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false, Interval: 3000},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(lzBk)", Uri: `https://cj.lzcaiji.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(fs)", Uri: `https://www.feisuzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
//{Id: util.GenerateSalt(), Name: "HD(bfBk)", Uri: `http://app.bfzyapi.com/api.php/provide/vod/`, ResultModel: system.JsonResult, Grade: system.SlaveCollect, SyncPictures: false, CollectType: system.CollectVideo, State: false},
|
||||
}
|
||||
err := system.SaveCollectSourceList(l)
|
||||
if err != nil {
|
||||
@@ -67,16 +68,28 @@ func CollectCrontabInit() {
|
||||
}
|
||||
// 将定时任务Id记录到Task中
|
||||
task.Cid = cid
|
||||
case 2:
|
||||
cid, err := spider.AddFilmRecoverCron(task.Spec)
|
||||
// 如果任务添加失败则直接返回错误信息
|
||||
if err != nil {
|
||||
log.Println("自动清理失败采集记录定时任务添加失败: ", err.Error())
|
||||
continue
|
||||
}
|
||||
// 将定时任务Id记录到Task中
|
||||
task.Cid = cid
|
||||
}
|
||||
system.UpdateFilmTask(task)
|
||||
}
|
||||
} else {
|
||||
// 如果系统中不存在任何定时任务信息, 则添加默认的定时任务
|
||||
// 1. 添加一条默认任务, 定时更新所有已启用站点的影片信息
|
||||
// 生成任务信息
|
||||
/*
|
||||
如果系统中不存在任何定时任务信息, 则添加默认的定时任务
|
||||
1. 添加一条默认任务, 定时更新所有已启用站点的影片信息
|
||||
2. 添加一条默认任务, 定时处理采集失败的记录
|
||||
3.生成任务信息
|
||||
*/
|
||||
task := system.FilmCollectTask{Id: util.GenerateSalt(), Time: config.DefaultUpdateTime, Spec: config.DefaultUpdateSpec,
|
||||
Model: 0, State: false, Remark: "每20分钟执行一次已启用站点数据的自动更新"}
|
||||
// 添加一条定时任务
|
||||
// 添加一条定时任务-影片定时更新
|
||||
cid, err := spider.AddAutoUpdateCron(task.Id, task.Spec)
|
||||
// 如果任务添加失败则直接返回错误信息
|
||||
if err != nil {
|
||||
@@ -87,6 +100,21 @@ func CollectCrontabInit() {
|
||||
task.Cid = cid
|
||||
// 如果没有异常则将当前定时任务信息记录到redis中
|
||||
system.SaveFilmTask(task)
|
||||
|
||||
// 添加一条定时任务-定期处理失败请求
|
||||
recoverTask := system.FilmCollectTask{Id: util.GenerateSalt(), Time: 0, Spec: config.EveryWeekSpec,
|
||||
Model: 2, State: false, Remark: "每周日凌晨4点清理一次采集失败的采集记录"}
|
||||
// 添加一条定时任务-影片定时更新
|
||||
cid, err = spider.AddFilmRecoverCron(recoverTask.Spec)
|
||||
// 如果任务添加失败则直接返回错误信息
|
||||
if err != nil {
|
||||
log.Println("失败采集恢复定时任务添加失败: ", err.Error())
|
||||
return
|
||||
}
|
||||
// 将定时任务Id记录到Task中
|
||||
recoverTask.Cid = cid
|
||||
// 如果没有异常则将当前定时任务信息记录到redis中
|
||||
system.SaveFilmTask(recoverTask)
|
||||
}
|
||||
|
||||
// 完成初始化后启动 Cron
|
||||
|
||||
@@ -26,6 +26,7 @@ type RequestInfo struct {
|
||||
Params url.Values `json:"param"` // 请求参数
|
||||
Header http.Header `json:"header"` // 请求头数据
|
||||
Resp []byte `json:"resp"` // 响应结果数据
|
||||
Err string `json:"err"` // 错误信息
|
||||
}
|
||||
|
||||
// RefererUrl 记录上次请求的url
|
||||
@@ -95,6 +96,7 @@ func ApiGet(r *RequestInfo) {
|
||||
// 处理请求参数
|
||||
err := Client.Visit(fmt.Sprintf("%s?%s", r.Uri, r.Params.Encode()))
|
||||
if err != nil {
|
||||
r.Err = err.Error()
|
||||
log.Println("获取数据失败: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package db
|
||||
import (
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
"gorm.io/gorm/schema"
|
||||
"server/config"
|
||||
)
|
||||
@@ -24,7 +25,7 @@ func InitMysql() (err error) {
|
||||
SingularTable: true, //是否使用 结构体名称作为表名 (关闭自动变复数)
|
||||
//NameReplacer: strings.NewReplacer("spider_", ""), // 替表名和字段中的 Me 为 空
|
||||
},
|
||||
//Logger: logger.Default.LogMode(logger.Info), //设置日志级别为Info
|
||||
Logger: logger.Default.LogMode(logger.Info), //设置日志级别为Info
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"net/url"
|
||||
"server/config"
|
||||
"server/model/collect"
|
||||
@@ -126,7 +127,7 @@ func CollectCategory(s *system.FilmSource) {
|
||||
}
|
||||
}
|
||||
|
||||
// 影视详情采集
|
||||
// collectFilm 影视详情采集 (单一源分页全采集)
|
||||
func collectFilm(s *system.FilmSource, h, pg int) {
|
||||
// 生成请求参数
|
||||
r := util.RequestInfo{Uri: s.Uri, Params: url.Values{}}
|
||||
@@ -139,6 +140,9 @@ func collectFilm(s *system.FilmSource, h, pg int) {
|
||||
// 执行采集方法 获取影片详情list
|
||||
list, err := spiderCore.GetFilmDetail(r)
|
||||
if err != nil || len(list) <= 0 {
|
||||
// 添加采集失败记录
|
||||
fr := system.FailureRecord{OriginId: s.Id, OriginName: s.Name, Uri: s.Uri, CollectType: system.CollectVideo, PageNumber: pg, Hour: h, Cause: fmt.Sprintln(err), Status: 1}
|
||||
system.SaveFailureRecord(fr)
|
||||
log.Println("GetMovieDetail Error: ", err)
|
||||
return
|
||||
}
|
||||
@@ -163,6 +167,41 @@ func collectFilm(s *system.FilmSource, h, pg int) {
|
||||
}
|
||||
}
|
||||
|
||||
// collectFilmById 采集指定ID的影片信息
|
||||
func collectFilmById(ids string, s *system.FilmSource) {
|
||||
// 生成请求参数
|
||||
r := util.RequestInfo{Uri: s.Uri, Params: url.Values{}}
|
||||
// 设置分页页数
|
||||
r.Params.Set("pg", "1")
|
||||
// 设置影片IDS参数信息
|
||||
r.Params.Set("ids", ids)
|
||||
// 执行采集方法 获取影片详情list
|
||||
list, err := spiderCore.GetFilmDetail(r)
|
||||
if err != nil || len(list) <= 0 {
|
||||
log.Println("GetMovieDetail Error: ", err)
|
||||
return
|
||||
}
|
||||
// 通过采集站 Grade 类型, 执行不同的存储逻辑
|
||||
switch s.Grade {
|
||||
case system.MasterCollect:
|
||||
// 主站点 保存完整影片详情信息到 redis 和 mysql 中
|
||||
if err = system.SaveDetail(list[0]); err != nil {
|
||||
log.Println("SaveDetails Error: ", err)
|
||||
}
|
||||
// 如果主站点开启了图片同步, 则将图片url以及对应的mid存入ZSet集合中
|
||||
if s.SyncPictures {
|
||||
if err = system.SaveVirtualPic(conver.ConvertVirtualPicture(list)); err != nil {
|
||||
log.Println("SaveVirtualPic Error: ", err)
|
||||
}
|
||||
}
|
||||
case system.SlaveCollect:
|
||||
// 附属站点 仅保存影片播放信息到redis
|
||||
if err = system.SaveSitePlayList(s.Id, list); err != nil {
|
||||
log.Println("SaveDetails Error: ", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ConcurrentPageSpider 并发分页采集, 不限类型
|
||||
func ConcurrentPageSpider(capacity int, s *system.FilmSource, h int, collectFunc func(s *system.FilmSource, hour, pageNumber int)) {
|
||||
// 开启协程并发执行
|
||||
@@ -191,7 +230,7 @@ func ConcurrentPageSpider(capacity int, s *system.FilmSource, h int, collectFunc
|
||||
}
|
||||
}()
|
||||
}
|
||||
for i := 0; i < config.MAXGoroutine; i++ {
|
||||
for i := 0; i < GoroutineNum; i++ {
|
||||
<-waitCh
|
||||
}
|
||||
}
|
||||
@@ -229,7 +268,7 @@ func AutoCollect(h int) {
|
||||
}
|
||||
}
|
||||
|
||||
// ClearSpider 删除已采集的影片信息
|
||||
// ClearSpider 删除所有已采集的影片信息
|
||||
func ClearSpider() {
|
||||
system.FilmZero()
|
||||
}
|
||||
@@ -242,6 +281,80 @@ func StarZero(h int) {
|
||||
AutoCollect(h)
|
||||
}
|
||||
|
||||
// CollectSingleFilm 通过影片唯一ID获取影片信息
|
||||
func CollectSingleFilm(ids string) {
|
||||
// 获取采集站列表信息
|
||||
fl := system.GetCollectSourceList()
|
||||
// 循环遍历所有采集站信息
|
||||
for _, f := range fl {
|
||||
// 目前仅对主站点进行处理
|
||||
if f.Grade == system.MasterCollect && f.State {
|
||||
collectFilmById(ids, &f)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ======================================================= 采集拓展内容 =======================================================
|
||||
|
||||
// SingleRecoverSpider 二次采集
|
||||
func SingleRecoverSpider(fr *system.FailureRecord) {
|
||||
// 通过采集时长范围执行不同的采集方式
|
||||
switch {
|
||||
case fr.Hour > 168 && fr.Hour < 360:
|
||||
// 将此记录之后的所有同类采集记录变更为已重试
|
||||
system.ChangeRecord(fr, 0)
|
||||
// 如果采集的内容是 7~15 天之内更新的内容,则采集此记录之后的所有更新内容
|
||||
// 获取采集参数h, 采集时长变更为 原采集时长 + 采集记录距现在的时长
|
||||
h := fr.Hour + int(math.Ceil(time.Since(fr.CreatedAt).Hours()))
|
||||
// 对当前所有已启用的站点 更新最新 h 小时的内容
|
||||
AutoCollect(h)
|
||||
case fr.Hour < 0, fr.Hour > 4320:
|
||||
// 将此记录状态修改为已重试
|
||||
system.ChangeRecord(fr, 0)
|
||||
// 如果采集的是 最近180天内更新的内容 或全部内容, 则只对当前一条记录进行二次采集
|
||||
s := system.FindCollectSourceById(fr.OriginId)
|
||||
collectFilm(s, fr.Hour, fr.PageNumber)
|
||||
default:
|
||||
// 其余范围,暂不处理
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// FullRecoverSpider 扫描记录表中的失败记录, 并进行处理 (用于定时任务定期处理失败采集)
|
||||
func FullRecoverSpider() {
|
||||
/*
|
||||
获取待处理的记录数据
|
||||
1. 采集时长 > 168h (一周,7天) 状态-1 待处理, | 只获取满足条件的最早的待处理记录
|
||||
2. 采集时长 > 4320h (半年,180天) 状态-1 待处理, | 获取满足条件的所有数据
|
||||
*/
|
||||
list := system.PendingRecord()
|
||||
|
||||
// 遍历记录信息切片, 针对不同时长进行不同处理
|
||||
for _, fr := range list {
|
||||
switch {
|
||||
case fr.Hour > 0 && fr.Hour < 4320:
|
||||
// 将此记录之后的所有同类采集记录变更为已重试
|
||||
system.ChangeRecord(&fr, 0)
|
||||
// 如果采集的内容是 0~180 天之内更新的内容,则采集此记录之后的所有更新内容
|
||||
// 获取采集参数h, 采集时长变更为 原采集时长 + 采集记录距现在的时长
|
||||
h := fr.Hour + int(math.Ceil(time.Since(fr.CreatedAt).Hours()))
|
||||
// 对当前所有已启用的站点 更新最新 h 小时的内容
|
||||
AutoCollect(h)
|
||||
case fr.Hour < 0, fr.Hour > 4320:
|
||||
// 将此记录状态修改为已重试
|
||||
system.ChangeRecord(&fr, 0)
|
||||
// 如果采集的是 180天之前更新的内容 或全部内容, 则只对当前一条记录进行二次采集
|
||||
s := system.FindCollectSourceById(fr.OriginId)
|
||||
collectFilm(s, fr.Hour, fr.PageNumber)
|
||||
default:
|
||||
// 其余范围,暂不处理
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// ======================================================= 公共方法 =======================================================
|
||||
|
||||
// CollectApiTest 测试采集接口是否可用
|
||||
|
||||
@@ -93,7 +93,7 @@ func (jc *JsonCollect) GetFilmDetail(r util.RequestInfo) (list []system.MovieDet
|
||||
//details := system.DetailListInfo{}
|
||||
// 如果返回数据为空则直接结束本次循环
|
||||
if len(r.Resp) <= 0 {
|
||||
err = errors.New("response is empty")
|
||||
err = errors.New(r.Err)
|
||||
return
|
||||
}
|
||||
// 序列化详情数据
|
||||
@@ -132,6 +132,23 @@ func (jc *JsonCollect) GetSingleFilm(r util.RequestInfo, ids string) {
|
||||
//
|
||||
}
|
||||
|
||||
// FailureRecord 记录失败采集的相关信息, 用于后续采集重试操作
|
||||
func (jc *JsonCollect) FailureRecord(r util.RequestInfo) {
|
||||
// 记录采集失败时的采集参数
|
||||
|
||||
// 1. 采集站信息 (ID)
|
||||
|
||||
// 2. 采集参数, h 最新x小时影片, pg 页码
|
||||
|
||||
// 3. 将失败信息记录到redis ZSet集合中, score - time | member - data
|
||||
|
||||
}
|
||||
|
||||
// FilmDetailRetry 影片详情重试机制
|
||||
func (jc *JsonCollect) FilmDetailRetry(r util.RequestInfo) {
|
||||
|
||||
}
|
||||
|
||||
// ------------------------------------------------- XML Collect -------------------------------------------------
|
||||
|
||||
// XmlCollect 处理返回值为XML格式的采集数据
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
"log"
|
||||
"server/config"
|
||||
"server/model/system"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -19,7 +18,7 @@ func CreateCron() *cron.Cron {
|
||||
return cron.New(cron.WithSeconds())
|
||||
}
|
||||
|
||||
// AddFilmUpdateCron 添加影片更新定时任务
|
||||
// AddFilmUpdateCron 添加 指定站点的影片更新定时任务
|
||||
func AddFilmUpdateCron(id, spec string) (cron.EntryID, error) {
|
||||
// 校验 spec 表达式的有效性
|
||||
if err := ValidSpec(spec); err != nil {
|
||||
@@ -41,7 +40,7 @@ func AddFilmUpdateCron(id, spec string) (cron.EntryID, error) {
|
||||
})
|
||||
}
|
||||
|
||||
// AddAutoUpdateCron 自动更新定时任务
|
||||
// AddAutoUpdateCron 添加 所有已启用站点的影片更新定时任务
|
||||
func AddAutoUpdateCron(id, spec string) (cron.EntryID, error) {
|
||||
// 校验 spec 表达式的有效性
|
||||
if err := ValidSpec(spec); err != nil {
|
||||
@@ -61,6 +60,19 @@ func AddAutoUpdateCron(id, spec string) (cron.EntryID, error) {
|
||||
})
|
||||
}
|
||||
|
||||
// AddFilmRecoverCron 失败采集记录处理
|
||||
func AddFilmRecoverCron(spec string) (cron.EntryID, error) {
|
||||
// 校验 spec 表达式的有效性
|
||||
if err := ValidSpec(spec); err != nil {
|
||||
return -99, errors.New(fmt.Sprint("定时任务添加失败,Cron表达式校验失败: ", err.Error()))
|
||||
}
|
||||
return CronCollect.AddFunc(spec, func() {
|
||||
// 执行失败采集记录恢复
|
||||
FullRecoverSpider()
|
||||
log.Println("执行一次失败采集恢复任务")
|
||||
})
|
||||
}
|
||||
|
||||
// RemoveCron 删除定时任务
|
||||
func RemoveCron(id cron.EntryID) {
|
||||
// 通过定时任务EntryID移出对应的定时任务
|
||||
@@ -69,8 +81,8 @@ func RemoveCron(id cron.EntryID) {
|
||||
|
||||
// GetEntryById 返回定时任务的相关时间信息
|
||||
func GetEntryById(id cron.EntryID) cron.Entry {
|
||||
log.Printf("%+v\n", CronCollect.Entries())
|
||||
log.Println("", CronCollect.Entry(id).Next.Format(time.DateTime))
|
||||
//log.Printf("CronInfo: %+v\n", CronCollect.Entries())
|
||||
//log.Println("Corn Next Execute Time:", CronCollect.Entry(id).Next.Format(time.DateTime))
|
||||
return CronCollect.Entry(id)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user