func scanDir(dirName string) (ee map[metainfo.Hash]entity) { d, err := os.Open(dirName) if err != nil { log.Print(err) return } defer d.Close() names, err := d.Readdirnames(-1) if err != nil { log.Print(err) return } ee = make(map[metainfo.Hash]entity, len(names)) addEntity := func(e entity) { e0, ok := ee[e.Hash] if ok { if e0.MagnetURI == "" || len(e.MagnetURI) < len(e0.MagnetURI) { return } } ee[e.Hash] = e } for _, n := range names { fullName := filepath.Join(dirName, n) switch filepath.Ext(n) { case ".torrent": ih, ok := torrentFileInfoHash(fullName) if !ok { break } e := entity{ TorrentFilePath: fullName, } missinggo.CopyExact(&e.Hash, ih) addEntity(e) case ".magnet": uris, err := magnetFileURIs(fullName) if err != nil { log.Print(err) break } for _, uri := range uris { m, err := metainfo.ParseMagnetURI(uri) if err != nil { log.Printf("error parsing %q in file %q: %s", uri, fullName, err) continue } addEntity(entity{ Hash: m.InfoHash, MagnetURI: uri, }) } } } return }
func TorrentSpecFromMagnetURI(uri string) (spec *TorrentSpec, err error) { m, err := metainfo.ParseMagnetURI(uri) if err != nil { return } spec = &TorrentSpec{ Trackers: [][]string{m.Trackers}, DisplayName: m.DisplayName, InfoHash: m.InfoHash, } return }