New version trial

This commit is contained in:
mubai
2026-04-05 20:00:40 +08:00
parent 557ee42ebb
commit 06dc25d2f2
18 changed files with 537 additions and 211 deletions

View File

@@ -1,17 +1,27 @@
FROM golang:latest
FROM golang:tip-alpine3.23 AS builder
ENV GO111MODULE=auto \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
GOPROXY=https://goproxy.cn,direct
RUN apk add --no-cache ca-certificates git build-base
MAINTAINER "bai"
WORKDIR /opt/server
ADD ./server /opt/server
RUN go build main.go
EXPOSE 3061
WORKDIR /build
COPY ./server/go.mod ./server/go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY ./server .
RUN --mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -ldflags="-s -w" -o /build/gofilm ./main.go
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /build/gofilm /gofilm
ENTRYPOINT ["/gofilm"]

View File

@@ -136,7 +136,9 @@ mysql:
### 5. 管理后台基本使用说明
- 访问 http://xxx.xxx.xxx/manage 进行登录, 用户名 密码: `admin admin` , 登录成功后自行修改
- 详情使用说明前往: [MuBaiBoat](https://blog.mubai.link/procedure/application/github/GoFilm/)个人博客观看
- 访问 http://xxx.xxx.xxx/manage 进行登录, 初始用户名/密码: `admin admin` , 登录成功后自行修改
- 使用 `采集管理 -> 影视采集` 功能进行采集站信息的添加和更新, 系统初始化时有预留站点信息, 自行斟酌选择
- 首先选择一个站点为主站点, 然后选择 采集一周, 一天, 或 全部, 进行主站点的数据采集, (前台数据全来自于主站点, 因此主站点只需要存在一个, 否则会冲突)
- 主站点信息采集完成后则可在 影片管理 -> 影视分类 中进行主页分类展示信息的设置, 选择需要展示的分类信息, 以及分类的名称管理 (自行摸索如何使用)
@@ -144,4 +146,6 @@ mysql:
- 定时任务:
- 系统默认添加一条规则, 但未启用, 该规则为每20分钟更新一次所有已开启的采集站的近3小时内更新的数据, 开启后则基本满足资源更新需求
- 可自定义定时任务, 使用相关功能可自主选择对某些站点进行定时更新功能
- 每周日对采集失败的记录进行二次采集处理
- 每周日对近期采集数据进行同步入库

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -11,8 +11,8 @@
<meta charset="UTF-8"/>
<title>(╥﹏╥)</title>
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_3992367_d9xdu8zk04f.css">
<script type="module" crossorigin src="/assets/index-ChHS3BBc.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-b0J83Qwy.css">
<script type="module" crossorigin src="/assets/index-C7tICDmk.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DYf3Lkog.css">
</head>
<body>
<div id="app"></div>

View File

@@ -102,7 +102,6 @@ const (
FailureRecordTableName = "failure_records"
//mysql服务配置信息 root:root 设置mysql账户的用户名和密码
MysqlDsn = "root:root@(mysql:3306)/FilmSite?charset=utf8mb4&parseTime=True&loc=Local"
// Redis连接信息

View File

@@ -177,6 +177,7 @@ func DelSlaveMovieInfos(id string) {
//}
}
// AddMovieDetailIndex 添加详情表索引
func AddMovieDetailIndex() {
var m MovieDetail
tableName := m.TableName()
@@ -184,14 +185,16 @@ func AddMovieDetailIndex() {
db.Mdb.Exec(fmt.Sprintf("CREATE UNIQUE INDEX idx_mid ON %s (mid)", tableName))
}
// AddSlaveMovieInfoIndex 添加附属站点信息表索引
func AddSlaveMovieInfoIndex() {
var s SlaveMovieInfo
tableName := s.TableName()
// 如果不存在索引则创建对应索引
if !db.Mdb.Migrator().HasIndex(&s, "idx_mid") {
// 添加索引
db.Mdb.Exec(fmt.Sprintf("CREATE INDEX idx_mid ON %s (mid)", tableName))
db.Mdb.Exec(fmt.Sprintf("CREATE INDEX idx_dbId ON %s (db_id)", tableName))
db.Mdb.Exec(fmt.Sprintf("CREATE INDEX idx_sid ON %s (sid DESC)", tableName))
db.Mdb.Exec(fmt.Sprintf("CREATE INDEX idx_mid ON %s (mid DESC)", tableName))
db.Mdb.Exec(fmt.Sprintf("CREATE INDEX idx_dbId ON %s (db_id DESC", tableName))
}
}
@@ -312,7 +315,7 @@ func BatchUpdateDetails(ml []MovieDetail) (err error) {
// ExistMovieDetailByMid 通过mid判断是否存在对应信息
func ExistMovieDetailByMid(mid int64) bool {
var count int64
db.Mdb.Model(&SearchInfo{}).Where("mid", mid).Count(&count)
db.Mdb.Model(&MovieDetail{}).Where("mid", mid).Count(&count)
return count > 0
}
@@ -440,12 +443,32 @@ func SlaveDetailCache(id string, ml []MovieDetail) error {
// 只执行保存操作, 不考虑更新情况
s := SlaveMovieInfo{Sid: id, Mid: GenerateHashKey(m.Name), DbId: m.DbId, PlayList: m.PlayList}
r, _ := json.Marshal(s)
data[s.Mid] = string(r)
// redis中的存储key优先db_id
if s.DbId > 0 {
data[fmt.Sprintf("%d", s.DbId)] = string(r)
} else {
data[s.Mid] = string(r)
}
}
// 使用 Sid:Mid为key, 用以区分不同站点数据
return db.Rdb.HSet(db.Cxt, fmt.Sprintf(config.MultipleSiteDetailKey, id), data).Err()
}
// GetSlaveDetailInCache 从redis缓存中获取播放信息
func GetSlaveDetailInCache(sid, mid string) SlaveMovieInfo {
// 初始化返回值
var s SlaveMovieInfo
v, err := db.Rdb.HGet(db.Cxt, fmt.Sprintf(config.MultipleSiteDetailKey, sid), mid).Result()
if err != nil {
// 如果没有获取到对应值, 则直接continue
//log.Println("Get MultipleSiteDetail Failed: ", err)
return s
}
// 如果获取到数据则直接退出本次循环
_ = json.Unmarshal([]byte(v), &s)
return s
}
// SyncMovieDetail 同步redis中的影片数据到mysql中
func SyncMovieDetail(sid string, grade SourceGrade, mode int) {
// 初始化游标
@@ -554,8 +577,7 @@ func GetDetailByMid(mid int64) MovieDetail {
if err != nil {
// 如果没有获取到对应值, 则去mysql中进行查找
if errors.Is(err, redis.Nil) {
if err := db.Mdb.Model(&MovieDetail{}).Select("id, mid, cid, pid, name, sub_title, c_name, state, picture, actor, director,"+
" content, remarks, area, year").Where("mid = ?", mid).Find(&m).Error; err != nil {
if err := db.Mdb.Where("mid = ?", mid).Find(&m).Error; err != nil {
log.Println("Find BasicInfo Failed: ", err)
return m
}
@@ -631,7 +653,7 @@ func GetBasicInfoByIds(ids []int64) []MovieBasicInfo {
// 如果存在nil值,则去mysql进行补全
if len(newIds) > 0 {
if err := db.Mdb.Model(&MovieDetail{}).Select("id, mid, cid, pid, name, sub_title, c_name, state, picture, actor, director,"+
" content, remarks, area, year").Where("mid IN (?)", ids).Find(&ml).Error; err != nil {
" content, remarks, area, year").Where("mid IN (?)", newIds).Find(&ml).Error; err != nil {
log.Println("BatchFind BasicInfo Failed: ", err)
return nil
}
@@ -747,17 +769,26 @@ func GetMultiplePlay(mIds []string, dbId int64) []SlaveMovieInfo {
continue
}
var s SlaveMovieInfo
// 优先使用dbID为key去redis中获取
if s = GetSlaveDetailInCache(c.Id, fmt.Sprintf("%d", dbId)); s.Mid != "" {
l = append(l, s)
continue
}
for _, mid := range mIds {
// 初始化临时变量 SlaveMovieInfo
v, err := db.Rdb.HGet(db.Cxt, fmt.Sprintf(config.MultipleSiteDetailKey, c.Id), mid).Result()
if err != nil {
// 如果没有获取到对应值, 则直接continue
continue
if s = GetSlaveDetailInCache(c.Id, mid); s.Mid != "" {
l = append(l, s)
break
}
// 如果获取到数据则直接退出本次循环
_ = json.Unmarshal([]byte(v), &s)
l = append(l, s)
break
//v, err := db.Rdb.HGet(db.Cxt, fmt.Sprintf(config.MultipleSiteDetailKey, c.Id), mid).Result()
//if err != nil {
// // 如果没有获取到对应值, 则直接continue
// continue
//}
//// 如果获取到数据则直接退出本次循环
//_ = json.Unmarshal([]byte(v), &s)
//l = append(l, s)
//break
}
// 如果迭代完s依旧为空,则去mysql中进行匹配
if s.Mid == "" {

View File

@@ -27,8 +27,8 @@ func InitMysql() (err error) {
//NameReplacer: strings.NewReplacer("spider_", ""), // 替表名和字段中的 Me 为 空
},
//Logger: logger.Default.LogMode(logger.Warn), //设置日志级别为Info
Logger: logger.Default.LogMode(logger.Info), //设置日志级别为Info
//Logger: logger.Default.LogMode(logger.Error), //设置日志级别为Info
//Logger: logger.Default.LogMode(logger.Info), //设置日志级别为Info
Logger: logger.Default.LogMode(logger.Error), //设置日志级别为Info
})
return
}