main.go 7.0 KB

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