@ -9,7 +9,6 @@ package liveurls
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
@ -17,6 +16,7 @@ import (
)
type Douyin struct {
Quality string
Shorturl string
Rid string
}
@ -45,8 +45,7 @@ func GetRoomId(url string) any {
}
func ( d * Douyin ) GetRealurl ( ) any {
var mediamap map [ string ] map [ string ] map [ string ] map [ string ] any
var roomstatus map [ string ] map [ string ] map [ string ] int
var mediamap map [ string ] map [ string ] map [ string ] map [ string ] map [ string ] any
var roomid string
if str , ok := GetRoomId ( d . Shorturl ) . ( string ) ; ok {
roomid = str
@ -54,24 +53,72 @@ func (d *Douyin) GetRealurl() any {
return nil
}
client := & http . Client { }
r , _ := http . NewRequest ( "GET" , "https://webcast.amemv.com/webcast/room/reflow/info/?type_id=0&live_id=1&room_id=" + roomid + "&sec_user_id=&app_id=1128" , nil )
r . Header . Add ( "Accept" , "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" )
r . Header . Add ( "user-agent" , "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1" )
params := map [ string ] string {
"aid" : "6383" ,
"live_id" : "1" ,
"device_platform" : "web" ,
"language" : "zh-CN" ,
"enter_from" : "web_search" ,
"cookie_enabled" : "true" ,
"screen_width" : "1920" ,
"screen_height" : "1080" ,
"browser_language" : "zh-CN" ,
"browser_name" : "Chrome" ,
"room_id" : roomid ,
"scene" : "pc_stream_4k" ,
}
r , _ := http . NewRequest ( "GET" , "https://live.douyin.com/webcast/room/info_by_scene/?" , nil )
q := r . URL . Query ( )
for k , v := range params {
q . Add ( k , v )
}
r . URL . RawQuery = q . Encode ( )
resp , _ := client . Do ( r )
defer resp . Body . Close ( )
body , _ := io . ReadAll ( resp . Body )
str , _ := url . QueryUnescape ( string ( body ) )
json . Unmarshal ( [ ] byte ( str ) , & mediamap )
json . Unmarshal ( [ ] byte ( str ) , & roomstatus )
var realurl any
if mediaslice , ok := mediamap [ "data" ] [ "room" ] [ "stream_url" ] [ "hls_pull_url_map" ] . ( map [ string ] any ) ; ok {
for k , v := range mediaslice {
if k == "FULL_HD1" {
realurl = fmt . Sprintf ( "%v" , v )
}
if roomstatus [ "data" ] [ "room" ] [ "status" ] != 2 {
realurl = nil
if mediaslice , ok := mediamap [ "data" ] [ "stream_url" ] [ "live_core_sdk_data" ] [ "pull_data" ] [ "Hls" ] . ( [ ] any ) ; ok {
for _ , v := range mediaslice {
if newmediamap , ok := v . ( map [ string ] any ) ; ok {
for k := range newmediamap {
switch d . Quality {
case "uhd" :
{
if newmediamap [ k ] == "uhd" {
realurl = newmediamap [ "url" ]
}
}
case "origin" :
{
if newmediamap [ k ] == "origin" {
realurl = newmediamap [ "url" ]
}
}
case "hd" :
{
if newmediamap [ k ] == "hd" {
realurl = newmediamap [ "url" ]
}
}
case "sd" :
{
if newmediamap [ k ] == "sd" {
realurl = newmediamap [ "url" ]
}
}
case "ld" :
{
if newmediamap [ k ] == "ld" {
realurl = newmediamap [ "url" ]
}
}
}
}
}
}
}
return realurl