From 2f494c122540cccdb247ca3e4ef59fce78c3020b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 4 Oct 2025 19:18:44 +0000 Subject: [PATCH] add new players: vidsrc, twoembed, autoembed, vidlink --- api/index.go | 4 + main.go | 4 + pkg/handlers/players.go | 161 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 169 insertions(+) diff --git a/api/index.go b/api/index.go index 240dbb5..4626d1d 100644 --- a/api/index.go +++ b/api/index.go @@ -97,6 +97,10 @@ func Handler(w http.ResponseWriter, r *http.Request) { api.HandleFunc("/players/alloha/{imdb_id}", playersHandler.GetAllohaPlayer).Methods("GET") api.HandleFunc("/players/lumex/{imdb_id}", playersHandler.GetLumexPlayer).Methods("GET") api.HandleFunc("/players/vibix/{imdb_id}", playersHandler.GetVibixPlayer).Methods("GET") + api.HandleFunc("/players/vidsrc/{media_type}/{id}", playersHandler.GetVidsrcPlayer).Methods("GET") + api.HandleFunc("/players/twoembed/{media_type}/{id}", playersHandler.Get2EmbedPlayer).Methods("GET") + api.HandleFunc("/players/autoembed/{media_type}/{tmdb_id}", playersHandler.GetAutoembedPlayer).Methods("GET") + api.HandleFunc("/players/vidlink/{media_type}/{id}", playersHandler.GetVidlinkPlayer).Methods("GET") api.HandleFunc("/players/rgshows/{tmdb_id}", playersHandler.GetRgShowsPlayer).Methods("GET") api.HandleFunc("/players/rgshows/{tmdb_id}/{season}/{episode}", playersHandler.GetRgShowsTVPlayer).Methods("GET") api.HandleFunc("/players/iframevideo/{kinopoisk_id}/{imdb_id}", playersHandler.GetIframeVideoPlayer).Methods("GET") diff --git a/main.go b/main.go index fe125f8..ffa6cce 100644 --- a/main.go +++ b/main.go @@ -78,6 +78,10 @@ func main() { api.HandleFunc("/players/alloha/{imdb_id}", playersHandler.GetAllohaPlayer).Methods("GET") api.HandleFunc("/players/lumex/{imdb_id}", playersHandler.GetLumexPlayer).Methods("GET") api.HandleFunc("/players/vibix/{imdb_id}", playersHandler.GetVibixPlayer).Methods("GET") + api.HandleFunc("/players/vidsrc/{media_type}/{id}", playersHandler.GetVidsrcPlayer).Methods("GET") + api.HandleFunc("/players/twoembed/{media_type}/{id}", playersHandler.Get2EmbedPlayer).Methods("GET") + api.HandleFunc("/players/autoembed/{media_type}/{tmdb_id}", playersHandler.GetAutoembedPlayer).Methods("GET") + api.HandleFunc("/players/vidlink/{media_type}/{id}", playersHandler.GetVidlinkPlayer).Methods("GET") api.HandleFunc("/torrents/search/{imdbId}", torrentsHandler.SearchTorrents).Methods("GET") api.HandleFunc("/torrents/movies", torrentsHandler.SearchMovies).Methods("GET") diff --git a/pkg/handlers/players.go b/pkg/handlers/players.go index 8a557f2..03e32b5 100644 --- a/pkg/handlers/players.go +++ b/pkg/handlers/players.go @@ -435,3 +435,164 @@ func (h *PlayersHandler) GetStreamAPI(w http.ResponseWriter, r *http.Request) { log.Printf("Successfully served stream API for provider: %s, tmdb_id: %s", provider, tmdbID) } + +// GetVidsrcPlayer handles Vidsrc.to player +func (h *PlayersHandler) GetVidsrcPlayer(w http.ResponseWriter, r *http.Request) { + log.Printf("GetVidsrcPlayer called: %s %s", r.Method, r.URL.Path) + + vars := mux.Vars(r) + idType := vars["id_type"] // "imdb" or "tmdb" + id := vars["id"] + mediaType := vars["media_type"] // "movie" or "tv" + + if id == "" || mediaType == "" { + http.Error(w, "id and media_type are required", http.StatusBadRequest) + return + } + + var playerURL string + if mediaType == "movie" { + playerURL = fmt.Sprintf("https://vidsrc.to/embed/movie/%s", id) + } else if mediaType == "tv" { + season := r.URL.Query().Get("season") + episode := r.URL.Query().Get("episode") + if season == "" || episode == "" { + http.Error(w, "season and episode are required for TV shows", http.StatusBadRequest) + return + } + playerURL = fmt.Sprintf("https://vidsrc.to/embed/tv/%s/%s/%s", id, season, episode) + } else { + http.Error(w, "Invalid media_type. Use 'movie' or 'tv'", http.StatusBadRequest) + return + } + + log.Printf("Generated Vidsrc URL: %s", playerURL) + + iframe := fmt.Sprintf(``, playerURL) + htmlDoc := fmt.Sprintf(`Vidsrc Player%s`, iframe) + + w.Header().Set("Content-Type", "text/html") + w.Write([]byte(htmlDoc)) + + log.Printf("Successfully served Vidsrc player for %s: %s", mediaType, id) +} + +// Get2EmbedPlayer handles 2embed.cc player +func (h *PlayersHandler) Get2EmbedPlayer(w http.ResponseWriter, r *http.Request) { + log.Printf("Get2EmbedPlayer called: %s %s", r.Method, r.URL.Path) + + vars := mux.Vars(r) + id := vars["id"] + mediaType := vars["media_type"] // "movie" or "tv" + + if id == "" || mediaType == "" { + http.Error(w, "id and media_type are required", http.StatusBadRequest) + return + } + + var playerURL string + if mediaType == "movie" { + playerURL = fmt.Sprintf("https://www.2embed.cc/embed/%s", id) + } else if mediaType == "tv" { + season := r.URL.Query().Get("season") + episode := r.URL.Query().Get("episode") + if season == "" || episode == "" { + http.Error(w, "season and episode are required for TV shows", http.StatusBadRequest) + return + } + playerURL = fmt.Sprintf("https://www.2embed.cc/embedtv/%s&s=%s&e=%s", id, season, episode) + } else { + http.Error(w, "Invalid media_type. Use 'movie' or 'tv'", http.StatusBadRequest) + return + } + + log.Printf("Generated 2Embed URL: %s", playerURL) + + iframe := fmt.Sprintf(``, playerURL) + htmlDoc := fmt.Sprintf(`2Embed Player%s`, iframe) + + w.Header().Set("Content-Type", "text/html") + w.Write([]byte(htmlDoc)) + + log.Printf("Successfully served 2Embed player for %s: %s", mediaType, id) +} + +// GetAutoembedPlayer handles autoembed.cc player +func (h *PlayersHandler) GetAutoembedPlayer(w http.ResponseWriter, r *http.Request) { + log.Printf("GetAutoembedPlayer called: %s %s", r.Method, r.URL.Path) + + vars := mux.Vars(r) + tmdbId := vars["tmdb_id"] + mediaType := vars["media_type"] // "movie" or "tv" + + if tmdbId == "" || mediaType == "" { + http.Error(w, "tmdb_id and media_type are required", http.StatusBadRequest) + return + } + + var playerURL string + if mediaType == "movie" { + playerURL = fmt.Sprintf("https://autoembed.cc/movie/tmdb/%s", tmdbId) + } else if mediaType == "tv" { + season := r.URL.Query().Get("season") + episode := r.URL.Query().Get("episode") + if season == "" || episode == "" { + http.Error(w, "season and episode are required for TV shows", http.StatusBadRequest) + return + } + playerURL = fmt.Sprintf("https://autoembed.cc/tv/tmdb/%s-%s-%s", tmdbId, season, episode) + } else { + http.Error(w, "Invalid media_type. Use 'movie' or 'tv'", http.StatusBadRequest) + return + } + + log.Printf("Generated Autoembed URL: %s", playerURL) + + iframe := fmt.Sprintf(``, playerURL) + htmlDoc := fmt.Sprintf(`Autoembed Player%s`, iframe) + + w.Header().Set("Content-Type", "text/html") + w.Write([]byte(htmlDoc)) + + log.Printf("Successfully served Autoembed player for %s: %s", mediaType, tmdbId) +} + +// GetVidlinkPlayer handles vidlink.pro player +func (h *PlayersHandler) GetVidlinkPlayer(w http.ResponseWriter, r *http.Request) { + log.Printf("GetVidlinkPlayer called: %s %s", r.Method, r.URL.Path) + + vars := mux.Vars(r) + id := vars["id"] + mediaType := vars["media_type"] // "movie" or "tv" + + if id == "" || mediaType == "" { + http.Error(w, "id and media_type are required", http.StatusBadRequest) + return + } + + var playerURL string + if mediaType == "movie" { + playerURL = fmt.Sprintf("https://vidlink.pro/movie/%s", id) + } else if mediaType == "tv" { + season := r.URL.Query().Get("season") + episode := r.URL.Query().Get("episode") + if season == "" || episode == "" { + http.Error(w, "season and episode are required for TV shows", http.StatusBadRequest) + return + } + playerURL = fmt.Sprintf("https://vidlink.pro/tv/%s/%s/%s", id, season, episode) + } else { + http.Error(w, "Invalid media_type. Use 'movie' or 'tv'", http.StatusBadRequest) + return + } + + log.Printf("Generated Vidlink URL: %s", playerURL) + + iframe := fmt.Sprintf(``, playerURL) + htmlDoc := fmt.Sprintf(`Vidlink Player%s`, iframe) + + w.Header().Set("Content-Type", "text/html") + w.Write([]byte(htmlDoc)) + + log.Printf("Successfully served Vidlink player for %s: %s", mediaType, id) +}