main.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package main
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal"
  4. "github.com/allanpk716/ChineseSubFinder/internal/pkg"
  5. "github.com/allanpk716/ChineseSubFinder/internal/pkg/hot_fix"
  6. "github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
  7. "github.com/allanpk716/ChineseSubFinder/internal/pkg/notify_center"
  8. "github.com/allanpk716/ChineseSubFinder/internal/pkg/rod_helper"
  9. "github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_formatter"
  10. "github.com/allanpk716/ChineseSubFinder/internal/pkg/sub_formatter/common"
  11. "github.com/allanpk716/ChineseSubFinder/internal/types"
  12. "github.com/robfig/cron/v3"
  13. "github.com/sirupsen/logrus"
  14. )
  15. func init() {
  16. log = log_helper.GetLogger()
  17. log.Infoln("ChineseSubFinder Version:", appVersion)
  18. if pkg.OSCheck() == false {
  19. panic(`only support Linux and Windows, if you want support MacOS,
  20. you need implement getDbName() in file: internal/dao/init.go
  21. and
  22. implement getSpeFileName() in internal/logic/forced_scan_and_down_sub/forced_scan_and_down_sub.go`)
  23. }
  24. config = pkg.GetConfig()
  25. }
  26. func main() {
  27. if log == nil {
  28. panic("log init error")
  29. }
  30. if config == nil {
  31. panic("read config error")
  32. }
  33. httpProxy := config.HttpProxy
  34. if config.UseProxy == false {
  35. httpProxy = ""
  36. }
  37. if config.UseProxy == false {
  38. log.Infoln("UseProxy = false")
  39. } else {
  40. log.Infoln("UseProxy:", httpProxy)
  41. }
  42. // 判断文件夹是否存在
  43. if pkg.IsDir(config.MovieFolder) == false {
  44. log.Errorln("MovieFolder not found")
  45. return
  46. }
  47. if pkg.IsDir(config.SeriesFolder) == false {
  48. log.Errorln("SeriesFolder not found")
  49. return
  50. }
  51. // 读取到的文件夹信息展示
  52. log.Infoln("MovieFolder:", config.MovieFolder)
  53. log.Infoln("SeriesFolder:", config.SeriesFolder)
  54. // ------ Hot Fix Start ------
  55. // 开始修复
  56. log.Infoln("HotFix Start...")
  57. err := hot_fix.HotFixProcess(types.HotFixParam{
  58. MovieRootDir: config.MovieFolder,
  59. SeriesRootDir: config.SeriesFolder,
  60. })
  61. if err != nil {
  62. log.Errorln("HotFixProcess()", err)
  63. log.Infoln("HotFix End")
  64. return
  65. }
  66. log.Infoln("HotFix End")
  67. // ------ Hot Fix End ------
  68. // ------ Change SubName Format Start ------
  69. /*
  70. 字幕命名格式转换,需要数据库支持
  71. 如果数据库没有记录经过转换,那么默认从 Emby 的格式作为检测的起点,转换到目标的格式
  72. 然后需要在数据库中记录本次的转换结果
  73. */
  74. log.Infoln("Change Sub Name Format Start...")
  75. renameResults, err := sub_formatter.SubFormatChangerProcess(config.MovieFolder, config.SeriesFolder, common.FormatterName(config.SubNameFormatter))
  76. // 出错的文件有哪一些
  77. for s, i := range renameResults.ErrFiles {
  78. log_helper.GetLogger().Errorln("reformat ErrFile:"+s, i)
  79. }
  80. if err != nil {
  81. log.Errorln("SubFormatChangerProcess()", err)
  82. return
  83. }
  84. log.Infoln("Change Sub Name Format End")
  85. // ------ Change SubName Format End ------
  86. // 初始化通知缓存模块
  87. notify_center.Notify = notify_center.NewNotifyCenter(config.WhenSubSupplierInvalidWebHook)
  88. log.Infoln("ReloadBrowser Start...")
  89. // ReloadBrowser 提前把浏览器下载好
  90. rod_helper.ReloadBrowser()
  91. log.Infoln("ReloadBrowser End")
  92. // 任务还没执行完,下一次执行时间到来,下一次执行就跳过不执行
  93. c := cron.New(cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger)))
  94. // 定时器
  95. entryID, err := c.AddFunc("@every "+config.EveryTime, func() {
  96. DownLoadStart(httpProxy)
  97. })
  98. if err != nil {
  99. log.Errorln("cron entryID:", entryID, "Error:", err)
  100. return
  101. }
  102. if config.RunAtStartup == true {
  103. log.Infoln("First Time Download Start")
  104. DownLoadStart(httpProxy)
  105. log.Infoln("First Time Download End")
  106. } else {
  107. log.Infoln("config.yaml set RunAtStartup: false, so will not Run At Startup, wait", config.EveryTime, "to Download")
  108. }
  109. c.Start()
  110. // 阻塞
  111. select {}
  112. }
  113. func DownLoadStart(httpProxy string) {
  114. defer func() {
  115. log.Infoln("Download One End...")
  116. notify_center.Notify.Send()
  117. pkg.CloseChrome()
  118. }()
  119. notify_center.Notify.Clear()
  120. // 下载实例
  121. downloader := internal.NewDownloader(sub_formatter.GetSubFormatter(config.SubNameFormatter),
  122. types.ReqParam{
  123. HttpProxy: httpProxy,
  124. DebugMode: config.DebugMode,
  125. SaveMultiSub: config.SaveMultiSub,
  126. Threads: config.Threads,
  127. SubTypePriority: config.SubTypePriority,
  128. WhenSubSupplierInvalidWebHook: config.WhenSubSupplierInvalidWebHook,
  129. EmbyConfig: config.EmbyConfig,
  130. SaveOneSeasonSub: config.SaveOneSeasonSub,
  131. })
  132. log.Infoln("Download One Started...")
  133. // 优先级最高。读取特殊文件,启用一些特殊的功能,比如 forced_scan_and_down_sub
  134. err := downloader.ReadSpeFile()
  135. if err != nil {
  136. log.Errorln("ReadSpeFile", err)
  137. }
  138. // 刷新 Emby 的字幕,如果下载了字幕倒是没有刷新,则先刷新一次,便于后续的 Emby api 统计逻辑
  139. err = downloader.RefreshEmbySubList()
  140. if err != nil {
  141. log.Errorln("RefreshEmbySubList", err)
  142. return
  143. }
  144. err = downloader.GetUpdateVideoListFromEmby(config.MovieFolder, config.SeriesFolder)
  145. if err != nil {
  146. log.Errorln("GetUpdateVideoListFromEmby", err)
  147. return
  148. }
  149. // 开始下载,电影
  150. err = downloader.DownloadSub4Movie(config.MovieFolder)
  151. if err != nil {
  152. log.Errorln("DownloadSub4Movie", err)
  153. return
  154. }
  155. // 开始下载,连续剧
  156. err = downloader.DownloadSub4Series(config.SeriesFolder)
  157. if err != nil {
  158. log.Errorln("DownloadSub4Series", err)
  159. return
  160. }
  161. // 刷新 Emby 的字幕,下载完毕字幕了,就统一刷新一下
  162. err = downloader.RefreshEmbySubList()
  163. if err != nil {
  164. log.Errorln("RefreshEmbySubList", err)
  165. return
  166. }
  167. }
  168. var (
  169. log *logrus.Logger
  170. config *types.Config
  171. )
  172. /*
  173. 没有很好的想法,因为喜欢使用 tag 进行版本的输出标记,但是 tag 的时候编译 docker 前确实可以修改源码替换关键词做到版本与 tag 同步变更
  174. 但是, goreleaser 却不支持这样,会提示源码被改了,无法进行编译发布
  175. 除非不发布编译还是 Linux 和 Windows 程序,这样就能做到 tag 与 程序内部输出版本一致。
  176. */
  177. const appVersion = "v0.16.0"