// 数据初始化 func (this *BaseController) Prepare() { // 获取今天日期 t := time.Now().Format("20060102") // 定义一个日志模型 var sclog models.SC_Log // 查询今天入库数量 models.GetOneByQuery(models.DbLog, bson.M{"day": t}, &sclog) // 添加到模板中 this.Data["Today"] = sclog.PutNums // 获取所有种子数量 all := models.Count(models.DbInfo, nil) // 使用到模板中 this.Data["All"] = all // 判断用户语言 if this.setLang() { i := strings.Index(this.Ctx.Request.RequestURI, "?") this.Redirect(this.Ctx.Request.RequestURI[:i], 302) return } }
// 搜索页 func (this *IndexController) Search() { // 获取搜索关键字 key := this.Ctx.Input.Param(":k") // 获取排序方式 sort := this.Ctx.Input.Param(":sort") // 设置排序方式 this.Data["Sort"] = sort if sort == "" { this.Data["Sort"] = "puttime" sort = "-hot" } sort = "-" + sort // 设置搜索词 this.Data["Key"] = key // 定义两个SC_Info列表 var infos, newlist, hots []models.SC_Info // 获取热门种子列表 models.GetDataByQuery(models.DbInfo, 0, 5, "-hot", nil, &hots) // 设置热门列表 this.Data["HotList"] = hots // 获取最新入库 models.GetDataByQuery(models.DbInfo, 0, 10, "-puttime", nil, &newlist) // 设置最新入库 this.Data["NewList"] = newlist // 设置查询条件 query := bson.M{"$or": []bson.M{bson.M{"caption": bson.M{"$regex": bson.RegEx{key, "i"}}}, bson.M{"keys": bson.M{"$regex": bson.RegEx{key, "i"}}}}} // 获取种子数量 count := models.Count(models.DbInfo, query) // 设置数量 this.Data["Nums"] = count // 获取分页数据 page := pagination.NewPaginator(this.Ctx.Request, 15, count) // 设置分页数据 this.Data["paginator"] = page // 获取种子列表 models.GetDataByQuery(models.DbInfo, page.Offset(), 15, sort, query, &infos) // 设置种子列表 this.Data["Lists"] = infos // 定义三个SC_Search列表 var randomlist, lastsearch, relevantsearch []models.SC_Search // 设置查询条件 query = bson.M{"$or": []bson.M{bson.M{"caption": bson.M{"$regex": bson.RegEx{key, "i"}}}}} // 获取相关搜索 models.GetDataByQuery(models.DbSearch, 0, 10, "-searchtime", query, &relevantsearch) // 设置相关搜索 this.Data["RelevantList"] = relevantsearch // 获取热门搜索 models.GetDataByQuery(models.DbSearch, 0, 10, "-views", nil, &randomlist) // 设置热门搜索 this.Data["RandomList"] = randomlist // 获取最近搜索 models.GetDataByQuery(models.DbSearch, 0, 10, "-searchtime", nil, &lastsearch) // 设置最后搜索 this.Data["LastSearch"] = lastsearch // 定义一个SC_Search var scsearch models.SC_Search // 设置关键字 scsearch.Caption = key // 设置查询次数 scsearch.Views = 1 // 设置查询到的数据总量 scsearch.Count = count // 保存数据 scsearch.Save() // 自增查询次数 models.SaveLog(time.Now().Format("20060102"), "searchnums") // 输出模板 this.TplNames = "list.html" }
// 入库主函数 func Put() { // 设置最大允许使用CPU核心数 runtime.GOMAXPROCS(2) // 定义一个通道 chReq := make(chan models.SC_Hash, 10) // 定义一个通道 chRes := make(chan string, 10) // 无限循环入库种子 for { // 获取未入库hash总量 allcount := models.Count(models.DbHash, bson.M{"isput": false, "invalid": bson.M{"$lte": 3}}) // 如果数量小于1 if allcount < 1 { // 停顿10秒 time.Sleep(10 * time.Second) // 跳过本次循环 continue } for ai := 0; ai < allcount; { // 定义一个SC_Hash列表 var sc_hash []models.SC_Hash // 获取100条infohash models.GetDataByQuery(models.DbHash, ai, (ai + 100), "-hot", bson.M{"isput": false, "invalid": bson.M{"$lte": 3}}, &sc_hash) // 获取到的总量 count := len(sc_hash) // 循环处理infohash, 每次处理进程为自定义进程数 for i := 0; i < 10; i++ { go func() { // 循环处理 for { // 循环接受通道传递过来的infohash schash := <-chReq // 检查infohash是否已经入库 if models.Has(models.DbInfo, bson.M{"infohash": strings.ToUpper(schash.InfoHash)}) { // 入库则输出跳过信息 chRes <- fmt.Sprintf("'%s' Skip......", schash.InfoHash) // 将hash设置为已入库 models.SetPut(schash.InfoHash) // 跳过本次循环 continue } // 定义一个string变量, 记录处理结果 var str string // 入库种子信息 ret, err := PullTorrent(schash.InfoHash) if err == nil && ret == 0 { // 设置成功信息 str = fmt.Sprintf("Storage InfoHash '%s' Success......", schash.InfoHash) } else { // 设置失败信息 str = fmt.Sprintf("Can not download '%s' torrent file......", schash.InfoHash) } // 传递处理结果 chRes <- str } }() } go func() { // 定义一个hashs列表 hashs := make([]models.SC_Hash, count) // 循环将infohash加入hashs列表 for i := 0; i < count; i++ { hashs[i] = sc_hash[i] } // 传递infohash给通道 for i := 0; i < count; i++ { chReq <- hashs[i] } }() // 循环处理入库结果 for i := 0; i < count; i++ { // 接收入库结果 str := <-chRes // 如果允许显示则显示 if models.DbConfig.ShowMsg && str != "" { fmt.Println(str) } else { // 否则不显示 _ = str } } } } }