decode.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package common
  2. import (
  3. "github.com/beevik/etree"
  4. PTN "github.com/middelink/go-parse-torrent-name"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "regexp"
  9. "strings"
  10. )
  11. func getImdbMovieXml(movieFilePath string) (string, error) {
  12. doc := etree.NewDocument()
  13. if err := doc.ReadFromFile(movieFilePath); err != nil {
  14. return "", err
  15. }
  16. for _, t := range doc.FindElements("//IMDB") {
  17. return t.Text(), nil
  18. }
  19. return "", CanNotFindIMDBID
  20. }
  21. func getImdbNfo(nfoFilePath string) (string, error) {
  22. doc := etree.NewDocument()
  23. if err := doc.ReadFromFile(nfoFilePath); err != nil {
  24. return "", err
  25. }
  26. for _, t := range doc.FindElements("//uniqueid[@type='Imdb']") {
  27. return t.Text(), nil
  28. }
  29. return "", CanNotFindIMDBID
  30. }
  31. func GetImdbId(dirPth string) (string ,error) {
  32. dir, err := ioutil.ReadDir(dirPth)
  33. if err != nil {
  34. return "", err
  35. }
  36. pathSep := string(os.PathSeparator)
  37. // 优先找 movie.xml 这个是 raddarr 下载的电影会存下来的,可以在 Metadata 设置 Emby
  38. var movieFilePath = ""
  39. // 这个是使用 tinyMediaManager 削刮器按 Kodi 来存储的
  40. var nfoFilePath = ""
  41. for _, fi := range dir {
  42. if fi.IsDir() == true {
  43. continue
  44. }
  45. upperName := strings.ToUpper(fi.Name())
  46. // 找 movie.xml
  47. if upperName == strings.ToUpper(metadataFileEmby) {
  48. movieFilePath = dirPth + pathSep + fi.Name()
  49. }
  50. // 找 *.nfo
  51. ok := strings.HasSuffix(fi.Name(), suffixNameNfo)
  52. if ok {
  53. nfoFilePath = dirPth + pathSep + fi.Name()
  54. }
  55. }
  56. // 根据找到的开始解析
  57. if movieFilePath == "" && nfoFilePath == "" {
  58. return "", NoMetadataFile
  59. }
  60. if movieFilePath != "" {
  61. outId, err := getImdbMovieXml(movieFilePath)
  62. if err != nil {
  63. println(err)
  64. } else {
  65. return outId, nil
  66. }
  67. }
  68. if nfoFilePath != "" {
  69. outId, err := getImdbNfo(nfoFilePath)
  70. if err != nil {
  71. return "", err
  72. } else {
  73. return outId, nil
  74. }
  75. }
  76. return "", CanNotFindIMDBID
  77. }
  78. //GetVideoInfo 从文件名推断视频文件的信息
  79. func GetVideoInfo(videoFileName string) (*PTN.TorrentInfo, error) {
  80. parse, err := PTN.Parse(filepath.Base(videoFileName))
  81. if err != nil {
  82. return nil, err
  83. }
  84. compile, err := regexp.Compile(regFixTitle2)
  85. if err != nil {
  86. return nil, err
  87. }
  88. match := compile.ReplaceAllString(parse.Title, "")
  89. match = strings.TrimRight(match, "")
  90. parse.Title = match
  91. return parse, nil
  92. }
  93. const (
  94. metadataFileEmby = "movie.xml"
  95. suffixNameXml = ".xml"
  96. suffixNameNfo = ".nfo"
  97. // 去除特殊字符,仅仅之有中文
  98. regFixTitle = "[^\u4e00-\u9fa5a-zA-Z0-9\\s]"
  99. // 去除特殊字符,把特殊字符都写进去
  100. regFixTitle2 = "[`~!@#$%^&*()+-=|{}';'\\[\\].<>/?~!@#¥%……&*()——+|{}【】';”“’。、?]"
  101. )