restore.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package sub_timeline_fixer
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/pkg/log_helper"
  4. "github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. )
  9. // Restore 从备份还原自动校正的字幕文件
  10. func Restore(movieDirs, seriesDirs []string) (int, error) {
  11. var BackUpSubMoviesFilePathList = make([]string, 0)
  12. var BackUpSubSeriesFilePathList = make([]string, 0)
  13. for _, dir := range movieDirs {
  14. // 搜索出所有的 csf-bk 文件
  15. oneBackUpSubMoviesFilePathList, err := searchBackUpSubFile(dir)
  16. if err != nil {
  17. return 0, err
  18. }
  19. BackUpSubMoviesFilePathList = append(BackUpSubMoviesFilePathList, oneBackUpSubMoviesFilePathList...)
  20. }
  21. for _, dir := range seriesDirs {
  22. // 搜索出所有的 csf-bk 文件
  23. oneBackUpSubSeriesFilePathList, err := searchBackUpSubFile(dir)
  24. if err != nil {
  25. return 0, err
  26. }
  27. BackUpSubSeriesFilePathList = append(BackUpSubSeriesFilePathList, oneBackUpSubSeriesFilePathList...)
  28. }
  29. allBkFilesPath := make([]string, len(BackUpSubMoviesFilePathList)+len(BackUpSubSeriesFilePathList))
  30. allBkFilesPath = append(allBkFilesPath, BackUpSubMoviesFilePathList...)
  31. allBkFilesPath = append(allBkFilesPath, BackUpSubSeriesFilePathList...)
  32. // 通过这些文件,判断当前每个 bk 下面是否有相应的文件,如果在则删除,然后再重命名 bk 文件回原来的文件名称
  33. // Fargo - S04E04 - The Pretend War WEBDL-1080p.chinese(简英,shooter).default.ass.csf-bk
  34. // Fargo - S04E04 - The Pretend War WEBDL-1080p.chinese(简英,shooter).default.ass
  35. restoreCount := 0
  36. for index, oneBkFile := range allBkFilesPath {
  37. fixedFileName := strings.ReplaceAll(oneBkFile, BackUpExt, "")
  38. if my_util.IsFile(fixedFileName) == true {
  39. err := os.Remove(fixedFileName)
  40. if err != nil {
  41. return 0, err
  42. }
  43. err = os.Rename(oneBkFile, fixedFileName)
  44. if err != nil {
  45. return 0, err
  46. }
  47. restoreCount++
  48. log_helper.GetLogger().Infoln("Restore", index, fixedFileName)
  49. }
  50. }
  51. return restoreCount, nil
  52. }
  53. func searchBackUpSubFile(dir string) ([]string, error) {
  54. var fileFullPathList = make([]string, 0)
  55. pathSep := string(os.PathSeparator)
  56. files, err := os.ReadDir(dir)
  57. if err != nil {
  58. return nil, err
  59. }
  60. for _, curFile := range files {
  61. fullPath := dir + pathSep + curFile.Name()
  62. if curFile.IsDir() {
  63. // 内层的错误就无视了
  64. oneList, _ := searchBackUpSubFile(fullPath)
  65. if oneList != nil {
  66. fileFullPathList = append(fileFullPathList, oneList...)
  67. }
  68. } else {
  69. // 这里就是文件了
  70. if filepath.Ext(curFile.Name()) == BackUpExt {
  71. fileFullPathList = append(fileFullPathList, fullPath)
  72. }
  73. }
  74. }
  75. return fileFullPathList, nil
  76. }
  77. const TmpExt = ".csf-tmp"
  78. const BackUpExt = ".csf-bk"