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)
+}