From 199d2163239cabfd6d46255c37c1a95f91884814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Delattre?= Date: Wed, 8 Apr 2020 18:17:25 +0200 Subject: [PATCH] Add torrent metadata --- backend/torrents/handlers.go | 6 +++-- frontend/js/actions/torrents.js | 5 ++-- frontend/js/components/buttons/torrents.js | 4 ++-- frontend/js/components/torrents/list.js | 2 +- frontend/js/components/torrents/search.js | 4 +++- frontend/js/reducers/movies.js | 26 ++++++++++++++++++-- frontend/js/reducers/show.js | 28 ++++++++++++++++++++-- frontend/js/utils.js | 16 ------------- go.mod | 4 ++-- go.sum | 12 +++++----- 10 files changed, 71 insertions(+), 36 deletions(-) diff --git a/backend/torrents/handlers.go b/backend/torrents/handlers.go index 9b34787..f672231 100644 --- a/backend/torrents/handlers.go +++ b/backend/torrents/handlers.go @@ -9,6 +9,7 @@ import ( "git.quimbo.fr/odwrtw/canape/backend/auth" "git.quimbo.fr/odwrtw/canape/backend/web" "github.com/gorilla/mux" + "github.com/odwrtw/papi" polochon "github.com/odwrtw/polochon/lib" "github.com/sirupsen/logrus" ) @@ -16,7 +17,8 @@ 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"` + URL string `json:"url"` + Metadata *papi.TorrentMetadata `json:"metadata"` } err := json.NewDecoder(r.Body).Decode(&data) if err != nil { @@ -34,7 +36,7 @@ func DownloadHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error return env.RenderError(w, err) } - err = client.AddTorrent(data.URL) + err = client.AddTorrent(data.URL, data.Metadata) if err != nil { return env.RenderError(w, err) } diff --git a/frontend/js/actions/torrents.js b/frontend/js/actions/torrents.js index 3e38fe2..2ee9128 100644 --- a/frontend/js/actions/torrents.js +++ b/frontend/js/actions/torrents.js @@ -2,11 +2,12 @@ import { configureAxios, request } from "../requests"; import { addAlertOk } from "./alerts"; -export function addTorrent(url) { +export function addTorrent(torrent) { return request( "ADD_TORRENT", configureAxios().post("/torrents", { - url: url, + url: torrent.url, + metadata: torrent.metadata, }), [addAlertOk("Torrent added")] ); diff --git a/frontend/js/components/buttons/torrents.js b/frontend/js/components/buttons/torrents.js index 5a9b7e1..97af697 100644 --- a/frontend/js/components/buttons/torrents.js +++ b/frontend/js/components/buttons/torrents.js @@ -27,8 +27,8 @@ const buildMenuItems = (torrents) => { entries.push({ type: "entry", quality: torrent.quality, - url: torrent.url, size: torrent.size, + torrent: torrent, }); }); @@ -109,7 +109,7 @@ export const TorrentsButton = ({ torrents, search, searching, url }) => { return ( dispatch(addTorrent(e.url))} + onClick={() => dispatch(addTorrent(e.torrent))} > {e.quality} {e.size !== 0 && ( diff --git a/frontend/js/components/torrents/list.js b/frontend/js/components/torrents/list.js index 6bfbff8..bd36f0e 100644 --- a/frontend/js/components/torrents/list.js +++ b/frontend/js/components/torrents/list.js @@ -25,7 +25,7 @@ const AddTorrent = () => { if (url === "") { return; } - dispatch(addTorrent(url)); + dispatch(addTorrent({ url: url, metdata: null })); setUrl(""); }; diff --git a/frontend/js/components/torrents/search.js b/frontend/js/components/torrents/search.js index 301fef9..8a6e756 100644 --- a/frontend/js/components/torrents/search.js +++ b/frontend/js/components/torrents/search.js @@ -163,7 +163,9 @@ const Torrent = ({ torrent }) => {
dispatch(addTorrent(torrent.url))} + onClick={() => + dispatch(addTorrent({ url: torrent.url, metadata: null })) + } >
diff --git a/frontend/js/reducers/movies.js b/frontend/js/reducers/movies.js index 21a9ce2..fbd9a63 100644 --- a/frontend/js/reducers/movies.js +++ b/frontend/js/reducers/movies.js @@ -1,5 +1,4 @@ import { produce } from "immer"; -import { formatTorrents } from "../utils"; const defaultState = { loading: false, @@ -9,10 +8,33 @@ const defaultState = { exploreOptions: {}, }; +const formatTorrents = (movie) => { + if (!movie.torrents || movie.torrents.length == 0) { + return undefined; + } + + let torrentMap = new Map(); + movie.torrents.forEach((torrent) => { + if (!torrentMap.has(torrent.source)) { + torrentMap.set(torrent.source, new Map()); + } + + torrent.metadata = { + type: "movie", + imdb_id: movie.imdb_id, // eslint-disable-line camelcase + quality: torrent.quality, + }; + + torrentMap.get(torrent.source).set(torrent.quality, torrent); + }); + + return torrentMap; +}; + const formatMovie = (movie) => { movie.fetchingDetails = false; movie.fetchingSubtitles = false; - movie.torrents = formatTorrents(movie.torrents); + movie.torrents = formatTorrents(movie); return movie; }; diff --git a/frontend/js/reducers/show.js b/frontend/js/reducers/show.js index 9aefe7e..3734f6d 100644 --- a/frontend/js/reducers/show.js +++ b/frontend/js/reducers/show.js @@ -1,14 +1,38 @@ import { produce } from "immer"; -import { formatTorrents } from "../utils"; const defaultState = { loading: false, show: {}, }; +const formatTorrents = (episode) => { + if (!episode.torrents || episode.torrents.length == 0) { + return undefined; + } + + let torrentMap = new Map(); + episode.torrents.forEach((torrent) => { + if (!torrentMap.has(torrent.source)) { + torrentMap.set(torrent.source, new Map()); + } + + torrent.metadata = { + type: "episode", + imdb_id: episode.show_imdb_id, // eslint-disable-line camelcase + quality: torrent.quality, + season: episode.season, + episode: episode.episode, + }; + + torrentMap.get(torrent.source).set(torrent.quality, torrent); + }); + + return torrentMap; +}; + const formatEpisode = (episode) => { // Format the episode's torrents - episode.torrents = formatTorrents(episode.torrents); + episode.torrents = formatTorrents(episode); // Set the default fetching data episode.fetching = false; diff --git a/frontend/js/utils.js b/frontend/js/utils.js index 836ccbd..36dda3d 100644 --- a/frontend/js/utils.js +++ b/frontend/js/utils.js @@ -31,19 +31,3 @@ export const prettySize = (fileSizeInBytes) => { return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i]; }; - -export const formatTorrents = (torrents = []) => { - if (!torrents || torrents.length == 0) { - return undefined; - } - - let torrentMap = new Map(); - torrents.forEach((torrent) => { - if (!torrentMap.has(torrent.source)) { - torrentMap.set(torrent.source, new Map()); - } - torrentMap.get(torrent.source).set(torrent.quality, torrent); - }); - - return torrentMap; -}; diff --git a/go.mod b/go.mod index 6c46d73..f940a2a 100644 --- a/go.mod +++ b/go.mod @@ -15,8 +15,8 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/odwrtw/errors v0.0.0-20170604160533-c747b9d17833 - github.com/odwrtw/papi v0.0.0-20190511132159-936937ad8b6a - github.com/odwrtw/polochon v0.0.0-20200404170220-273fe65c963b + github.com/odwrtw/papi v0.0.0-20200408160729-930e92b452fd + github.com/odwrtw/polochon v0.0.0-20200408160701-0455bb96acb0 github.com/phyber/negroni-gzip v0.0.0-20180113114010-ef6356a5d029 github.com/pioz/tvdb v0.0.0-20190503215423-f45c687faba9 // indirect github.com/robfig/cron v1.1.0 diff --git a/go.sum b/go.sum index 61ba926..d74cd32 100644 --- a/go.sum +++ b/go.sum @@ -135,16 +135,16 @@ github.com/odwrtw/imdb-watchlist v0.0.0-20190417175016-b7a9f7503d69 h1:ow6b/4Jj7 github.com/odwrtw/imdb-watchlist v0.0.0-20190417175016-b7a9f7503d69/go.mod h1:o2tLH95CtNdqhDb0aS2NbU+1I4PmaNsODpr33Ry0JC0= github.com/odwrtw/papi v0.0.0-20190413103029-bd5bfea85ae6 h1:bF8XKFfYNY4quRdqJ5E9ERd+FdR26H1X1Z2fNRGePSk= github.com/odwrtw/papi v0.0.0-20190413103029-bd5bfea85ae6/go.mod h1:CXotdtODLpW0/yuFV5XH8Rmrj0eAfPLvdMKykPM2WCk= -github.com/odwrtw/papi v0.0.0-20190511132159-936937ad8b6a h1:9mdPet/ianrckPWR2jSekoafz6BaqbF7kPXLnDEIKu8= -github.com/odwrtw/papi v0.0.0-20190511132159-936937ad8b6a/go.mod h1:eY0skvVHJBwbSJ18uq2c1T4SvhdEV8R0XFSb0zKh5Yo= -github.com/odwrtw/polochon v0.0.0-20200404170220-273fe65c963b h1:XBJs10QfMcVOr+jMpB2k8Pwfe4ohIWNMfNGStJdi1Pg= -github.com/odwrtw/polochon v0.0.0-20200404170220-273fe65c963b/go.mod h1:6/D6IYxfGqRi8KioWN8ViiwssUdjhZV+U7gw5Xb8Aqk= +github.com/odwrtw/papi v0.0.0-20200408160729-930e92b452fd h1:LsBK0gVXC8oRxyAwvkCg5fQWTD678Jl7n6a8MZpdUKo= +github.com/odwrtw/papi v0.0.0-20200408160729-930e92b452fd/go.mod h1:eY0skvVHJBwbSJ18uq2c1T4SvhdEV8R0XFSb0zKh5Yo= +github.com/odwrtw/polochon v0.0.0-20200408160701-0455bb96acb0 h1:p0pXoG89JVL/bZWJpqu2KRQwCU44yYnNnoP46SIPNPQ= +github.com/odwrtw/polochon v0.0.0-20200408160701-0455bb96acb0/go.mod h1:sAYf/A5tDmins2GHZn2mEFarmYltAZv+bcmSKSxDUaI= github.com/odwrtw/tpb v0.0.0-20200130133144-c846aa382c6f h1:fwEIGT+o3e8+XkBqrwsE3/+9ketTQXflPhCkv3/w990= github.com/odwrtw/tpb v0.0.0-20200130133144-c846aa382c6f/go.mod h1:updLvMbQo2xHoz94MX9+GqmSoKhf6E8fs/J+wLvvu6A= github.com/odwrtw/trakttv v0.0.0-20200404161731-0d594827e4f9 h1:PuQLHO75MXUsJpf9BcTVxvR/FCkdn1MZnZt6h3o6cJI= github.com/odwrtw/trakttv v0.0.0-20200404161731-0d594827e4f9/go.mod h1:I2ogRfOYYqNpMhljPYdFUVUrLbZQ89Ba7QdfiW6EcJ0= -github.com/odwrtw/transmission v0.0.0-20170515140915-08885b3058e7 h1:NZz8yuBWWG4o3EGdoMap4o+JPKLBhqeSQ7nTfX6XPos= -github.com/odwrtw/transmission v0.0.0-20170515140915-08885b3058e7/go.mod h1:geyfqmhRrxMwbEo5RPwf5rw5vITQHHQlA7+azUQSIJM= +github.com/odwrtw/transmission v0.0.0-20200408122227-b562b9fbcbee h1:BttuvaEGtpe3rL7zm+e2RwVkj1DBo/Mb6XdbWd0a7ds= +github.com/odwrtw/transmission v0.0.0-20200408122227-b562b9fbcbee/go.mod h1:o+HdjqpVQPFqVTG4jncidwE0/cQoAfCJ4JMFaB481xc= github.com/odwrtw/yifysubs v0.0.0-20190417174645-d3bba6e4cfe0 h1:LasNCTYd9Pc3x34xc1p054ZF8rVPLhD2Vfk3Db2KSpo= github.com/odwrtw/yifysubs v0.0.0-20190417174645-d3bba6e4cfe0/go.mod h1:9TPMeWCUplybvf4aCW6Hu3KwJian+oSeK6jZ597z9i4= github.com/odwrtw/yts v0.0.0-20190417175129-d51f8755d93d h1:f100x20G/oZHNqC4iebFULY0wj4Inv5HRN+j53flOaA= -- 2.47.1