diff --git a/backend/models/episode_torrents.go b/backend/models/episode_torrents.go index da2c039..ba8dd96 100644 --- a/backend/models/episode_torrents.go +++ b/backend/models/episode_torrents.go @@ -42,40 +42,51 @@ type episodeTorrentDB struct { Updated time.Time `db:"updated_at"` } -// NewTorrentFromEpisodeTorrentDB returns a polochon.Torrent from an -// episodeTorrentDB -func NewTorrentFromEpisodeTorrentDB(eDB *episodeTorrentDB) *polochon.Torrent { - q, _ := polochon.StringToQuality(eDB.Quality) +// newTorrentFromEpisodeTorrentDB returns a polochon.Torrent from an +// EpisodeTorrentDB +func newTorrentFromEpisodeTorrentDB(eDB *episodeTorrentDB) *polochon.Torrent { return &polochon.Torrent{ - Quality: *q, - URL: eDB.URL, - Seeders: eDB.Seeders, - Leechers: eDB.Leechers, - Source: eDB.Source, - UploadUser: eDB.UploadUser, - Size: eDB.Size, + ImdbID: eDB.ImdbID, + Type: polochon.TypeEpisode, + Season: eDB.Season, + Episode: eDB.Episode, + Quality: polochon.Quality(eDB.Quality), + Result: &polochon.TorrentResult{ + URL: eDB.URL, + Seeders: eDB.Seeders, + Leechers: eDB.Leechers, + Source: eDB.Source, + UploadUser: eDB.UploadUser, + Size: eDB.Size, + }, } } -// NewEpisodeTorrentDB returns an episodeTorrentDB ready to be put in DB from a +// newEpisodeTorrentDB returns an episodeTorrentDB ready to be put in DB from a // polochon.Torrent -func NewEpisodeTorrentDB(t *polochon.Torrent, imdbID string, season, episode int) *episodeTorrentDB { - return &episodeTorrentDB{ - ImdbID: imdbID, - Season: season, - Episode: episode, - URL: t.URL, - Source: t.Source, - Quality: string(t.Quality), - UploadUser: t.UploadUser, - Seeders: t.Seeders, - Leechers: t.Leechers, - Size: t.Size, +func newEpisodeTorrentDB(t *polochon.Torrent) *episodeTorrentDB { + e := &episodeTorrentDB{ + ImdbID: t.ImdbID, + Quality: string(t.Quality), + Season: t.Season, + Episode: t.Episode, } + + if t.Result == nil { + return e + } + + e.URL = t.Result.URL + e.Source = t.Result.Source + e.UploadUser = t.Result.UploadUser + e.Seeders = t.Result.Seeders + e.Leechers = t.Result.Leechers + e.Size = t.Result.Size + return e } // GetEpisodeTorrents returns show episodes torrents from database -func GetEpisodeTorrents(db *sqlx.DB, imdbID string, season, episode int) ([]polochon.Torrent, error) { +func GetEpisodeTorrents(db *sqlx.DB, imdbID string, season, episode int) ([]*polochon.Torrent, error) { var torrentsDB = []*episodeTorrentDB{} err := db.Select(&torrentsDB, getEpisodeTorrentQuery, imdbID, season, episode) if err != nil { @@ -86,19 +97,19 @@ func GetEpisodeTorrents(db *sqlx.DB, imdbID string, season, episode int) ([]polo return nil, sql.ErrNoRows } - var torrents []polochon.Torrent + var torrents []*polochon.Torrent for _, torrentDB := range torrentsDB { - torrent := NewTorrentFromEpisodeTorrentDB(torrentDB) - torrents = append(torrents, *torrent) + torrent := newTorrentFromEpisodeTorrentDB(torrentDB) + torrents = append(torrents, torrent) } return torrents, nil } // UpsertEpisodeTorrent upserts an episode torrent from a polochon torrent -func UpsertEpisodeTorrent(db *sqlx.DB, torrent *polochon.Torrent, imdbID string, season, episode int) error { +func UpsertEpisodeTorrent(db *sqlx.DB, torrent *polochon.Torrent) error { // Create the EpisodeTorrent ready to be put in db - eDB := NewEpisodeTorrentDB(torrent, imdbID, season, episode) + eDB := newEpisodeTorrentDB(torrent) r, err := db.NamedQuery(upsertEpisodeTorrentQuery, eDB) if err != nil { return err diff --git a/backend/models/movie_torrents.go b/backend/models/movie_torrents.go index 7d5602b..4615273 100644 --- a/backend/models/movie_torrents.go +++ b/backend/models/movie_torrents.go @@ -39,38 +39,47 @@ type movieTorrentDB struct { Updated time.Time `db:"updated_at"` } -// NewTorrentFromMovieTorrentDB creates a new polochon.Torrent from a +// newTorrentFromMovieTorrentDB creates a new polochon.Torrent from a // movieTorrentDB -func NewTorrentFromMovieTorrentDB(mDB *movieTorrentDB) *polochon.Torrent { - q, _ := polochon.StringToQuality(mDB.Quality) +func newTorrentFromMovieTorrentDB(mDB *movieTorrentDB) *polochon.Torrent { return &polochon.Torrent{ - Quality: *q, - URL: mDB.URL, - Seeders: mDB.Seeders, - Leechers: mDB.Leechers, - Source: mDB.Source, - UploadUser: mDB.UploadUser, - Size: mDB.Size, + ImdbID: mDB.ImdbID, + Quality: polochon.Quality(mDB.Quality), + Type: polochon.TypeMovie, + Result: &polochon.TorrentResult{ + URL: mDB.URL, + Seeders: mDB.Seeders, + Leechers: mDB.Leechers, + Source: mDB.Source, + UploadUser: mDB.UploadUser, + Size: mDB.Size, + }, } } -// NewMovieTorrentDB returns a MovieTorrent ready to be put in DB from a +// newMovieTorrentDB returns a MovieTorrent ready to be put in DB from a // Torrent -func NewMovieTorrentDB(t *polochon.Torrent, imdbID string) movieTorrentDB { - return movieTorrentDB{ - ImdbID: imdbID, - URL: t.URL, - Source: t.Source, - Quality: string(t.Quality), - UploadUser: t.UploadUser, - Seeders: t.Seeders, - Leechers: t.Leechers, - Size: t.Size, +func newMovieTorrentDB(t *polochon.Torrent) movieTorrentDB { + m := movieTorrentDB{ + ImdbID: t.ImdbID, + Quality: string(t.Quality), } + + if t.Result == nil { + return m + } + + m.URL = t.Result.URL + m.Source = t.Result.Source + m.UploadUser = t.Result.UploadUser + m.Seeders = t.Result.Seeders + m.Leechers = t.Result.Leechers + m.Size = t.Result.Size + return m } // GetMovieTorrents returns polochon.Torrents from the database -func GetMovieTorrents(db *sqlx.DB, imdbID string) ([]polochon.Torrent, error) { +func GetMovieTorrents(db *sqlx.DB, imdbID string) ([]*polochon.Torrent, error) { var torrentsDB = []*movieTorrentDB{} // Get the torrents from the DB err := db.Select(&torrentsDB, getMovieTorrentQueryByImdbID, imdbID) @@ -83,18 +92,18 @@ func GetMovieTorrents(db *sqlx.DB, imdbID string) ([]polochon.Torrent, error) { } // Create polochon Torrents from the movieTorrentDB - var torrents []polochon.Torrent + var torrents []*polochon.Torrent for _, torrentDB := range torrentsDB { - torrent := NewTorrentFromMovieTorrentDB(torrentDB) - torrents = append(torrents, *torrent) + torrent := newTorrentFromMovieTorrentDB(torrentDB) + torrents = append(torrents, torrent) } return torrents, nil } // UpsertMovieTorrent adds or updates MovieTorrent in db -func UpsertMovieTorrent(db *sqlx.DB, t *polochon.Torrent, imdbID string) error { - mDB := NewMovieTorrentDB(t, imdbID) +func UpsertMovieTorrent(db *sqlx.DB, t *polochon.Torrent) error { + mDB := newMovieTorrentDB(t) r, err := db.NamedQuery(upsertMovieTorrentQuery, mDB) if err != nil { return err diff --git a/backend/movies/movies.go b/backend/movies/movies.go index 017a27e..f399a6f 100644 --- a/backend/movies/movies.go +++ b/backend/movies/movies.go @@ -223,7 +223,7 @@ func (m *Movie) RefreshTorrents(env *web.Env, torrenters []polochon.Torrenter) e // Update them in database for _, t := range m.Movie.Torrents { - err = models.UpsertMovieTorrent(env.Database, &t, m.ImdbID) + err = models.UpsertMovieTorrent(env.Database, t) if err != nil { log.Error("error while adding torrent", err) continue diff --git a/backend/shows/episodes.go b/backend/shows/episodes.go index dce9854..c9ac7f8 100644 --- a/backend/shows/episodes.go +++ b/backend/shows/episodes.go @@ -179,7 +179,7 @@ func RefreshTorrents(env *web.Env, showEpisode *polochon.ShowEpisode, torrenters // Upsert all the torrents we got for _, t := range showEpisode.Torrents { - err = models.UpsertEpisodeTorrent(env.Database, &t, showEpisode.ShowImdbID, showEpisode.Season, showEpisode.Episode) + err = models.UpsertEpisodeTorrent(env.Database, t) if err != nil { log.Errorf("error while adding torrent : %s", err) continue diff --git a/backend/torrents/handlers.go b/backend/torrents/handlers.go index f672231..58f975d 100644 --- a/backend/torrents/handlers.go +++ b/backend/torrents/handlers.go @@ -16,19 +16,12 @@ import ( // DownloadHandler downloads a movie via polochon func DownloadHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { - var data struct { - URL string `json:"url"` - Metadata *papi.TorrentMetadata `json:"metadata"` - } - err := json.NewDecoder(r.Body).Decode(&data) + torrent := &papi.Torrent{} + err := json.NewDecoder(r.Body).Decode(torrent) if err != nil { return env.RenderError(w, errors.New("failed to get the url")) } - if data.URL == "" { - return env.RenderError(w, errors.New("no given url")) - } - user := auth.GetCurrentUser(r, env.Log) client, err := user.NewPapiClient(env.Database) @@ -36,7 +29,7 @@ func DownloadHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error return env.RenderError(w, err) } - err = client.AddTorrent(data.URL, data.Metadata) + err = client.AddTorrent(torrent) if err != nil { return env.RenderError(w, err) } @@ -123,7 +116,15 @@ func SearchHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { // Sort by seeds sort.Slice(results, func(i, j int) bool { - return results[i].Seeders > results[j].Seeders + // Let's avoid the panic while sorting + if results[i].Result == nil { + results[i].Result = &polochon.TorrentResult{} + } + if results[j].Result == nil { + results[j].Result = &polochon.TorrentResult{} + } + + return results[i].Result.Seeders > results[j].Result.Seeders }) return env.RenderJSON(w, results) diff --git a/frontend/js/actions/torrents.js b/frontend/js/actions/torrents.js index 2ee9128..e1608b3 100644 --- a/frontend/js/actions/torrents.js +++ b/frontend/js/actions/torrents.js @@ -3,14 +3,9 @@ import { configureAxios, request } from "../requests"; import { addAlertOk } from "./alerts"; export function addTorrent(torrent) { - return request( - "ADD_TORRENT", - configureAxios().post("/torrents", { - url: torrent.url, - metadata: torrent.metadata, - }), - [addAlertOk("Torrent added")] - ); + return request("ADD_TORRENT", configureAxios().post("/torrents", torrent), [ + addAlertOk("Torrent added"), + ]); } export function removeTorrent(id) { diff --git a/frontend/js/components/buttons/torrents.js b/frontend/js/components/buttons/torrents.js index 97af697..1ed2727 100644 --- a/frontend/js/components/buttons/torrents.js +++ b/frontend/js/components/buttons/torrents.js @@ -27,7 +27,7 @@ const buildMenuItems = (torrents) => { entries.push({ type: "entry", quality: torrent.quality, - size: torrent.size, + size: torrent.result.size, torrent: torrent, }); }); diff --git a/frontend/js/components/torrents/list.js b/frontend/js/components/torrents/list.js index bd36f0e..39cdb50 100644 --- a/frontend/js/components/torrents/list.js +++ b/frontend/js/components/torrents/list.js @@ -25,7 +25,11 @@ const AddTorrent = () => { if (url === "") { return; } - dispatch(addTorrent({ url: url, metdata: null })); + dispatch( + addTorrent({ + result: { url: url }, + }) + ); setUrl(""); }; @@ -66,28 +70,28 @@ const Torrents = () => { const Torrent = ({ torrent }) => { const dispatch = useDispatch(); - var progressStyle = torrent.is_finished + var progressStyle = torrent.status.is_finished ? "success" : "info progress-bar-striped progress-bar-animated"; const progressBarClass = "progress-bar bg-" + progressStyle; - var percentDone = torrent.percent_done; + var percentDone = torrent.status.percent_done; const started = percentDone !== 0; if (started) { percentDone = Number(percentDone).toFixed(1) + "%"; } // Pretty sizes - const downloadedSize = prettySize(torrent.downloaded_size); - const totalSize = prettySize(torrent.total_size); - const downloadRate = prettySize(torrent.download_rate) + "/s"; + const downloadedSize = prettySize(torrent.status.downloaded_size); + const totalSize = prettySize(torrent.status.total_size); + const downloadRate = prettySize(torrent.status.download_rate) + "/s"; return (