func (as *AddonSearcher) call(method string, searchObject interface{}) []*bittorrent.Torrent { torrents := make([]*bittorrent.Torrent, 0) cid, c := GetCallback() cbUrl := fmt.Sprintf("%s/callbacks/%s", util.GetHTTPHost(), cid) payload := &SearchPayload{ Method: method, CallbackURL: cbUrl, SearchObject: searchObject, } xbmc.ExecuteAddon(as.addonId, payload.String()) timeout := providerTimeout() conf := config.Get() if conf.CustomProviderTimeoutEnabled == true { timeout = time.Duration(conf.CustomProviderTimeout) * time.Second } select { case <-time.After(timeout): as.log.Info("Provider %s was too slow. Ignored.", as.addonId) RemoveCallback(cid) case result := <-c: json.Unmarshal(result, &torrents) } return torrents }
func Play(btService *bittorrent.BTService) gin.HandlerFunc { return func(ctx *gin.Context) { uri := ctx.Request.URL.Query().Get("uri") index := ctx.Request.URL.Query().Get("index") resume := ctx.Request.URL.Query().Get("resume") if uri == "" && resume == "" { return } fileIndex := -1 if index != "" { fIndex, err := strconv.Atoi(index) if err == nil { fileIndex = fIndex } } resumeIndex := -1 if resume != "" { rIndex, err := strconv.Atoi(resume) if err == nil && rIndex >= 0 { resumeIndex = rIndex } } magnet := "" infoHash := "" if uri != "" { torrent := bittorrent.NewTorrent(uri) magnet = torrent.Magnet() infoHash = torrent.InfoHash boosters := url.Values{ "tr": bittorrent.DefaultTrackers, } magnet += "&" + boosters.Encode() } player := bittorrent.NewBTPlayer(btService, magnet, fileIndex, resumeIndex, infoHash) if player.Buffer() != nil { return } rUrl, _ := url.Parse(fmt.Sprintf("%s/files/%s", util.GetHTTPHost(), player.PlayURL())) ctx.Redirect(302, rUrl.String()) } }
func UrlForHTTP(pattern string, args ...interface{}) string { u, _ := url.Parse(fmt.Sprintf(pattern, args...)) return util.GetHTTPHost() + u.String() }
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 Play(btService *bittorrent.BTService) gin.HandlerFunc { return func(ctx *gin.Context) { uri := ctx.Request.URL.Query().Get("uri") index := ctx.Request.URL.Query().Get("index") resume := ctx.Request.URL.Query().Get("resume") contentType := ctx.Request.URL.Query().Get("type") tmdb := ctx.Request.URL.Query().Get("tmdb") runtime := ctx.Request.URL.Query().Get("runtime") if uri == "" && resume == "" { return } fileIndex := -1 if index != "" { fIndex, err := strconv.Atoi(index) if err == nil { fileIndex = fIndex } } resumeIndex := -1 if resume != "" { rIndex, err := strconv.Atoi(resume) if err == nil && rIndex >= 0 { resumeIndex = rIndex } } tmdbId := -1 if tmdb != "" { id, err := strconv.Atoi(tmdb) if err == nil && id >= 0 { tmdbId = id } } runTime := -1 if tmdb != "" { runtimeInt, err := strconv.Atoi(runtime) if err == nil && runtimeInt >= 0 { runTime = runtimeInt } } magnet := "" infoHash := "" if uri != "" { torrent := bittorrent.NewTorrent(uri) magnet = torrent.Magnet() infoHash = torrent.InfoHash boosters := url.Values{ "tr": bittorrent.DefaultTrackers, } magnet += "&" + boosters.Encode() } params := bittorrent.BTPlayerParams{ URI: magnet, InfoHash: infoHash, FileIndex: fileIndex, ResumeIndex: resumeIndex, ContentType: contentType, TMDBId: tmdbId, Runtime: runTime, } player := bittorrent.NewBTPlayer(btService, params) if player.Buffer() != nil { return } rUrl, _ := url.Parse(fmt.Sprintf("%s/files/%s", util.GetHTTPHost(), player.PlayURL())) ctx.Redirect(302, rUrl.String()) } }