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) { 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 { item.Path = UrlForXBMC("/show/%d/season/%d/episode/%d/play", show.Id, season.Season, item.Info.Episode, ) item.ContextMenu = [][]string{ []string{"Choose stream...", fmt.Sprintf("XBMC.PlayMedia(%s)", UrlForXBMC("/show/%d/season/%d/episode/%d/links", show.Id, season.Season, item.Info.Episode, ))}, } 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 renderShows(shows tmdb.Shows, ctx *gin.Context) { items := make(xbmc.ListItems, 0, len(shows)) for _, show := range shows { if show == nil { continue } item := show.ToListItem() item.Path = UrlForXBMC("/show/%d/seasons", show.ExternalIDs.TVDBID) items = append(items, item) } 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: "Movies", Path: UrlForXBMC("/movies/"), Thumbnail: config.AddonResource("img", "movies.png")}, {Label: "TV Shows", Path: UrlForXBMC("/shows/"), Thumbnail: config.AddonResource("img", "tv.png")}, {Label: "Search", Path: UrlForXBMC("/search"), Thumbnail: config.AddonResource("img", "search.png")}, {Label: "Paste URL", Path: UrlForXBMC("/pasted"), Thumbnail: config.AddonResource("img", "magnet.png")}, })) }
func TVIndex(ctx *gin.Context) { items := xbmc.ListItems{ {Label: "Search", Path: UrlForXBMC("/shows/search"), Thumbnail: config.AddonResource("img", "search.png")}, {Label: "Most Popular", 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) { items := make(xbmc.ListItems, 0, len(movies)) for _, movie := range movies { if movie == nil { continue } item := movie.ToListItem() item.Path = UrlForXBMC("/movie/%s/play", movie.IMDBId) item.Info.Trailer = UrlForHTTP("/youtube/%s", item.Info.Trailer) item.IsPlayable = true item.ContextMenu = [][]string{ []string{"Choose stream...", fmt.Sprintf("XBMC.PlayMedia(%s)", UrlForXBMC("/movie/%s/links", movie.IMDBId))}, } items = append(items, item) } ctx.JSON(200, xbmc.NewView("movies", items)) }
func MoviesIndex(ctx *gin.Context) { items := xbmc.ListItems{ {Label: "Search", Path: UrlForXBMC("/movies/search"), Thumbnail: config.AddonResource("img", "search.png")}, {Label: "Most Popular", Path: UrlForXBMC("/movies/popular"), Thumbnail: config.AddonResource("img", "popular.png")}, {Label: "Top Rated", Path: UrlForXBMC("/movies/top"), Thumbnail: config.AddonResource("img", "top_rated.png")}, {Label: "Most Voted", Path: UrlForXBMC("/movies/mostvoted"), Thumbnail: config.AddonResource("img", "most_voted.png")}, {Label: "IMDB Top 250", Path: UrlForXBMC("/movies/imdb250"), Thumbnail: config.AddonResource("img", "imdb.png")}, } for _, genre := range tmdb.GetMovieGenres(config.Get().Language) { slug, _ := genreSlugs[genre.Id] items = append(items, &xbmc.ListItem{ Label: genre.Name, Path: UrlForXBMC("/movies/popular/%s", strconv.Itoa(genre.Id)), Thumbnail: config.AddonResource("img", fmt.Sprintf("genre_%s.png", slug)), }) } ctx.JSON(200, xbmc.NewView("", 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 Search(c *gin.Context) { query := xbmc.Keyboard("", "Search") 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 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 Pulsar? 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)) }