mirror of
https://github.com/ProudMuBai/GoFilm.git
synced 2026-06-11 04:43:10 +08:00
cache picuter to server
This commit is contained in:
@@ -3,10 +3,15 @@ package config
|
|||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
定义一些数据库存放的key值
|
定义一些数据库存放的key值, 以及程序运行时的相关参数配置
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// -------------------------System Config-----------------------------------
|
||||||
const (
|
const (
|
||||||
|
|
||||||
|
// ListenerPort web服务监听的端口
|
||||||
|
ListenerPort = "3601"
|
||||||
|
|
||||||
// MAXGoroutine max goroutine, 执行spider中对协程的数量限制
|
// MAXGoroutine max goroutine, 执行spider中对协程的数量限制
|
||||||
MAXGoroutine = 10
|
MAXGoroutine = 10
|
||||||
|
|
||||||
@@ -17,11 +22,16 @@ const (
|
|||||||
// CornUpdateAll 每月28执行一次清库更新
|
// CornUpdateAll 每月28执行一次清库更新
|
||||||
CornUpdateAll = "0 0 2 28 * ?"
|
CornUpdateAll = "0 0 2 28 * ?"
|
||||||
|
|
||||||
// SpiderCipher 设置Spider触发指令
|
// SpiderCipher 设置Spider触发指令的验证
|
||||||
SpiderCipher = "Life in a different world from zero"
|
SpiderCipher = "Life in a different world from zero"
|
||||||
|
|
||||||
// -------------------------redis key-----------------------------------
|
// ImgCacheFlag 是否开启将主站影片图片放入本地进行存储
|
||||||
|
ImgCacheFlag = false
|
||||||
|
ImageDir = "./resource/static/images"
|
||||||
|
)
|
||||||
|
|
||||||
|
// -------------------------redis key-----------------------------------
|
||||||
|
const (
|
||||||
// CategoryTreeKey 分类树 key
|
// CategoryTreeKey 分类树 key
|
||||||
CategoryTreeKey = "CategoryTree"
|
CategoryTreeKey = "CategoryTree"
|
||||||
CategoryTreeExpired = time.Hour * 24 * 90
|
CategoryTreeExpired = time.Hour * 24 * 90
|
||||||
@@ -36,6 +46,12 @@ const (
|
|||||||
// MultipleSiteDetail 多站点影片信息存储key
|
// MultipleSiteDetail 多站点影片信息存储key
|
||||||
MultipleSiteDetail = "MultipleSource:%s"
|
MultipleSiteDetail = "MultipleSource:%s"
|
||||||
|
|
||||||
|
// SearchInfoTemp redis暂存检索数据信息
|
||||||
|
SearchInfoTemp = "Search:SearchInfoTemp"
|
||||||
|
|
||||||
|
SearchTitle = "Search:Pid%d:Title"
|
||||||
|
SearchTag = "Search:Pid%d:%s"
|
||||||
|
|
||||||
// SearchCount Search scan 识别范围
|
// SearchCount Search scan 识别范围
|
||||||
SearchCount = 3000
|
SearchCount = 3000
|
||||||
// SearchKeys Search Key Hash
|
// SearchKeys Search Key Hash
|
||||||
@@ -44,21 +60,16 @@ const (
|
|||||||
SearchScoreListKey = "Search:SearchScoreList"
|
SearchScoreListKey = "Search:SearchScoreList"
|
||||||
SearchTimeListKey = "Search:SearchTimeList"
|
SearchTimeListKey = "Search:SearchTimeList"
|
||||||
SearchHeatListKey = "Search:SearchHeatList"
|
SearchHeatListKey = "Search:SearchHeatList"
|
||||||
// SearchInfoTemp redis暂存检索数据信息
|
|
||||||
SearchInfoTemp = "Search:SearchInfoTemp"
|
|
||||||
|
|
||||||
SearchTitle = "Search:Pid%d:Title"
|
|
||||||
SearchTag = "Search:Pid%d:%s"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
/*API相关redis key*/
|
// -------------------------Web API相关redis key-----------------------------------
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// IndexCacheKey , 首页数据缓存
|
||||||
IndexCacheKey = "IndexCache"
|
IndexCacheKey = "IndexCache"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// -------------------------Database Connection Params-----------------------------------
|
||||||
const (
|
const (
|
||||||
|
|
||||||
// SearchTableName 存放检索信息的数据表名
|
// SearchTableName 存放检索信息的数据表名
|
||||||
SearchTableName = "search"
|
SearchTableName = "search"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"server/config"
|
||||||
"server/model"
|
"server/model"
|
||||||
"server/plugin/db"
|
"server/plugin/db"
|
||||||
"server/plugin/spider"
|
"server/plugin/spider"
|
||||||
@@ -33,7 +35,7 @@ func start() {
|
|||||||
spider.RegularUpdateMovie()
|
spider.RegularUpdateMovie()
|
||||||
// 开启路由监听
|
// 开启路由监听
|
||||||
r := router.SetupRouter()
|
r := router.SetupRouter()
|
||||||
_ = r.Run(`:3601`)
|
_ = r.Run(fmt.Sprintf(":%s", config.ListenerPort))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"server/config"
|
"server/config"
|
||||||
|
"server/plugin/common/util"
|
||||||
"server/plugin/db"
|
"server/plugin/db"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -91,6 +93,23 @@ type MovieDetail struct {
|
|||||||
|
|
||||||
// ===================================Redis数据交互========================================================
|
// ===================================Redis数据交互========================================================
|
||||||
|
|
||||||
|
// SaveMoviePic 保存影片图片到服务器
|
||||||
|
func SaveMoviePic(details ...*MovieDetail) {
|
||||||
|
for _, d := range details {
|
||||||
|
// 判断 detail 在redis中是否已经存在
|
||||||
|
if db.Rdb.Exists(db.Cxt, fmt.Sprintf(config.MovieDetailKey, d.Cid, d.Id)).Val() == 1 {
|
||||||
|
// 如果已经存在则直接continue
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 将影片信息中的pic图片下载保存到resource/images 文件夹下
|
||||||
|
err := util.SaveOnlineFile(d.Picture, config.ImageDir)
|
||||||
|
// 如果没有异常则将detail的图片路径替换为本地的保存路径
|
||||||
|
if err == nil {
|
||||||
|
d.Picture = fmt.Sprintf("http://127.0.0.1:%s/static/image/%s", config.ListenerPort, filepath.Base(d.Picture))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SaveDetails 保存影片详情信息到redis中 格式: MovieDetail:Cid?:Id?
|
// SaveDetails 保存影片详情信息到redis中 格式: MovieDetail:Cid?:Id?
|
||||||
func SaveDetails(list []MovieDetail) (err error) {
|
func SaveDetails(list []MovieDetail) (err error) {
|
||||||
// 遍历list中的信息
|
// 遍历list中的信息
|
||||||
|
|||||||
39
server/plugin/common/util/FileDownload.go
Normal file
39
server/plugin/common/util/FileDownload.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
数据请求保存,文件读写
|
||||||
|
*/
|
||||||
|
|
||||||
|
// SaveOnlineFile 保存网络文件, 提供下载url和保存路径, 返回保存后的文件访问url相对路径
|
||||||
|
func SaveOnlineFile(url, dir string) (err error) {
|
||||||
|
// 请求获取文件内容
|
||||||
|
r := &RequestInfo{Uri: url}
|
||||||
|
ApiGet(r)
|
||||||
|
// 创建保存文件的目录
|
||||||
|
if _, err = os.Stat(dir); os.IsNotExist(err) {
|
||||||
|
err = os.MkdirAll(dir, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 通过保存路径和url得到保存的具体的文件全路径
|
||||||
|
fileName := filepath.Join(dir, filepath.Base(url))
|
||||||
|
file, err := os.Create(fileName)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
//_, _ = file.Write(r.Resp)
|
||||||
|
|
||||||
|
writer := bufio.NewWriter(file)
|
||||||
|
_, err = writer.Write(r.Resp)
|
||||||
|
err = writer.Flush()
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package spider
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -12,6 +12,10 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
网络请求, 数据爬取
|
||||||
|
*/
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Client = CreateClient()
|
Client = CreateClient()
|
||||||
)
|
)
|
||||||
@@ -32,7 +36,7 @@ func CreateClient() *colly.Collector {
|
|||||||
c := colly.NewCollector()
|
c := colly.NewCollector()
|
||||||
|
|
||||||
// 设置请求使用clash的socks5代理
|
// 设置请求使用clash的socks5代理
|
||||||
//setProxy(c)
|
setProxy(c)
|
||||||
|
|
||||||
// 设置代理信息
|
// 设置代理信息
|
||||||
//if proxy, err := proxy.RoundRobinProxySwitcher("127.0.0.1:7890"); err != nil {
|
//if proxy, err := proxy.RoundRobinProxySwitcher("127.0.0.1:7890"); err != nil {
|
||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"server/config"
|
"server/config"
|
||||||
"server/model"
|
"server/model"
|
||||||
"server/plugin/common/dp"
|
"server/plugin/common/dp"
|
||||||
|
"server/plugin/common/util"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -66,7 +67,7 @@ func StartSpider() {
|
|||||||
SearchInfoToMdb()
|
SearchInfoToMdb()
|
||||||
model.AddSearchIndex()
|
model.AddSearchIndex()
|
||||||
log.Println("SearchInfoToMdb 影片检索信息保存完毕")
|
log.Println("SearchInfoToMdb 影片检索信息保存完毕")
|
||||||
//获取其他站点数据13
|
//获取其他站点数据
|
||||||
go MtSiteSpider()
|
go MtSiteSpider()
|
||||||
log.Println("Spider End , 数据保存执行完成")
|
log.Println("Spider End , 数据保存执行完成")
|
||||||
time.Sleep(time.Second * 10)
|
time.Sleep(time.Second * 10)
|
||||||
@@ -75,12 +76,12 @@ func StartSpider() {
|
|||||||
// CategoryList 获取分类数据
|
// CategoryList 获取分类数据
|
||||||
func CategoryList() {
|
func CategoryList() {
|
||||||
// 设置请求参数信息
|
// 设置请求参数信息
|
||||||
r := RequestInfo{Uri: MainSite, Params: url.Values{}}
|
r := util.RequestInfo{Uri: MainSite, Params: url.Values{}}
|
||||||
r.Params.Set(`ac`, "list")
|
r.Params.Set(`ac`, "list")
|
||||||
r.Params.Set(`pg`, "1")
|
r.Params.Set(`pg`, "1")
|
||||||
r.Params.Set(`t`, "1")
|
r.Params.Set(`t`, "1")
|
||||||
// 执行请求, 获取一次list数据
|
// 执行请求, 获取一次list数据
|
||||||
ApiGet(&r)
|
util.ApiGet(&r)
|
||||||
// 解析resp数据
|
// 解析resp数据
|
||||||
movieListInfo := model.MovieListInfo{}
|
movieListInfo := model.MovieListInfo{}
|
||||||
if len(r.Resp) <= 0 {
|
if len(r.Resp) <= 0 {
|
||||||
@@ -103,7 +104,7 @@ func CategoryList() {
|
|||||||
// MainSiteSpider 主站点数据处理
|
// MainSiteSpider 主站点数据处理
|
||||||
func MainSiteSpider() {
|
func MainSiteSpider() {
|
||||||
// 获取分页页数
|
// 获取分页页数
|
||||||
pageCount, err := GetPageCount(RequestInfo{Uri: MainSite, Params: url.Values{}})
|
pageCount, err := GetPageCount(util.RequestInfo{Uri: MainSite, Params: url.Values{}})
|
||||||
// 主站点分页出错直接终止程序
|
// 主站点分页出错直接终止程序
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -123,7 +124,7 @@ func MainSiteSpider() {
|
|||||||
if !ok {
|
if !ok {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
list, e := GetMovieDetail(pg, RequestInfo{Uri: MainSite, Params: url.Values{}})
|
list, e := GetMovieDetail(pg, util.RequestInfo{Uri: MainSite, Params: url.Values{}})
|
||||||
if e != nil {
|
if e != nil {
|
||||||
log.Println("GetMovieDetail Error: ", err)
|
log.Println("GetMovieDetail Error: ", err)
|
||||||
continue
|
continue
|
||||||
@@ -152,7 +153,7 @@ func MtSiteSpider() {
|
|||||||
// PlayDetailSpider SpiderSimpleInfo 获取单个站点的播放源
|
// PlayDetailSpider SpiderSimpleInfo 获取单个站点的播放源
|
||||||
func PlayDetailSpider(s Site) {
|
func PlayDetailSpider(s Site) {
|
||||||
// 获取分页页数
|
// 获取分页页数
|
||||||
pageCount, err := GetPageCount(RequestInfo{Uri: s.Uri, Params: url.Values{}})
|
pageCount, err := GetPageCount(util.RequestInfo{Uri: s.Uri, Params: url.Values{}})
|
||||||
// 出错直接终止当前站点数据获取
|
// 出错直接终止当前站点数据获取
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@@ -174,7 +175,7 @@ func PlayDetailSpider(s Site) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
list, e := GetMovieDetail(pg, RequestInfo{Uri: s.Uri, Params: url.Values{}})
|
list, e := GetMovieDetail(pg, util.RequestInfo{Uri: s.Uri, Params: url.Values{}})
|
||||||
if e != nil || len(list) <= 0 {
|
if e != nil || len(list) <= 0 {
|
||||||
log.Println("GetMovieDetail Error: ", err)
|
log.Println("GetMovieDetail Error: ", err)
|
||||||
continue
|
continue
|
||||||
@@ -221,7 +222,7 @@ func UpdateMovieDetail() {
|
|||||||
// UpdateMainDetail 更新主站点的最新影片
|
// UpdateMainDetail 更新主站点的最新影片
|
||||||
func UpdateMainDetail() {
|
func UpdateMainDetail() {
|
||||||
// 获取分页页数
|
// 获取分页页数
|
||||||
r := RequestInfo{Uri: MainSite, Params: url.Values{}}
|
r := util.RequestInfo{Uri: MainSite, Params: url.Values{}}
|
||||||
r.Params.Set("h", config.UpdateInterval)
|
r.Params.Set("h", config.UpdateInterval)
|
||||||
pageCount, err := GetPageCount(r)
|
pageCount, err := GetPageCount(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -256,7 +257,7 @@ func UpdateMainDetail() {
|
|||||||
func UpdatePlayDetail() {
|
func UpdatePlayDetail() {
|
||||||
for _, s := range SiteList {
|
for _, s := range SiteList {
|
||||||
// 获取单个站点的分页数
|
// 获取单个站点的分页数
|
||||||
r := RequestInfo{Uri: s.Uri, Params: url.Values{}}
|
r := util.RequestInfo{Uri: s.Uri, Params: url.Values{}}
|
||||||
r.Params.Set("h", config.UpdateInterval)
|
r.Params.Set("h", config.UpdateInterval)
|
||||||
pageCount, err := GetPageCount(r)
|
pageCount, err := GetPageCount(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -288,11 +289,11 @@ func StartSpiderRe() {
|
|||||||
// =========================公共方法==============================
|
// =========================公共方法==============================
|
||||||
|
|
||||||
// GetPageCount 获取总页数
|
// GetPageCount 获取总页数
|
||||||
func GetPageCount(r RequestInfo) (count int, err error) {
|
func GetPageCount(r util.RequestInfo) (count int, err error) {
|
||||||
// 发送请求获取pageCount
|
// 发送请求获取pageCount
|
||||||
r.Params.Set("ac", "detail")
|
r.Params.Set("ac", "detail")
|
||||||
r.Params.Set("pg", "2")
|
r.Params.Set("pg", "2")
|
||||||
ApiGet(&r)
|
util.ApiGet(&r)
|
||||||
// 判断请求结果是否为空, 如果为空直接输出错误并终止
|
// 判断请求结果是否为空, 如果为空直接输出错误并终止
|
||||||
if len(r.Resp) <= 0 {
|
if len(r.Resp) <= 0 {
|
||||||
err = errors.New("response is empty")
|
err = errors.New("response is empty")
|
||||||
@@ -309,7 +310,7 @@ func GetPageCount(r RequestInfo) (count int, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetMovieDetail 处理详情接口请求返回的数据
|
// GetMovieDetail 处理详情接口请求返回的数据
|
||||||
func GetMovieDetail(pageNumber int, r RequestInfo) (list []model.MovieDetail, err error) {
|
func GetMovieDetail(pageNumber int, r util.RequestInfo) (list []model.MovieDetail, err error) {
|
||||||
// 防止json解析异常引发panic
|
// 防止json解析异常引发panic
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
@@ -319,7 +320,7 @@ func GetMovieDetail(pageNumber int, r RequestInfo) (list []model.MovieDetail, er
|
|||||||
// 设置分页请求参数
|
// 设置分页请求参数
|
||||||
r.Params.Set(`ac`, `detail`)
|
r.Params.Set(`ac`, `detail`)
|
||||||
r.Params.Set(`pg`, fmt.Sprint(pageNumber))
|
r.Params.Set(`pg`, fmt.Sprint(pageNumber))
|
||||||
ApiGet(&r)
|
util.ApiGet(&r)
|
||||||
// 影视详情信息
|
// 影视详情信息
|
||||||
details := model.DetailListInfo{}
|
details := model.DetailListInfo{}
|
||||||
// 如果返回数据为空则直接结束本次循环
|
// 如果返回数据为空则直接结束本次循环
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"server/config"
|
||||||
"server/controller"
|
"server/controller"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,6 +14,9 @@ func SetupRouter() *gin.Engine {
|
|||||||
// 开启跨域
|
// 开启跨域
|
||||||
r.Use(Cors())
|
r.Use(Cors())
|
||||||
|
|
||||||
|
// 静态资源配置
|
||||||
|
r.Static("/static/image", config.ImageDir)
|
||||||
|
|
||||||
r.GET(`/index`, controller.Index)
|
r.GET(`/index`, controller.Index)
|
||||||
r.GET(`/navCategory`, controller.CategoriesInfo)
|
r.GET(`/navCategory`, controller.CategoriesInfo)
|
||||||
r.GET(`/filmDetail`, controller.FilmDetail)
|
r.GET(`/filmDetail`, controller.FilmDetail)
|
||||||
|
|||||||
Reference in New Issue
Block a user