main.go 7.9 KB

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