func Search(ctx *gin.Context) { query := ctx.Request.URL.Query().Get("q") if len(searchHistory) > 0 && xbmc.DialogConfirm("Quasar", "LOCALIZE[30262]") { choice := xbmc.ListDialog("LOCALIZE[30261]", searchHistory...) query = searchHistory[choice] } else { query = xbmc.Keyboard("", "LOCALIZE[30209]") if query == "" { return } searchHistory = append(searchHistory, query) } log.Println("Searching providers for:", query) searchers := providers.GetSearchers() torrents := providers.Search(searchers, query) items := make(xbmc.ListItems, 0, len(torrents)) for _, torrent := range torrents { item := &xbmc.ListItem{ Label: fmt.Sprintf("S:%d P:%d - %s", torrent.Seeds, torrent.Peers, torrent.Name), Path: UrlQuery(UrlForXBMC("/play"), "uri", torrent.URI), IsPlayable: true, } items = append(items, item) } ctx.JSON(200, xbmc.NewView("", items)) }
func renderShows(shows tmdb.Shows, ctx *gin.Context, page int) { paging := 0 if page >= 0 { paging = 1 } items := make(xbmc.ListItems, 0, len(shows)+paging) for _, show := range shows { if show == nil { continue } item := show.ToListItem() item.Path = UrlForXBMC("/show/%d/seasons", show.Id) item.ContextMenu = [][]string{ []string{"LOCALIZE[30219]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/library/show/addremove/%d", show.Id))}, []string{"LOCALIZE[30035]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/setviewmode/tvshows"))}, } items = append(items, item) } if page >= 0 { path := ctx.Request.URL.Path nextpage := &xbmc.ListItem{ Label: "LOCALIZE[30218]", Path: UrlForXBMC(fmt.Sprintf("%s?page=%d", path, page+1)), Thumbnail: config.AddonResource("img", "nextpage.png"), } items = append(items, nextpage) } ctx.JSON(200, xbmc.NewView("tvshows", items)) }
func TVIndex(ctx *gin.Context) { items := xbmc.ListItems{ {Label: "LOCALIZE[30209]", Path: UrlForXBMC("/shows/search"), Thumbnail: config.AddonResource("img", "search.png")}, {Label: "LOCALIZE[30056]", Path: UrlForXBMC("/shows/trakt/"), Thumbnail: config.AddonResource("img", "trakt.png")}, {Label: "LOCALIZE[30238]", Path: UrlForXBMC("/shows/recent/episodes"), Thumbnail: config.AddonResource("img", "fresh.png")}, {Label: "LOCALIZE[30237]", Path: UrlForXBMC("/shows/recent/shows"), Thumbnail: config.AddonResource("img", "clock.png")}, {Label: "LOCALIZE[30210]", Path: UrlForXBMC("/shows/popular"), Thumbnail: config.AddonResource("img", "popular.png")}, {Label: "LOCALIZE[30211]", Path: UrlForXBMC("/shows/top"), Thumbnail: config.AddonResource("img", "top_rated.png")}, {Label: "LOCALIZE[30212]", Path: UrlForXBMC("/shows/mostvoted"), Thumbnail: config.AddonResource("img", "most_voted.png")}, } for _, genre := range tmdb.GetTVGenres(config.Get().Language) { slug, _ := genreSlugs[genre.Id] items = append(items, &xbmc.ListItem{ Label: genre.Name, Path: UrlForXBMC("/shows/popular/%s", strconv.Itoa(genre.Id)), Thumbnail: config.AddonResource("img", fmt.Sprintf("genre_%s.png", slug)), ContextMenu: [][]string{ []string{"LOCALIZE[30237]", fmt.Sprintf("Container.Update(%s)", UrlForXBMC("/shows/recent/shows/%s", strconv.Itoa(genre.Id)))}, []string{"LOCALIZE[30238]", fmt.Sprintf("Container.Update(%s)", UrlForXBMC("/shows/recent/episodes/%s", strconv.Itoa(genre.Id)))}, }, }) } ctx.JSON(200, xbmc.NewView("", items)) }
func ProviderList(ctx *gin.Context) { providers := getProviders() items := make(xbmc.ListItems, 0, len(providers)) for _, provider := range providers { status := "[COLOR FF009900]Ok[/COLOR]" if provider.Status > 0 { status = "[COLOR FF999900]Fail[/COLOR]" } enabled := "[COLOR FF009900]Enabled[/COLOR]" if provider.Enabled == false { enabled = "[COLOR FF990000]Disabled[/COLOR]" } item := &xbmc.ListItem{ Label: fmt.Sprintf("%s - %s - %s %s", status, enabled, provider.Name, provider.Version), Path: UrlForXBMC("/provider/%s/check", provider.ID), IsPlayable: false, } item.ContextMenu = [][]string{ []string{"LOCALIZE[30242]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/provider/%s/check", provider.ID))}, []string{"LOCALIZE[30240]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/provider/%s/enable", provider.ID))}, []string{"LOCALIZE[30241]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/provider/%s/disable", provider.ID))}, } if provider.Enabled { item.ContextMenu = append(item.ContextMenu, []string{ "LOCALIZE[30244]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/provider/%s/settings", provider.ID)), }) } items = append(items, item) } ctx.JSON(200, xbmc.NewView("", items)) }
func SubtitleGet(ctx *gin.Context) { q := ctx.Request.URL.Query() file := q.Get("file") dl := q.Get("dl") resp, err := http.Get(dl) if err != nil { ctx.AbortWithError(500, err) return } defer resp.Body.Close() reader, err := gzip.NewReader(resp.Body) if err != nil { ctx.AbortWithError(500, err) return } defer reader.Close() outFile, err := ioutil.TempFile("", "") if err != nil { ctx.AbortWithError(500, err) return } defer outFile.Close() io.Copy(outFile, reader) ctx.JSON(200, xbmc.NewView("", xbmc.ListItems{ {Label: file, Path: outFile.Name()}, })) }
func ShowEpisodes(ctx *gin.Context) { showId, _ := strconv.Atoi(ctx.Params.ByName("showId")) seasonNumber, _ := strconv.Atoi(ctx.Params.ByName("season")) language := config.Get().Language show := tmdb.GetShow(showId, language) season := tmdb.GetSeason(showId, seasonNumber, language) items := season.Episodes.ToListItems(show, season) for _, item := range items { playUrl := UrlForXBMC("/show/%d/season/%d/episode/%d/play", show.Id, seasonNumber, item.Info.Episode, ) episodeLinksUrl := UrlForXBMC("/show/%d/season/%d/episode/%d/links", show.Id, seasonNumber, item.Info.Episode, ) if config.Get().ChooseStreamAuto == true { item.Path = playUrl } else { item.Path = episodeLinksUrl } item.ContextMenu = [][]string{ []string{"LOCALIZE[30202]", fmt.Sprintf("XBMC.PlayMedia(%s)", episodeLinksUrl)}, []string{"LOCALIZE[30023]", fmt.Sprintf("XBMC.PlayMedia(%s)", playUrl)}, []string{"LOCALIZE[30203]", "XBMC.Action(Info)"}, []string{"LOCALIZE[30037]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/setviewmode/episodes"))}, } item.IsPlayable = true } ctx.JSON(200, xbmc.NewView("episodes", items)) }
func MovieGenres(ctx *gin.Context) { genres := tmdb.GetMovieGenres(config.Get().Language) items := make(xbmc.ListItems, 0, len(genres)) for _, genre := range genres { items = append(items, &xbmc.ListItem{ Label: genre.Name, Path: UrlForXBMC("/movies/popular/%s", strconv.Itoa(genre.Id)), }) } ctx.JSON(200, xbmc.NewView("", items)) }
func TVTrakt(ctx *gin.Context) { items := xbmc.ListItems{ {Label: "LOCALIZE[30254]", Path: UrlForXBMC("/shows/trakt/watchlist"), Thumbnail: config.AddonResource("img", "trakt.png")}, {Label: "LOCALIZE[30257]", Path: UrlForXBMC("/shows/trakt/collection"), Thumbnail: config.AddonResource("img", "trakt.png")}, {Label: "LOCALIZE[30210]", Path: UrlForXBMC("/shows/trakt/popular"), Thumbnail: config.AddonResource("img", "popular.png")}, {Label: "LOCALIZE[30246]", Path: UrlForXBMC("/shows/trakt/trending"), Thumbnail: config.AddonResource("img", "trending.png")}, {Label: "LOCALIZE[30247]", Path: UrlForXBMC("/shows/trakt/played"), Thumbnail: config.AddonResource("img", "most_played.png")}, {Label: "LOCALIZE[30248]", Path: UrlForXBMC("/shows/trakt/watched"), Thumbnail: config.AddonResource("img", "most_watched.png")}, {Label: "LOCALIZE[30249]", Path: UrlForXBMC("/shows/trakt/collected"), Thumbnail: config.AddonResource("img", "most_collected.png")}, {Label: "LOCALIZE[30250]", Path: UrlForXBMC("/shows/trakt/anticipated"), Thumbnail: config.AddonResource("img", "most_anticipated.png")}, } ctx.JSON(200, xbmc.NewView("", items)) }
func renderShows(shows tmdb.Shows, ctx *gin.Context, page int, query string) { nextPage := 0 if page >= 0 { nextPage = 1 } items := make(xbmc.ListItems, 0, len(shows)+nextPage) for _, show := range shows { if show == nil { continue } item := show.ToListItem() item.Path = UrlForXBMC("/show/%d/seasons", show.Id) libraryAction := []string{"LOCALIZE[30252]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/library/show/add/%d", show.Id))} if inJsonDb, err := InJsonDB(strconv.Itoa(show.Id), LShow); err == nil && inJsonDb == true { libraryAction = []string{"LOCALIZE[30253]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/library/show/remove/%d", show.Id))} } watchlistAction := []string{"LOCALIZE[30255]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/show/%d/watchlist/add", show.Id))} if InShowsWatchlist(show.Id) { watchlistAction = []string{"LOCALIZE[30256]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/show/%d/watchlist/remove", show.Id))} } collectionAction := []string{"LOCALIZE[30258]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/show/%d/collection/add", show.Id))} if InShowsCollection(show.Id) { collectionAction = []string{"LOCALIZE[30259]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/show/%d/collection/remove", show.Id))} } item.ContextMenu = [][]string{ libraryAction, watchlistAction, collectionAction, []string{"LOCALIZE[30035]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/setviewmode/tvshows"))}, } items = append(items, item) } if page >= 0 { path := ctx.Request.URL.Path nextPath := UrlForXBMC(fmt.Sprintf("%s?page=%d", path, page+1)) if query != "" { nextPath = UrlForXBMC(fmt.Sprintf("%s?q=%s&page=%d", path, query, page+1)) } next := &xbmc.ListItem{ Label: "LOCALIZE[30218]", Path: nextPath, Thumbnail: config.AddonResource("img", "nextpage.png"), } items = append(items, next) } ctx.JSON(200, xbmc.NewView("tvshows", items)) }
func Index(ctx *gin.Context) { action := ctx.Request.URL.Query().Get("action") if action == "search" || action == "manualsearch" { SubtitlesIndex(ctx) return } ctx.JSON(200, xbmc.NewView("", xbmc.ListItems{ {Label: "LOCALIZE[30214]", Path: UrlForXBMC("/movies/"), Thumbnail: config.AddonResource("img", "movies.png")}, {Label: "LOCALIZE[30215]", Path: UrlForXBMC("/shows/"), Thumbnail: config.AddonResource("img", "tv.png")}, {Label: "LOCALIZE[30209]", Path: UrlForXBMC("/search"), Thumbnail: config.AddonResource("img", "search.png")}, {Label: "LOCALIZE[30216]", Path: UrlForXBMC("/pasted"), Thumbnail: config.AddonResource("img", "magnet.png")}, })) }
func ListTorrents(btService *bittorrent.BTService) gin.HandlerFunc { return func(ctx *gin.Context) { btService.Session.GetTorrents() torrentsVector := btService.Session.GetTorrents() torrentsVectorSize := int(torrentsVector.Size()) items := make(xbmc.ListItems, 0, torrentsVectorSize) torrentsLog.Info("Currently downloading:") for i := 0; i < torrentsVectorSize; i++ { torrentHandle := torrentsVector.Get(i) if torrentHandle.IsValid() == false { continue } torrentStatus := torrentHandle.Status() progress := float64(torrentStatus.GetProgress()) * 100 torrentName := torrentStatus.GetName() playUrl := UrlQuery(UrlForXBMC("/play"), "resume", fmt.Sprintf("%d", i)) status := bittorrent.StatusStrings[int(torrentStatus.GetState())] if torrentStatus.GetPaused() || btService.Session.IsPaused() { status = "Paused" } torrentsLog.Info(fmt.Sprintf("- %s - %s", status, torrentName)) item := xbmc.ListItem{ Label: fmt.Sprintf("%.2f%% - %s - %s", progress, status, torrentName), Path: playUrl, Info: &xbmc.ListItemInfo{ Title: torrentName, }, } item.ContextMenu = [][]string{ []string{"LOCALIZE[30230]", fmt.Sprintf("XBMC.PlayMedia(%s)", playUrl)}, []string{"LOCALIZE[30235]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/resume/%d", i))}, []string{"LOCALIZE[30231]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/pause/%d", i))}, []string{"LOCALIZE[30232]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/delete/%d", i))}, []string{"LOCALIZE[30233]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/pause"))}, []string{"LOCALIZE[30234]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/resume"))}, } item.IsPlayable = true items = append(items, &item) } ctx.JSON(200, xbmc.NewView("", items)) } }
func TVIndex(ctx *gin.Context) { items := xbmc.ListItems{ {Label: "LOCALIZE[30209]", Path: UrlForXBMC("/shows/search"), Thumbnail: config.AddonResource("img", "search.png")}, {Label: "LOCALIZE[30210]", Path: UrlForXBMC("/shows/popular"), Thumbnail: config.AddonResource("img", "popular.png")}, } for _, genre := range tmdb.GetTVGenres(config.Get().Language) { slug, _ := genreSlugs[genre.Id] items = append(items, &xbmc.ListItem{ Label: genre.Name, Path: UrlForXBMC("/shows/popular/%s", strconv.Itoa(genre.Id)), Thumbnail: config.AddonResource("img", fmt.Sprintf("genre_%s.png", slug)), }) } ctx.JSON(200, xbmc.NewView("", items)) }
func renderMovies(movies tmdb.Movies, ctx *gin.Context, page int) { paging := 0 if page >= 0 { paging = 1 } items := make(xbmc.ListItems, 0, len(movies)+paging) for _, movie := range movies { if movie == nil { continue } item := movie.ToListItem() playUrl := UrlForXBMC("/movie/%d/play", movie.Id) movieLinksUrl := UrlForXBMC("/movie/%d/links", movie.Id) if config.Get().ChooseStreamAuto == true { item.Path = playUrl } else { item.Path = movieLinksUrl } item.ContextMenu = [][]string{ []string{"LOCALIZE[30202]", fmt.Sprintf("XBMC.PlayMedia(%s)", movieLinksUrl)}, []string{"LOCALIZE[30023]", fmt.Sprintf("XBMC.PlayMedia(%s)", playUrl)}, []string{"LOCALIZE[30203]", "XBMC.Action(Info)"}, } if movie.IMDBId != "" { item.ContextMenu = append(item.ContextMenu, []string{ "LOCALIZE[30219]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/library/movie/addremove/%s", movie.IMDBId)), }) } item.ContextMenu = append(item.ContextMenu, []string{ "LOCALIZE[30034]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/setviewmode/movies")), }) item.Info.Trailer = UrlForHTTP("/youtube/%s", item.Info.Trailer) item.IsPlayable = true items = append(items, item) } if page >= 0 { path := ctx.Request.URL.Path nextpage := &xbmc.ListItem{ Label: "LOCALIZE[30218]", Path: UrlForXBMC(fmt.Sprintf("%s?page=%d", path, page+1)), Thumbnail: config.AddonResource("img", "nextpage.png"), } items = append(items, nextpage) } ctx.JSON(200, xbmc.NewView("movies", items)) }
func ShowSeasons(ctx *gin.Context) { show, err := tvdb.NewShowCached(ctx.Params.ByName("showId"), config.Get().Language) if err != nil { ctx.Error(err) return } items := show.Seasons.ToListItems(show) reversedItems := make(xbmc.ListItems, 0) for i := len(items) - 1; i >= 0; i-- { item := items[i] item.Path = UrlForXBMC("/show/%d/season/%d/episodes", show.Id, item.Info.Season) reversedItems = append(reversedItems, item) } // xbmc.ListItems always returns false to Less() so that order is unchanged ctx.JSON(200, xbmc.NewView("seasons", reversedItems)) }
func ShowSeasons(ctx *gin.Context) { showId, _ := strconv.Atoi(ctx.Params.ByName("showId")) show := tmdb.GetShow(showId, config.Get().Language) items := show.Seasons.ToListItems(show) reversedItems := make(xbmc.ListItems, 0) for i := len(items) - 1; i >= 0; i-- { item := items[i] item.Path = UrlForXBMC("/show/%d/season/%d/episodes", show.Id, item.Info.Season) item.ContextMenu = [][]string{ []string{"LOCALIZE[30036]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/setviewmode/seasons"))}, } reversedItems = append(reversedItems, item) } // xbmc.ListItems always returns false to Less() so that order is unchanged ctx.JSON(200, xbmc.NewView("seasons", reversedItems)) }
func SubtitleGet(ctx *gin.Context) { q := ctx.Request.URL.Query() file := q.Get("file") dl := q.Get("dl") resp, err := http.Get(dl) if err != nil { ctx.AbortWithError(404, err) return } defer resp.Body.Close() reader, err := gzip.NewReader(resp.Body) if err != nil { ctx.AbortWithError(404, err) return } defer reader.Close() subtitlesPath := filepath.Join(config.Get().DownloadPath, "Subtitles") if _, err := os.Stat(subtitlesPath); os.IsNotExist(err) { if err := os.Mkdir(subtitlesPath, 0755); err != nil { subLog.Error("Unable to create Subtitles folder") } } outFile, err := os.Create(filepath.Join(subtitlesPath, file)) if err != nil { ctx.AbortWithError(404, err) return } defer outFile.Close() io.Copy(outFile, reader) ctx.JSON(200, xbmc.NewView("", xbmc.ListItems{ {Label: file, Path: outFile.Name()}, })) }
func ListTorrents(btService *bittorrent.BTService) gin.HandlerFunc { return func(ctx *gin.Context) { btService.Session.GetTorrents() torrentsVector := btService.Session.GetTorrents() torrentsVectorSize := int(torrentsVector.Size()) items := make(xbmc.ListItems, 0, torrentsVectorSize) torrentsLog.Info("Currently downloading:") for i := 0; i < torrentsVectorSize; i++ { torrentHandle := torrentsVector.Get(i) if torrentHandle.IsValid() == false { continue } torrentName := torrentHandle.Status(uint(libtorrent.TorrentHandleQueryName)).GetName() torrentsLog.Info(fmt.Sprintf("- %s", torrentName)) playUrl := UrlQuery(UrlForXBMC("/play"), "resume", fmt.Sprintf("%d", i)) item := xbmc.ListItem{ Label: torrentName, Path: playUrl, Info: &xbmc.ListItemInfo{ Title: torrentName, }, } item.ContextMenu = [][]string{ []string{"LOCALIZE[30230]", fmt.Sprintf("XBMC.PlayMedia(%s)", playUrl)}, []string{"LOCALIZE[30231]", fmt.Sprintf("XBMC.PlayMedia(%s)", UrlForXBMC("/torrents/pause/%d", i))}, []string{"LOCALIZE[30232]", fmt.Sprintf("XBMC.PlayMedia(%s)", UrlForXBMC("/torrents/delete/%d", i))}, } item.IsPlayable = true items = append(items, &item) } ctx.JSON(200, xbmc.NewView("", items)) } }
func Search(c *gin.Context) { query := xbmc.Keyboard("", "LOCALIZE[30209]") if query == "" { return } log.Println("Searching providers for:", query) searchers := providers.GetSearchers() torrents := providers.Search(searchers, query) items := make(xbmc.ListItems, 0, len(torrents)) for _, torrent := range torrents { item := &xbmc.ListItem{ Label: fmt.Sprintf("S:%d P:%d - %s", torrent.Seeds, torrent.Peers, torrent.Name), Path: UrlQuery(UrlForXBMC("/play"), "uri", torrent.URI), IsPlayable: true, } items = append(items, item) } c.JSON(200, xbmc.NewView("", items)) }
func ShowEpisodes(ctx *gin.Context) { show, err := tvdb.NewShowCached(ctx.Params.ByName("showId"), config.Get().Language) if err != nil { ctx.Error(err) return } seasonNumber, _ := strconv.Atoi(ctx.Params.ByName("season")) season := show.Seasons[seasonNumber] items := season.Episodes.ToListItems(show) for _, item := range items { playUrl := UrlForXBMC("/show/%d/season/%d/episode/%d/play", show.Id, season.Season, item.Info.Episode, ) episodeLinksUrl := UrlForXBMC("/show/%d/season/%d/episode/%d/links", show.Id, season.Season, item.Info.Episode, ) if config.Get().ChooseStreamAuto == true { item.Path = playUrl } else { item.Path = episodeLinksUrl } item.ContextMenu = [][]string{ []string{"LOCALIZE[30202]", fmt.Sprintf("XBMC.PlayMedia(%s)", episodeLinksUrl)}, []string{"LOCALIZE[30023]", fmt.Sprintf("XBMC.PlayMedia(%s)", playUrl)}, []string{"LOCALIZE[30203]", "XBMC.Action(Info)"}, } item.IsPlayable = true } ctx.JSON(200, xbmc.NewView("episodes", items)) }
func renderTraktMovies(movies []*trakt.Movies, ctx *gin.Context, page int) { hasNextPage := 0 if page > 0 { hasNextPage = 1 } items := make(xbmc.ListItems, 0, len(movies)+hasNextPage) for _, movieListing := range movies { movie := movieListing.Movie if movie == nil { continue } item := movie.ToListItem() playUrl := UrlForXBMC("/movie/%d/play", movie.IDs.TMDB) movieLinksUrl := UrlForXBMC("/movie/%d/links", movie.IDs.TMDB) if config.Get().ChooseStreamAuto == true { item.Path = playUrl } else { item.Path = movieLinksUrl } libraryAction := []string{"LOCALIZE[30252]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/library/movie/add/%d", movie.IDs.TMDB))} if inJsonDb, err := InJsonDB(strconv.Itoa(movie.IDs.TMDB), LMovie); err == nil && inJsonDb == true { libraryAction = []string{"LOCALIZE[30253]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/library/movie/remove/%d", movie.IDs.TMDB))} } watchlistAction := []string{"LOCALIZE[30255]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/movie/%d/watchlist/add", movie.IDs.TMDB))} if InMoviesWatchlist(movie.IDs.TMDB) { watchlistAction = []string{"LOCALIZE[30256]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/movie/%d/watchlist/remove", movie.IDs.TMDB))} } collectionAction := []string{"LOCALIZE[30258]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/movie/%d/collection/add", movie.IDs.TMDB))} if InMoviesCollection(movie.IDs.TMDB) { collectionAction = []string{"LOCALIZE[30259]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/movie/%d/collection/remove", movie.IDs.TMDB))} } item.ContextMenu = [][]string{ []string{"LOCALIZE[30202]", fmt.Sprintf("XBMC.PlayMedia(%s)", movieLinksUrl)}, []string{"LOCALIZE[30023]", fmt.Sprintf("XBMC.PlayMedia(%s)", playUrl)}, []string{"LOCALIZE[30203]", "XBMC.Action(Info)"}, libraryAction, watchlistAction, collectionAction, []string{"LOCALIZE[30034]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/setviewmode/movies"))}, } // item.Info.Trailer = UrlForHTTP("/youtube/%s", movie.Trailer) item.IsPlayable = true items = append(items, item) } if page >= 0 && hasNextPage > 0 { path := ctx.Request.URL.Path nextpage := &xbmc.ListItem{ Label: "LOCALIZE[30218]", Path: UrlForXBMC(fmt.Sprintf("%s?page=%d", path, page+1)), Thumbnail: config.AddonResource("img", "nextpage.png"), } items = append(items, nextpage) } ctx.JSON(200, xbmc.NewView("movies", items)) }
func SubtitlesIndex(ctx *gin.Context) { q := ctx.Request.URL.Query() searchString := q.Get("searchstring") languages := strings.Split(q.Get("languages"), ",") labels := xbmc.InfoLabels( "VideoPlayer.Title", "VideoPlayer.OriginalTitle", "VideoPlayer.Year", "VideoPlayer.TVshowtitle", "VideoPlayer.Season", "VideoPlayer.Episode", ) playingFile := xbmc.PlayerGetPlayingFile() // are we reading a file from Quasar? if strings.HasPrefix(playingFile, util.GetHTTPHost()) { playingFile = strings.Replace(playingFile, util.GetHTTPHost()+"/files", config.Get().DownloadPath, 1) playingFile, _ = url.QueryUnescape(playingFile) } for i, lang := range languages { if lang == "Portuguese (Brazil)" { languages[i] = "pob" } else { isoLang := xbmc.ConvertLanguage(lang, xbmc.ISO_639_2) if isoLang == "gre" { isoLang = "ell" } languages[i] = isoLang } } payloads := []osdb.SearchPayload{} if searchString != "" { payloads = append(payloads, osdb.SearchPayload{ Query: searchString, Languages: strings.Join(languages, ","), }) } else { if strings.HasPrefix(playingFile, "http://") == false && strings.HasPrefix(playingFile, "https://") == false { appendLocalFilePayloads(playingFile, &payloads) } if labels["VideoPlayer.TVshowtitle"] != "" { appendEpisodePayloads(labels, &payloads) } else { appendMoviePayloads(labels, &payloads) } } for i, payload := range payloads { payload.Languages = strings.Join(languages, ",") payloads[i] = payload } client, err := osdb.NewClient() if err != nil { ctx.AbortWithError(500, err) return } if err := client.LogIn("", "", ""); err != nil { ctx.AbortWithError(500, err) return } items := make(xbmc.ListItems, 0) results, _ := client.SearchSubtitles(payloads) for _, sub := range results { rating, _ := strconv.ParseFloat(sub.SubRating, 64) subLang := sub.LanguageName if subLang == "Brazilian" { subLang = "Portuguese (Brazil)" } item := &xbmc.ListItem{ Label: subLang, Label2: sub.SubFileName, Icon: strconv.Itoa(int((rating / 2) + 0.5)), Thumbnail: sub.ISO639, Path: UrlQuery(UrlForXBMC("/subtitle/%s", sub.IDSubtitleFile), "file", sub.SubFileName, "lang", sub.SubLanguageID, "fmt", sub.SubFormat, "dl", sub.SubDownloadLink), Properties: make(map[string]string), } if sub.MatchedBy == "moviehash" { item.Properties["sync"] = "true" } if sub.SubHearingImpaired == "1" { item.Properties["hearing_imp"] = "true" } items = append(items, item) } ctx.JSON(200, xbmc.NewView("", items)) }
func ListTorrents(btService *bittorrent.BTService) gin.HandlerFunc { return func(ctx *gin.Context) { btService.Session.GetTorrents() torrentsVector := btService.Session.GetTorrents() torrentsVectorSize := int(torrentsVector.Size()) items := make(xbmc.ListItems, 0, torrentsVectorSize) torrentsLog.Info("Currently downloading:") for i := 0; i < torrentsVectorSize; i++ { torrentHandle := torrentsVector.Get(i) if torrentHandle.IsValid() == false { continue } torrentStatus := torrentHandle.Status() progress := float64(torrentStatus.GetProgress()) * 100 torrentName := torrentStatus.GetName() playUrl := UrlQuery(UrlForXBMC("/play"), "resume", fmt.Sprintf("%d", i)) status := bittorrent.StatusStrings[int(torrentStatus.GetState())] ratio := float64(0) allTimeDownload := float64(torrentStatus.GetAllTimeDownload()) if allTimeDownload > 0 { ratio = float64(torrentStatus.GetAllTimeUpload()) / allTimeDownload } timeRatio := float64(0) finished_time := float64(torrentStatus.GetFinishedTime()) download_time := float64(torrentStatus.GetActiveTime()) - finished_time if download_time > 1 { timeRatio = finished_time / download_time } seedingTime := time.Duration(torrentStatus.GetSeedingTime()) * time.Second torrentAction := []string{"LOCALIZE[30231]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/pause/%d", i))} sessionAction := []string{"LOCALIZE[30233]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/pause"))} if torrentStatus.GetPaused() { status = "Paused" torrentAction = []string{"LOCALIZE[30235]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/resume/%d", i))} } if btService.Session.IsPaused() { status = "Paused" sessionAction = []string{"LOCALIZE[30234]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/resume"))} } torrentsLog.Infof("- %.2f%% - %s - %.2f:1 / %.2f:1 (%s) - %s", progress, status, ratio, timeRatio, seedingTime.String(), torrentName) item := xbmc.ListItem{ Label: fmt.Sprintf("%.2f%% - %s - %.2f:1 / %.2f:1 (%s) - %s", progress, status, ratio, timeRatio, seedingTime.String(), torrentName), Path: playUrl, Info: &xbmc.ListItemInfo{ Title: torrentName, }, } item.ContextMenu = [][]string{ []string{"LOCALIZE[30230]", fmt.Sprintf("XBMC.PlayMedia(%s)", playUrl)}, torrentAction, []string{"LOCALIZE[30232]", fmt.Sprintf("XBMC.RunPlugin(%s)", UrlForXBMC("/torrents/delete/%d", i))}, sessionAction, } item.IsPlayable = true items = append(items, &item) } ctx.JSON(200, xbmc.NewView("", items)) } }