diff --git a/src/server/settings/migrate.go b/src/server/settings/migrate.go new file mode 100644 index 0000000..5ad699a --- /dev/null +++ b/src/server/settings/migrate.go @@ -0,0 +1,105 @@ +package settings + +import ( + "encoding/binary" + "fmt" + "os" + "path/filepath" + + bolt "go.etcd.io/bbolt" + "server/web/api/utils" +) + +var ( + dbTorrentsName = []byte("Torrents") +) + +type torrentOldDB struct { + Name string + Magnet string + InfoBytes []byte + Hash string + Size int64 + Timestamp int64 +} + +func Migrate() { + if _, err := os.Lstat(filepath.Join(Path, "torrserver.db")); os.IsNotExist(err) { + return + } + + db, err := bolt.Open(filepath.Join(Path, "torrserver.db"), 0666, nil) + if err != nil { + return + } + + torrs := make([]*torrentOldDB, 0) + err = db.View(func(tx *bolt.Tx) error { + tdb := tx.Bucket(dbTorrentsName) + if tdb == nil { + return nil + } + c := tdb.Cursor() + for h, _ := c.First(); h != nil; h, _ = c.Next() { + hdb := tdb.Bucket(h) + if hdb != nil { + torr := new(torrentOldDB) + torr.Hash = string(h) + tmp := hdb.Get([]byte("Name")) + if tmp == nil { + return fmt.Errorf("error load torrent") + } + torr.Name = string(tmp) + + tmp = hdb.Get([]byte("Link")) + if tmp == nil { + return fmt.Errorf("error load torrent") + } + torr.Magnet = string(tmp) + + tmp = hdb.Get([]byte("Size")) + if tmp == nil { + return fmt.Errorf("error load torrent") + } + torr.Size = b2i(tmp) + + tmp = hdb.Get([]byte("Timestamp")) + if tmp == nil { + return fmt.Errorf("error load torrent") + } + torr.Timestamp = b2i(tmp) + + torrs = append(torrs, torr) + } + } + return nil + }) + db.Close() + if err == nil && len(torrs) > 0 { + for _, torr := range torrs { + spec, err := utils.ParseLink(torr.Magnet) + if err != nil { + continue + } + + title := torr.Name + if len(spec.DisplayName) > len(title) { + title = spec.DisplayName + } + + AddTorrent(&TorrentDB{ + TorrentSpec: spec, + Name: torr.Name, + Title: title, + Poster: "", + Timestamp: torr.Timestamp, + Size: torr.Size, + }) + } + } + os.Remove(filepath.Join(Path, "torrserver.db")) +} + +func b2i(v []byte) int64 { + return int64(binary.BigEndian.Uint64(v)) +} diff --git a/src/server/settings/settings.go b/src/server/settings/settings.go index b761731..0379298 100644 --- a/src/server/settings/settings.go +++ b/src/server/settings/settings.go @@ -8,6 +8,7 @@ var ( func InitSets(readOnly bool) { tdb = NewTDB(readOnly) loadBTSets() + Migrate() } func CloseDB() {