[
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 papagaye744\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# 源仓库已闭源\n\n建议自己部署docker的allinone使用，[https://hub.docker.com/r/youshandefeiyang/allinone](https://hub.docker.com/r/youshandefeiyang/allinone)\n"
  },
  {
    "path": "api/index.go",
    "content": "package handler\r\n \r\nimport (\r\n  \"Golang/liveurls\"\r\n  \"Golang/list\"\r\n  \"Golang/utils\"\r\n  \"fmt\"\r\n  \"net/http\"\r\n  \"strings\"\r\n  \"encoding/json\"\r\n  \"strconv\"\r\n  \"log\"\r\n  \"os\"\r\n)\r\n\r\n// vercel 平台会将请求传递给该函数，这个函数名随意，但函数参数必须按照该规则。\r\nfunc Handler(w http.ResponseWriter, r *http.Request) {\r\n  // 是否禁用TV\r\n  enableTV := os.Getenv(\"TV\") != \"false\" \r\n  path := r.URL.Path\r\n  ts := utils.DefaultQuery(r, \"ts\", \"\")\r\n\tswitch path {\r\n    // 电视直播\r\n    case \"/tv.m3u\":\r\n      if enableTV {\r\n        itvm3uobj := &list.Tvm3u{}\r\n        w.Header().Set(\"Content-Type\", \"application/octet-stream\")\r\n        w.Header().Set(\"Content-Disposition\", \"attachment; filename=tv.m3u\")\r\n        itvm3uobj.GetTvM3u(w, r.Host)\r\n      } else {\r\n        http.Error(w, \"公共服务不提供TV直播\", http.StatusForbidden)\r\n      }\r\n    // 虎牙一起看\r\n    case \"/huyayqk.m3u\":\r\n      yaobj := &list.HuyaYqk{}\r\n      res, _ := yaobj.HuYaYqk(\"https://live.cdn.huya.com/liveHttpUI/getLiveList?iGid=2135\")\r\n      var result list.YaResponse\r\n      json.Unmarshal(res, &result)\r\n      pageCount := result.ITotalPage\r\n      pageSize := result.IPageSize\r\n      w.Header().Set(\"Content-Type\", \"application/octet-stream\")\r\n      w.Header().Set(\"Content-Disposition\", \"attachment; filename=huyayqk.m3u\")\r\n      utils.GetTestVideoUrl(w)\r\n\r\n      for i := 1; i <= pageCount; i++ {\r\n        apiRes, _ := yaobj.HuYaYqk(fmt.Sprintf(\"https://live.cdn.huya.com/liveHttpUI/getLiveList?iGid=2135&iPageNo=%d&iPageSize=%d\", i, pageSize))\r\n        var res list.YaResponse\r\n        json.Unmarshal(apiRes, &res)\r\n        data := res.VList\r\n        for _, value := range data {\r\n          fmt.Fprintf(w, \"#EXTINF:-1 tvg-logo=\\\"%s\\\" group-title=\\\"%s\\\", %s\\n\", value.SAvatar180, value.SGameFullName, value.SNick)\r\n          fmt.Fprintf(w, \"%s/huya/%v\\n\", utils.GetLivePrefix(r), value.LProfileRoom)\r\n        }\r\n      }\r\n    // 斗鱼一起看\r\n\t  case \"/douyuyqk.m3u\":\r\n      yuobj := &list.DouYuYqk{}\r\n      resAPI, _ := yuobj.Douyuyqk(\"https://www.douyu.com/gapi/rkc/directory/mixList/2_208/list\")\r\n\r\n      var result list.DouYuResponse\r\n      json.Unmarshal(resAPI, &result)\r\n      pageCount := result.Data.Pgcnt\r\n\r\n      w.Header().Set(\"Content-Type\", \"application/octet-stream\")\r\n      w.Header().Set(\"Content-Disposition\", \"attachment; filename=douyuyqk.m3u\")\r\n      utils.GetTestVideoUrl(w)\r\n\r\n      for i := 1; i <= pageCount; i++ {\r\n        apiRes, _ := yuobj.Douyuyqk(\"https://www.douyu.com/gapi/rkc/directory/mixList/2_208/\" + strconv.Itoa(i))\r\n\r\n        var res list.DouYuResponse\r\n        json.Unmarshal(apiRes, &res)\r\n        data := res.Data.Rl\r\n\r\n        for _, value := range data {\r\n          fmt.Fprintf(w, \"#EXTINF:-1 tvg-logo=\\\"https://apic.douyucdn.cn/upload/%s_big.jpg\\\" group-title=\\\"%s\\\", %s\\n\", value.Av, value.C2name, value.Nn)\r\n          fmt.Fprintf(w, \"%s/douyu/%v\\n\", utils.GetLivePrefix(r), value.Rid)\r\n        }\r\n      }\r\n    // YY轮播\r\n\t  case \"/yylunbo.m3u\":\r\n      yylistobj := &list.Yylist{}\r\n      w.Header().Set(\"Content-Type\", \"application/octet-stream\")\r\n      w.Header().Set(\"Content-Disposition\", \"attachment; filename=yylunbo.m3u\")\r\n      utils.GetTestVideoUrl(w)\r\n\r\n      i := 1\r\n      for {\r\n        apiRes := yylistobj.Yylb(fmt.Sprintf(\"http://rubiks-ipad.yy.com/nav/other/idx/213?channel=appstore&ispType=0&model=iPad8,6&netType=2&os=iOS&osVersion=17.2&page=%d&uid=0&yyVersion=6.17.0\", i))\r\n        var res list.ApiResponse\r\n        json.Unmarshal([]byte(apiRes), &res)\r\n        for _, value := range res.Data.Data {\r\n          fmt.Fprintf(w, \"#EXTINF:-1 tvg-logo=\\\"%s\\\" group-title=\\\"%s\\\", %s\\n\", value.Avatar, value.Biz, value.Desc)\r\n          fmt.Fprintf(w, \"%s/yy/%v\\n\", utils.GetLivePrefix(r), value.Sid)\r\n        }\r\n        if res.Data.IsLastPage == 1 {\r\n          break\r\n        }\r\n        i++\r\n      }\r\n    // 其他链接\r\n\t  default:\r\n      adurl := \"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/sdr1080pvideo/index.m3u8\"\r\n      params := strings.Split(path, \"/\")\r\n\r\n      // log.Println(\"request url: \", path)\r\n\r\n      if len(params) >= 3 {\r\n        // 解析成功\r\n        // 平台\r\n        platform := params[1]\r\n        // 房间号\r\n        rid := params[2]\r\n        // fmt.Fprintf(w, \"parsed platform=%s, room=%s\", platform, rid)\r\n        switch platform {\r\n          case \"itv\":\r\n            if enableTV {\r\n              itvobj := &liveurls.Itv{}\r\n              cdn := utils.DefaultQuery(r, \"cdn\", \"\")\r\n              if ts == \"\" {\r\n                itvobj.HandleMainRequest(w, r, cdn, rid)\r\n              } else {\r\n                itvobj.HandleTsRequest(w, ts)\r\n              }\r\n            } else {\r\n              http.Error(w, \"公共服务不提供TV直播\", http.StatusForbidden)\r\n            }\r\n          case \"ysptp\":\r\n            if enableTV {\r\n              ysptpobj := &liveurls.Ysptp{}\r\n              if ts == \"\" {\r\n                ysptpobj.HandleMainRequest(w, r, rid)\r\n              } else {\r\n                ysptpobj.HandleTsRequest(w, ts, utils.DefaultQuery(r, \"wsTime\", \"\"))\r\n              }\r\n            } else {\r\n              http.Error(w, \"公共服务不提供TV直播\", http.StatusForbidden)\r\n            }\r\n          case \"douyin\":\r\n            // 抖音\r\n            douyinobj := &liveurls.Douyin{}\r\n            douyinobj.Rid = rid\r\n            douyinobj.Stream = utils.DefaultQuery(r, \"stream\", \"flv\")\r\n            http.Redirect(w, r, utils.Duanyan(adurl, douyinobj.GetDouYinUrl()), http.StatusMovedPermanently)\r\n          case \"douyu\":\r\n            // 斗鱼\r\n            douyuobj := &liveurls.Douyu{}\r\n            douyuobj.Rid = rid\r\n            douyuobj.Stream_type = utils.DefaultQuery(r, \"stream\", \"flv\")\r\n            http.Redirect(w, r, utils.Duanyan(adurl, douyuobj.GetRealUrl()), http.StatusMovedPermanently)\r\n          case \"huya\":\r\n            // 虎牙\r\n            huyaobj := &liveurls.Huya{}\r\n            huyaobj.Rid = rid\r\n            huyaobj.Cdn = utils.DefaultQuery(r, \"cdn\", \"hwcdn\")\r\n            huyaobj.Media = utils.DefaultQuery(r, \"media\", \"flv\")\r\n            huyaobj.Type = utils.DefaultQuery(r, \"cdntype\", \"nodisplay\")\r\n            if huyaobj.Type == \"display\" {\r\n              fmt.Fprintf(w, huyaobj.GetLiveUrl().(string))\r\n            } else {\r\n              http.Redirect(w, r, utils.Duanyan(adurl, huyaobj.GetLiveUrl()), http.StatusMovedPermanently)\r\n            }\r\n          case \"bilibili\":\r\n            // B站\r\n            biliobj := &liveurls.BiliBili{}\r\n            biliobj.Rid = rid\r\n            biliobj.Platform = utils.DefaultQuery(r, \"platform\", \"web\")\r\n            biliobj.Quality = utils.DefaultQuery(r, \"quality\", \"10000\")\r\n            biliobj.Line = utils.DefaultQuery(r, \"line\", \"first\")\r\n            http.Redirect(w, r, utils.Duanyan(adurl, biliobj.GetPlayUrl()), http.StatusMovedPermanently)\r\n          case \"youtube\":\r\n            // 油管\r\n            ytbObj := &liveurls.Youtube{}\r\n            ytbObj.Rid = rid\r\n            ytbObj.Quality = utils.DefaultQuery(r, \"quality\", \"1080\")\r\n            http.Redirect(w, r, utils.Duanyan(adurl, ytbObj.GetLiveUrl()), http.StatusMovedPermanently)\r\n          case \"yy\":\r\n            // YY直播\r\n            yyObj := &liveurls.Yy{}\r\n            yyObj.Rid = rid\r\n            yyObj.Quality = utils.DefaultQuery(r, \"quality\", \"4\")\r\n            http.Redirect(w, r, utils.Duanyan(adurl, yyObj.GetLiveUrl()), http.StatusMovedPermanently)\r\n          default:\r\n            fmt.Fprintf(w, \"Unknown platform=%s, room=%s\", platform, rid)\r\n        }\r\n      } else {\r\n        log.Println(\"Invalid path:\", path)\r\n        w.Header().Set(\"Content-Type\", \"text/html; charset=utf-8\")\r\n        // http.Error(w, \"链接错误!\", http.StatusInternalServerError)\r\n        fmt.Fprintf(w, \"<h1>参数错误!</h1></br><p><a href='https://github.com/youshandefeiyang/LiveRedirect/blob/main/Golang/README.md'>使用教程</a></p>\")\r\n      }\r\n\t\t  // log.Println(\"Invalid path:\", path)\r\n\t\t  // fmt.Fprintf(w, \"<h1>链接错误!</h1>\")\r\n\t}\r\n  return\r\n}"
  },
  {
    "path": "api/live.go",
    "content": "package handler\n\nimport (\n  \"Golang/liveurls\"\n  \"Golang/utils\"\n  \"fmt\"\n  \"net/http\"\n  \"strings\"\n  \"log\"\n  \"os\"\n)\n\n// vercel 平台会将请求传递给该函数，这个函数名随意，但函数参数必须按照该规则。\nfunc Handler(w http.ResponseWriter, r *http.Request)  {\n  adurl := \"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/sdr1080pvideo/index.m3u8\"\n  path := r.URL.Path\n  params := strings.Split(path, \"/\")\n\n  // 是否禁用TV\n  enableTV := os.Getenv(\"TV\") != \"false\" \n\n  // fmt.Fprintf(w, \"request url: %s\", path)\n\n  if len(params) >= 4 {\n    // 解析成功\n    // 平台\n    platform := params[2]\n    // 房间号\n    rid := params[3]\n    ts := utils.DefaultQuery(r, \"ts\", \"\")\n    // fmt.Fprintf(w, \"parsed platform=%s, room=%s\", platform, rid)\n    switch platform {\n      case \"itv\":\n        if enableTV {\n          itvobj := &liveurls.Itv{}\n          cdn := utils.DefaultQuery(r, \"cdn\", \"\")\n          if ts == \"\" {\n            itvobj.HandleMainRequest(w, r, cdn, rid)\n          } else {\n            itvobj.HandleTsRequest(w, ts)\n          }\n        } else {\n          http.Error(w, \"公共服务不提供TV直播\", http.StatusForbidden)\n        }\n      case \"ysptp\":\n        if enableTV {\n          ysptpobj := &liveurls.Ysptp{}\n          if ts == \"\" {\n            ysptpobj.HandleMainRequest(w, r, rid)\n          } else {\n            ysptpobj.HandleTsRequest(w, ts, utils.DefaultQuery(r, \"wsTime\", \"\"))\n          }\n        } else {\n          http.Error(w, \"公共服务不提供TV直播\", http.StatusForbidden)\n        }\n      case \"douyin\":\n        // 抖音\n        douyinobj := &liveurls.Douyin{}\n        douyinobj.Rid = rid\n        douyinobj.Stream = utils.DefaultQuery(r, \"stream\", \"flv\")\n        http.Redirect(w, r, utils.Duanyan(adurl, douyinobj.GetDouYinUrl()), http.StatusMovedPermanently)\n      case \"douyu\":\n        // 斗鱼\n        douyuobj := &liveurls.Douyu{}\n        douyuobj.Rid = rid\n        douyuobj.Stream_type = utils.DefaultQuery(r, \"stream\", \"flv\")\n        http.Redirect(w, r, utils.Duanyan(adurl, douyuobj.GetRealUrl()), http.StatusMovedPermanently)\n      case \"huya\":\n        // 虎牙\n        huyaobj := &liveurls.Huya{}\n        huyaobj.Rid = rid\n        huyaobj.Cdn = utils.DefaultQuery(r, \"cdn\", \"hwcdn\")\n        huyaobj.Media = utils.DefaultQuery(r, \"media\", \"flv\")\n        huyaobj.Type = utils.DefaultQuery(r, \"cdntype\", \"nodisplay\")\n        if huyaobj.Type == \"display\" {\n          fmt.Fprintf(w, huyaobj.GetLiveUrl().(string))\n        } else {\n          http.Redirect(w, r, utils.Duanyan(adurl, huyaobj.GetLiveUrl()), http.StatusMovedPermanently)\n        }\n      case \"bilibili\":\n        // B站\n        biliobj := &liveurls.BiliBili{}\n        biliobj.Rid = rid\n        biliobj.Platform = utils.DefaultQuery(r, \"platform\", \"web\")\n        biliobj.Quality = utils.DefaultQuery(r, \"quality\", \"10000\")\n        biliobj.Line = utils.DefaultQuery(r, \"line\", \"first\")\n        http.Redirect(w, r, utils.Duanyan(adurl, biliobj.GetPlayUrl()), http.StatusMovedPermanently)\n      case \"youtube\":\n        // 油管\n        ytbObj := &liveurls.Youtube{}\n        ytbObj.Rid = rid\n        ytbObj.Quality = utils.DefaultQuery(r, \"quality\", \"1080\")\n        http.Redirect(w, r, utils.Duanyan(adurl, ytbObj.GetLiveUrl()), http.StatusMovedPermanently)\n      case \"yy\":\n        // YY直播\n        yyObj := &liveurls.Yy{}\n        yyObj.Rid = rid\n        yyObj.Quality = utils.DefaultQuery(r, \"quality\", \"4\")\n        http.Redirect(w, r, utils.Duanyan(adurl, yyObj.GetLiveUrl()), http.StatusMovedPermanently)\n      default:\n        fmt.Fprintf(w, \"Unknown platform=%s, room=%s\", platform, rid)\n    }\n  } else {\n    log.Println(\"Invalid path:\", path)\n    http.Error(w, \"Internal Server Error\", http.StatusInternalServerError)\n  }\n}\n"
  },
  {
    "path": "api/yqk/yqk.go",
    "content": "package yqk\r\n\r\nimport (\r\n  \"Golang/list\"\r\n  \"Golang/utils\"\r\n  \"fmt\"\r\n  \"encoding/json\"\r\n  \"net/http\"\r\n  \"strconv\"\r\n  \"log\"\r\n)\r\n\r\n// vercel 平台会将请求传递给该函数，这个函数名随意，但函数参数必须按照该规则。\r\n// go语言大写就是公开，所以首字母必须大写\r\nfunc Handler(w http.ResponseWriter, r *http.Request)  {\r\n\tpath := r.URL.Path\r\n\tswitch path {\r\n\t  case \"/yqk/huyayqk.m3u\":\r\n\t\tyaobj := &list.HuyaYqk{}\r\n\t\tres, _ := yaobj.HuYaYqk(\"https://live.cdn.huya.com/liveHttpUI/getLiveList?iGid=2135\")\r\n\t\tvar result list.YaResponse\r\n\t\tjson.Unmarshal(res, &result)\r\n\t\tpageCount := result.ITotalPage\r\n\t\tpageSize := result.IPageSize\r\n\t\tw.Header().Set(\"Content-Type\", \"application/octet-stream\")\r\n\t\tw.Header().Set(\"Content-Disposition\", \"attachment; filename=huyayqk.m3u\")\r\n\t\tutils.GetTestVideoUrl(w)\r\n\r\n\t\tfor i := 1; i <= pageCount; i++ {\r\n\t\t\tapiRes, _ := yaobj.HuYaYqk(fmt.Sprintf(\"https://live.cdn.huya.com/liveHttpUI/getLiveList?iGid=2135&iPageNo=%d&iPageSize=%d\", i, pageSize))\r\n\t\t\tvar res list.YaResponse\r\n\t\t\tjson.Unmarshal(apiRes, &res)\r\n\t\t\tdata := res.VList\r\n\t\t\tfor _, value := range data {\r\n\t\t\t\tfmt.Fprintf(w, \"#EXTINF:-1 tvg-logo=\\\"%s\\\" group-title=\\\"%s\\\", %s\\n\", value.SAvatar180, value.SGameFullName, value.SNick)\r\n\t\t\t\tfmt.Fprintf(w, \"%s/huya/%v\\n\", utils.GetLivePrefix(r), value.LProfileRoom)\r\n\t\t\t}\r\n\t\t}\r\n\t  case \"/yqk/douyuyqk.m3u\":\r\n\t\tyuobj := &list.DouYuYqk{}\r\n\t\tresAPI, _ := yuobj.Douyuyqk(\"https://www.douyu.com/gapi/rkc/directory/mixList/2_208/list\")\r\n\r\n\t\tvar result list.DouYuResponse\r\n\t\tjson.Unmarshal(resAPI, &result)\r\n\t\tpageCount := result.Data.Pgcnt\r\n\r\n\t\tw.Header().Set(\"Content-Type\", \"application/octet-stream\")\r\n\t\tw.Header().Set(\"Content-Disposition\", \"attachment; filename=douyuyqk.m3u\")\r\n\t\tutils.GetTestVideoUrl(w)\r\n\r\n\t\tfor i := 1; i <= pageCount; i++ {\r\n\t\t\tapiRes, _ := yuobj.Douyuyqk(\"https://www.douyu.com/gapi/rkc/directory/mixList/2_208/\" + strconv.Itoa(i))\r\n\r\n\t\t\tvar res list.DouYuResponse\r\n\t\t\tjson.Unmarshal(apiRes, &res)\r\n\t\t\tdata := res.Data.Rl\r\n\r\n\t\t\tfor _, value := range data {\r\n\t\t\t\tfmt.Fprintf(w, \"#EXTINF:-1 tvg-logo=\\\"https://apic.douyucdn.cn/upload/%s_big.jpg\\\" group-title=\\\"%s\\\", %s\\n\", value.Av, value.C2name, value.Nn)\r\n\t\t\t\tfmt.Fprintf(w, \"%s/douyu/%v\\n\", utils.GetLivePrefix(r), value.Rid)\r\n\t\t\t}\r\n\t\t}\r\n\t  case \"/yqk/yylunbo.m3u\":\r\n\t\tyylistobj := &list.Yylist{}\r\n\t\tw.Header().Set(\"Content-Type\", \"application/octet-stream\")\r\n\t\tw.Header().Set(\"Content-Disposition\", \"attachment; filename=yylunbo.m3u\")\r\n\t\tutils.GetTestVideoUrl(w)\r\n\r\n\t\ti := 1\r\n\t\tfor {\r\n\t\t\tapiRes := yylistobj.Yylb(fmt.Sprintf(\"http://rubiks-ipad.yy.com/nav/other/idx/213?channel=appstore&ispType=0&model=iPad8,6&netType=2&os=iOS&osVersion=17.2&page=%d&uid=0&yyVersion=6.17.0\", i))\r\n\t\t\tvar res list.ApiResponse\r\n\t\t\tjson.Unmarshal([]byte(apiRes), &res)\r\n\t\t\tfor _, value := range res.Data.Data {\r\n\t\t\t\tfmt.Fprintf(w, \"#EXTINF:-1 tvg-logo=\\\"%s\\\" group-title=\\\"%s\\\", %s\\n\", value.Avatar, value.Biz, value.Desc)\r\n\t\t\t\tfmt.Fprintf(w, \"%s/yy/%v\\n\", utils.GetLivePrefix(r), value.Sid)\r\n\t\t\t}\r\n\t\t\tif res.Data.IsLastPage == 1 {\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t\ti++\r\n\t\t}\r\n\t  default:\r\n\t\tlog.Println(\"Invalid path:\", path)\r\n\t\tfmt.Fprintf(w, \"<h1>链接错误!</h1>\")\r\n\t}\r\n}"
  },
  {
    "path": "go.mod",
    "content": "module Golang\r\n\r\ngo 1.19\r\n\r\nrequire (\r\n\tgithub.com/dop251/goja v0.0.0-20230203172422-5460598cfa32\r\n\tgithub.com/etherlabsio/go-m3u8 v1.0.0\r\n\tgithub.com/forgoer/openssl v1.5.0\r\n\tgithub.com/gin-gonic/gin v1.8.2\r\n\tgithub.com/hr3lxphr6j/bililive-go v0.7.23\r\n\tgithub.com/hr3lxphr6j/requests v0.0.2\r\n\tgithub.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b\r\n\tgithub.com/tidwall/gjson v1.14.4\r\n)\r\n"
  },
  {
    "path": "list/douyuyqk.go",
    "content": "// Package list\r\n// @Time:2023/06/02 10:00\r\n// @File:mian.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage list\r\n\r\nimport (\r\n\t\"io\"\r\n\t\"net/http\"\r\n)\r\n\r\ntype DouYuYqk struct {\r\n}\r\n\r\ntype DouYuResponse struct {\r\n\tData struct {\r\n\t\tPgcnt int `json:\"pgcnt\"`\r\n\t\tRl    []struct {\r\n\t\t\tAv     string `json:\"av\"`\r\n\t\t\tC2name string `json:\"c2name\"`\r\n\t\t\tNn     string `json:\"nn\"`\r\n\t\t\tRid    int    `json:\"rid\"`\r\n\t\t} `json:\"rl\"`\r\n\t} `json:\"data\"`\r\n}\r\n\r\nfunc (dy *DouYuYqk) Douyuyqk(requestURL string) ([]byte, error) {\r\n\tclient := &http.Client{}\r\n\r\n\treq, err := http.NewRequest(\"GET\", requestURL, nil)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\r\n\treq.Header.Set(\"upgrade-insecure-requests\", \"1\")\r\n\treq.Header.Set(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36\")\r\n\r\n\tresp, err := client.Do(req)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\tdefer resp.Body.Close()\r\n\r\n\treturn io.ReadAll(resp.Body)\r\n}"
  },
  {
    "path": "list/huyayqk.go",
    "content": "// Package list\r\n// @Time:2023/06/02 10:00\r\n// @File:mian.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage list\r\n\r\nimport (\r\n\t\"io\"\r\n\t\"net/http\"\r\n)\r\n\r\ntype HuyaYqk struct {\r\n}\r\n\r\ntype YaResponse struct {\r\n\tITotalPage int `json:\"iTotalPage\"`\r\n\tIPageSize  int `json:\"iPageSize\"`\r\n\tVList      []struct {\r\n\t\tSAvatar180    string `json:\"sAvatar180\"`\r\n\t\tSGameFullName string `json:\"sGameFullName\"`\r\n\t\tSNick         string `json:\"sNick\"`\r\n\t\tLProfileRoom  int    `json:\"lProfileRoom\"`\r\n\t} `json:\"vList\"`\r\n}\r\n\r\nfunc (hy *HuyaYqk) HuYaYqk(requestURL string) ([]byte, error) {\r\n\tclient := &http.Client{}\r\n\treq, err := http.NewRequest(\"GET\", requestURL, nil)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\treq.Header.Set(\"upgrade-insecure-requests\", \"1\")\r\n\treq.Header.Set(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36\")\r\n\tresp, err := client.Do(req)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\tdefer resp.Body.Close()\r\n\treturn io.ReadAll(resp.Body)\r\n}"
  },
  {
    "path": "list/tvm3u.go",
    "content": "package list\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"net/http\"\r\n)\r\n\r\ntype Tvm3u struct {\r\n}\r\n\r\nfunc (t *Tvm3u) GetTvM3u(w http.ResponseWriter, hostname string) {\r\n\tfmt.Fprintln(w, \"#EXTM3U x-tvg-url=\\\"https://epg.v1.mk/fy.xml\\\"\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1 tvg-name=\\\"4K60PSDR-H264-AAC测试\\\" tvg-logo=\\\"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/tg.jpg\\\" group-title=\\\"4K频道\\\",4K60PSDR-H264-AAC测试\")\r\n\tfmt.Fprintln(w, \"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/sdr4kvideo/index.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1 tvg-name=\\\"4K60PHLG-HEVC-EAC3测试\\\" tvg-logo=\\\"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/tg.jpg\\\" group-title=\\\"4K频道\\\",4K60PHLG-HEVC-EAC3测试\")\r\n\tfmt.Fprintln(w, \"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/hlg4kvideo/index.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV1\\\" tvg-name=\\\"CCTV1\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV1.png\\\" group-title=\\\"央视\\\",cctv1-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv1.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV1\\\" tvg-name=\\\"CCTV1\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV1.png\\\" group-title=\\\"央视\\\",CCTV-1\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000029752.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv1\\\" tvg-name=\\\"cctv1\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv1.png\\\" group-title=\\\"央视\\\",CCTV-1-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000002226.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV1\\\" tvg-name=\\\"CCTV1\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV1.png\\\" group-title=\\\"央视\\\",CCTV-1-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265001.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv2\\\" tvg-name=\\\"cctv2\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv2.png\\\" group-title=\\\"央视\\\",cctv2-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv2.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv2\\\" tvg-name=\\\"cctv2\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv2.png\\\" group-title=\\\"央视\\\",CCTV-2\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000023315.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV2\\\" tvg-name=\\\"CCTV2\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV2.png\\\" group-title=\\\"央视\\\",CCTV-2-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000014161.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv2\\\" tvg-name=\\\"cctv2\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv2.png\\\" group-title=\\\"央视\\\",CCTV-2-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000023315.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv3\\\" tvg-name=\\\"cctv3\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv3.png\\\" group-title=\\\"央视\\\",cctv3-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv3.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv3\\\" tvg-name=\\\"cctv3\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv3.png\\\" group-title=\\\"央视\\\",CCTV-3\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000022313.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv3\\\" tvg-name=\\\"cctv3\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv3.png\\\" group-title=\\\"央视\\\",CCTV-3-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265003.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv4\\\" tvg-name=\\\"cctv4\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv4.png\\\" group-title=\\\"央视\\\",cctv4-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv4.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV4\\\" tvg-name=\\\"CCTV4\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV4.png\\\" group-title=\\\"央视\\\",CCTV-4-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031102.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv4\\\" tvg-name=\\\"cctv4\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv4.png\\\" group-title=\\\"央视\\\",CCTV-4-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265004.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv5\\\" tvg-name=\\\"cctv5\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv5.png\\\" group-title=\\\"央视\\\",cctv5-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv5.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv5\\\" tvg-name=\\\"cctv5\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv5.png\\\" group-title=\\\"央视\\\",CCTV-5\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000025222.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv5\\\" tvg-name=\\\"cctv5\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv5.png\\\" group-title=\\\"央视\\\",CCTV-5-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265005.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv5+\\\" tvg-name=\\\"cctv5+\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv5+.png\\\" group-title=\\\"央视\\\",cctv5p-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv5p.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv5+\\\" tvg-name=\\\"cctv5+\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv5+.png\\\" group-title=\\\"央视\\\",CCTV-5+\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000015875.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv5+\\\" tvg-name=\\\"cctv5+\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv5+.png\\\" group-title=\\\"央视\\\",CCTV-5+-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265016.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv6\\\" tvg-name=\\\"cctv6\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv6.png\\\" group-title=\\\"央视\\\",cctv6-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv6.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv6\\\" tvg-name=\\\"cctv6\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv6.png\\\" group-title=\\\"央视\\\",CCTV-6\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000001737.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV6\\\" tvg-name=\\\"CCTV6\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV6.png\\\" group-title=\\\"央视\\\",CCTV-6-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000004574.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv6\\\" tvg-name=\\\"cctv6\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv6.png\\\" group-title=\\\"央视\\\",CCTV-6-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265006.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV7\\\" tvg-name=\\\"CCTV7\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV7.png\\\" group-title=\\\"央视\\\",cctv7-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv7.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV7\\\" tvg-name=\\\"CCTV7\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV7.png\\\" group-title=\\\"央视\\\",CCTV-7\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000024341.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV7\\\" tvg-name=\\\"CCTV7\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV7.png\\\" group-title=\\\"央视\\\",CCTV-7-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000009055.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV7\\\" tvg-name=\\\"CCTV7\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV7.png\\\" group-title=\\\"央视\\\",CCTV-7-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265007.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv8\\\" tvg-name=\\\"cctv8\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv8.png\\\" group-title=\\\"央视\\\",cctv8-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv8.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv8\\\" tvg-name=\\\"cctv8\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv8.png\\\" group-title=\\\"央视\\\",CCTV-8\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000001070.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv8\\\" tvg-name=\\\"cctv8\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv8.png\\\" group-title=\\\"央视\\\",CCTV-8-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265008.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv9\\\" tvg-name=\\\"cctv9\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv9.png\\\" group-title=\\\"央视\\\",cctv9-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv9.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv9\\\" tvg-name=\\\"cctv9\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv9.png\\\" group-title=\\\"央视\\\",CCTV-9\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000014583.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CCTV9\\\" tvg-name=\\\"CCTV9\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CCTV9.png\\\" group-title=\\\"央视\\\",CCTV-9-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000032162.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv9\\\" tvg-name=\\\"cctv9\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv9.png\\\" group-title=\\\"央视\\\",CCTV-9-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265009.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv10\\\" tvg-name=\\\"cctv10\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv10.png\\\" group-title=\\\"央视\\\",cctv10-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv10.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv10\\\" tvg-name=\\\"cctv10\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv10.png\\\" group-title=\\\"央视\\\",CCTV-10\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000023734.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv10\\\" tvg-name=\\\"cctv10\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv10.png\\\" group-title=\\\"央视\\\",CCTV-10-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000012827.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv10\\\" tvg-name=\\\"cctv10\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv10.png\\\" group-title=\\\"央视\\\",CCTV-10-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265010.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv11\\\" tvg-name=\\\"cctv11\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv11.png\\\" group-title=\\\"央视\\\",cctv11-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv11.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv11\\\" tvg-name=\\\"cctv11\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv11.png\\\" group-title=\\\"央视\\\",CCTV-11-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031106.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv11\\\" tvg-name=\\\"cctv11\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv11.png\\\" group-title=\\\"央视\\\",CCTV-11-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265011.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv12\\\" tvg-name=\\\"cctv12\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv12.png\\\" group-title=\\\"央视\\\",cctv12-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv12.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv12\\\" tvg-name=\\\"cctv12\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv12.png\\\" group-title=\\\"央视\\\",CCTV-12\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000032494.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv12\\\" tvg-name=\\\"cctv12\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv12.png\\\" group-title=\\\"央视\\\",CCTV-12-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000022586.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv12\\\" tvg-name=\\\"cctv12\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv12.png\\\" group-title=\\\"央视\\\",CCTV-12-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265012.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv13\\\" tvg-name=\\\"cctv13\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv13.png\\\" group-title=\\\"央视\\\",cctv13-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv13.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv13\\\" tvg-name=\\\"cctv13\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv13.png\\\" group-title=\\\"央视\\\",CCTV-13-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031108.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv14\\\" tvg-name=\\\"cctv14\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv14.png\\\" group-title=\\\"央视\\\",cctv14-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv14.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv14\\\" tvg-name=\\\"cctv14\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv14.png\\\" group-title=\\\"央视\\\",CCTV-14\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000008170.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv14\\\" tvg-name=\\\"cctv14\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv14.png\\\" group-title=\\\"央视\\\",CCTV-14-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000006673.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv14\\\" tvg-name=\\\"cctv14\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv14.png\\\" group-title=\\\"央视\\\",CCTV-14-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265013.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv15\\\" tvg-name=\\\"cctv15\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv15.png\\\" group-title=\\\"央视\\\",cctv15-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv15.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv15\\\" tvg-name=\\\"cctv15\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv15.png\\\" group-title=\\\"央视\\\",CCTV-15-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031109.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv15\\\" tvg-name=\\\"cctv15\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv15.png\\\" group-title=\\\"央视\\\",CCTV-15-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265014.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv16\\\" tvg-name=\\\"cctv16\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv16.png\\\" group-title=\\\"央视\\\",cctv16-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv16.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv16\\\" tvg-name=\\\"cctv16\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv16.png\\\" group-title=\\\"央视\\\",CCTV-16\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000006000233002.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv16\\\" tvg-name=\\\"cctv16\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv16.png\\\" group-title=\\\"4K频道\\\",CCTV-16-4K-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000008000023254.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv16\\\" tvg-name=\\\"cctv16\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv16.png\\\" group-title=\\\"4K频道\\\",cctv164k_10m\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv4k16_10m.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv16\\\" tvg-name=\\\"cctv16\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv16.png\\\" group-title=\\\"4K频道\\\",cctv164k\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv4k16.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv17\\\" tvg-name=\\\"cctv17\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv17.png\\\" group-title=\\\"央视\\\",cctv17-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv17.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv17\\\" tvg-name=\\\"cctv17\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv17.png\\\" group-title=\\\"央视\\\",CCTV-17\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000006000268004.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv17\\\" tvg-name=\\\"cctv17\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv17.png\\\" group-title=\\\"央视\\\",CCTV-17-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265015.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cgtn\\\" tvg-name=\\\"cgtn\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cgtn.png\\\" group-title=\\\"央视\\\",CGTN\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/7745129417417101820.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CGTN记录\\\" tvg-name=\\\"CGTN记录\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CGTN记录.png\\\" group-title=\\\"央视\\\",CGTN-记录\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/7114647837765104058.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CGTNALBY\\\" tvg-name=\\\"CGTNALBY\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CGTNALBY.png\\\" group-title=\\\"央视\\\",cgtnar-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cgtnar.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cgtndocumentary\\\" tvg-name=\\\"cgtndocumentary\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cgtndocumentary.png\\\" group-title=\\\"央视\\\",cgtndoc-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cgtndoc.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CGTNEY\\\" tvg-name=\\\"CGTNEY\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CGTNEY.png\\\" group-title=\\\"央视\\\",cgtnen-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cgtnen.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cgtnfrench\\\" tvg-name=\\\"cgtnfrench\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cgtnfrench.png\\\" group-title=\\\"央视\\\",cgtnfr-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cgtnfr.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CGTN1\\\" tvg-name=\\\"CGTN1\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CGTN1.png\\\" group-title=\\\"央视\\\",cgtnru-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cgtnru.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"CGTN1\\\" tvg-name=\\\"CGTN1\\\" tvg-logo=\\\"https://epg.v1.mk/logo/CGTN1.png\\\" group-title=\\\"央视\\\",cgtnsp-高码\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cgtnsp.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv4k\\\" tvg-name=\\\"cctv4k\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv4k.png\\\" group-title=\\\"4K频道\\\",cctv4k_10m\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv4k_10m.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv4k\\\" tvg-name=\\\"cctv4k\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv4k.png\\\" group-title=\\\"4K频道\\\",cctv4k\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv4k.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv8k\\\" tvg-name=\\\"cctv8k\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv8k.png\\\" group-title=\\\"8K频道\\\",cctv8k_36m\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv8k_36m.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"cctv8k\\\" tvg-name=\\\"cctv8k\\\" tvg-logo=\\\"https://epg.v1.mk/logo/cctv8k.png\\\" group-title=\\\"8K频道\\\",cctv8k_120m\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/ysptp/cctv8k_120m.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"中国教育1台\\\" tvg-name=\\\"中国教育1台\\\" tvg-logo=\\\"https://epg.v1.mk/logo/中国教育1台.png\\\" group-title=\\\"其他\\\",中国教育电视台-1\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000002000002652.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"中国教育1台\\\" tvg-name=\\\"中国教育1台\\\" tvg-logo=\\\"https://epg.v1.mk/logo/中国教育1台.png\\\" group-title=\\\"其他\\\",中国教育电视台-4\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031126.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"北京卫视\\\" tvg-name=\\\"北京卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/北京卫视.png\\\" group-title=\\\"北京\\\",北京卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000020451.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"北京卫视\\\" tvg-name=\\\"北京卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/北京卫视.png\\\" group-title=\\\"北京\\\",北京卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265027.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"北京纪实科教\\\" tvg-name=\\\"北京纪实科教\\\" tvg-logo=\\\"https://epg.v1.mk/logo/北京纪实科教.png\\\" group-title=\\\"北京\\\",北京纪实科教\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000001910.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"北京纪实科教\\\" tvg-name=\\\"北京纪实科教\\\" tvg-logo=\\\"https://epg.v1.mk/logo/北京纪实科教.png\\\" group-title=\\\"北京\\\",北京纪实科教-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265020.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"北京卡酷少儿\\\" tvg-name=\\\"北京卡酷少儿\\\" tvg-logo=\\\"https://epg.v1.mk/logo/北京卡酷少儿.png\\\" group-title=\\\"北京\\\",北京卡酷少儿\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/7851974109718180595.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"安徽卫视\\\" tvg-name=\\\"安徽卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/安徽卫视.png\\\" group-title=\\\"安徽\\\",安徽卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000030159.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"安徽卫视\\\" tvg-name=\\\"安徽卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/安徽卫视.png\\\" group-title=\\\"安徽\\\",安徽卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000009954.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"安徽卫视\\\" tvg-name=\\\"安徽卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/安徽卫视.png\\\" group-title=\\\"安徽\\\",安徽卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265025.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"东南卫视\\\" tvg-name=\\\"东南卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/东南卫视.png\\\" group-title=\\\"卫视\\\",东南卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000010584.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"东南卫视\\\" tvg-name=\\\"东南卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/东南卫视.png\\\" group-title=\\\"卫视\\\",东南卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265033.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"甘肃卫视\\\" tvg-name=\\\"甘肃卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/甘肃卫视.png\\\" group-title=\\\"甘肃\\\",甘肃卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031121.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"广东卫视\\\" tvg-name=\\\"广东卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/广东卫视.png\\\" group-title=\\\"广东\\\",广东卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000014176.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"广东卫视\\\" tvg-name=\\\"广东卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/广东卫视.png\\\" group-title=\\\"广东\\\",广东卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000031076.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"广东卫视\\\" tvg-name=\\\"广东卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/广东卫视.png\\\" group-title=\\\"广东\\\",广东卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265034.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"广西卫视\\\" tvg-name=\\\"广西卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/广西卫视.png\\\" group-title=\\\"卫视\\\",广西卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031118.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"贵州卫视\\\" tvg-name=\\\"贵州卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/贵州卫视.png\\\" group-title=\\\"贵州\\\",贵州卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000025843.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"海南卫视\\\" tvg-name=\\\"海南卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/海南卫视.png\\\" group-title=\\\"海南\\\",海南卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000006211.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"河北卫视\\\" tvg-name=\\\"河北卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/河北卫视.png\\\" group-title=\\\"河北\\\",河北卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000006000040016.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"河南卫视\\\" tvg-name=\\\"河南卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/河南卫视.png\\\" group-title=\\\"河南\\\",河南卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031119.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"黑龙江卫视\\\" tvg-name=\\\"黑龙江卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/黑龙江卫视.png\\\" group-title=\\\"黑龙江\\\",黑龙江卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000001925.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"黑龙江卫视\\\" tvg-name=\\\"黑龙江卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/黑龙江卫视.png\\\" group-title=\\\"黑龙江\\\",黑龙江卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000016510.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"黑龙江卫视\\\" tvg-name=\\\"黑龙江卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/黑龙江卫视.png\\\" group-title=\\\"黑龙江\\\",黑龙江卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265029.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖北卫视\\\" tvg-name=\\\"湖北卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖北卫视.png\\\" group-title=\\\"湖北\\\",湖北卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000024621.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖北卫视\\\" tvg-name=\\\"湖北卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖北卫视.png\\\" group-title=\\\"湖北\\\",湖北卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000015436.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖北卫视\\\" tvg-name=\\\"湖北卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖北卫视.png\\\" group-title=\\\"湖北\\\",湖北卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265023.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖南卫视\\\" tvg-name=\\\"湖南卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖南卫视.png\\\" group-title=\\\"湖南\\\",湖南卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000006692.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖南卫视4\\\" tvg-name=\\\"湖南卫视4\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖南卫视4.png\\\" group-title=\\\"湖南\\\",湖南卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000018044.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖南卫视\\\" tvg-name=\\\"湖南卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖南卫视.png\\\" group-title=\\\"湖南\\\",湖南卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265024.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖南金鹰纪实\\\" tvg-name=\\\"湖南金鹰纪实\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖南金鹰纪实.png\\\" group-title=\\\"湖南\\\",湖南金鹰纪实\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031203.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖南\\\" tvg-name=\\\"湖南\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖南.png\\\" group-title=\\\"湖南\\\",湖南快乐垂钓\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031206.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"湖南茶频道\\\" tvg-name=\\\"湖南茶频道\\\" tvg-logo=\\\"https://epg.v1.mk/logo/湖南茶频道.png\\\" group-title=\\\"湖南\\\",湖南茶频道\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031209.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"吉林卫视\\\" tvg-name=\\\"吉林卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/吉林卫视.png\\\" group-title=\\\"吉林\\\",吉林卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031117.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"江苏卫视\\\" tvg-name=\\\"江苏卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/江苏卫视.png\\\" group-title=\\\"江苏\\\",江苏卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000014861.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"江苏卫视\\\" tvg-name=\\\"江苏卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/江苏卫视.png\\\" group-title=\\\"江苏\\\",江苏卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000001828.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"江苏卫视\\\" tvg-name=\\\"江苏卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/江苏卫视.png\\\" group-title=\\\"江苏\\\",江苏卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265030.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"江西卫视\\\" tvg-name=\\\"江西卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/江西卫视.png\\\" group-title=\\\"江西\\\",江西卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000006000268001.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"江西卫视\\\" tvg-name=\\\"江西卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/江西卫视.png\\\" group-title=\\\"江西\\\",江西卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265032.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"辽宁卫视\\\" tvg-name=\\\"辽宁卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/辽宁卫视.png\\\" group-title=\\\"辽宁\\\",辽宁卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000011671.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"辽宁卫视\\\" tvg-name=\\\"辽宁卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/辽宁卫视.png\\\" group-title=\\\"辽宁\\\",辽宁卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265022.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"青海卫视\\\" tvg-name=\\\"青海卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/青海卫视.png\\\" group-title=\\\"青海\\\",青海卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000002000013359.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"山东卫视\\\" tvg-name=\\\"山东卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/山东卫视.png\\\" group-title=\\\"山东\\\",山东卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000016568.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"山东卫视\\\" tvg-name=\\\"山东卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/山东卫视.png\\\" group-title=\\\"山东\\\",山东卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000004134.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"山东卫视\\\" tvg-name=\\\"山东卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/山东卫视.png\\\" group-title=\\\"山东\\\",山东卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265019.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海东方影视\\\" tvg-name=\\\"上海东方影视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海东方影视.png\\\" group-title=\\\"上海\\\",上海东方卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000003639.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海东方影视\\\" tvg-name=\\\"上海东方影视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海东方影视.png\\\" group-title=\\\"上海\\\",上海东方卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000014098.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海东方影视\\\" tvg-name=\\\"上海东方影视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海东方影视.png\\\" group-title=\\\"上海\\\",上海东方卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265018.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海ICS\\\" tvg-name=\\\"上海ICS\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海ICS.png\\\" group-title=\\\"上海\\\",上海-ICS-外语\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000010000030951.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海第一财经\\\" tvg-name=\\\"上海第一财经\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海第一财经.png\\\" group-title=\\\"上海\\\",上海第一财经\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000010000027146.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海东方影视\\\" tvg-name=\\\"上海东方影视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海东方影视.png\\\" group-title=\\\"上海\\\",上海东方财经\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000007000010003.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海东方影视\\\" tvg-name=\\\"上海东方影视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海东方影视.png\\\" group-title=\\\"上海\\\",上海东方影视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000010000032212.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海都市\\\" tvg-name=\\\"上海都市\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海都市.png\\\" group-title=\\\"上海\\\",上海都市\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000010000018926.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海ICS\\\" tvg-name=\\\"上海ICS\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海ICS.png\\\" group-title=\\\"上海\\\",上海法治天地\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000002000000014.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海ICS\\\" tvg-name=\\\"上海ICS\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海ICS.png\\\" group-title=\\\"上海\\\",上海哈哈炫动\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031123.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海纪实人文\\\" tvg-name=\\\"上海纪实人文\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海纪实人文.png\\\" group-title=\\\"上海\\\",上海纪实人文-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000010282.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海纪实人文\\\" tvg-name=\\\"上海纪实人文\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海纪实人文.png\\\" group-title=\\\"上海\\\",上海纪实人文-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265021.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海五星体育\\\" tvg-name=\\\"上海五星体育\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海五星体育.png\\\" group-title=\\\"上海\\\",上海五星体育\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000010000017540.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"上海新闻综合\\\" tvg-name=\\\"上海新闻综合\\\" tvg-logo=\\\"https://epg.v1.mk/logo/上海新闻综合.png\\\" group-title=\\\"上海\\\",上海新闻综合\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031110.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"深圳卫视\\\" tvg-name=\\\"深圳卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/深圳卫视.png\\\" group-title=\\\"卫视\\\",深圳卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000007410.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"深圳卫视\\\" tvg-name=\\\"深圳卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/深圳卫视.png\\\" group-title=\\\"卫视\\\",深圳卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000002116.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"深圳卫视\\\" tvg-name=\\\"深圳卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/深圳卫视.png\\\" group-title=\\\"卫视\\\",深圳卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265028.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"四川卫视\\\" tvg-name=\\\"四川卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/四川卫视.png\\\" group-title=\\\"四川\\\",四川卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000006119.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"天津卫视\\\" tvg-name=\\\"天津卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/天津卫视.png\\\" group-title=\\\"卫视\\\",天津卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000006827.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"天津卫视\\\" tvg-name=\\\"天津卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/天津卫视.png\\\" group-title=\\\"卫视\\\",天津卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000001000009186.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"天津卫视\\\" tvg-name=\\\"天津卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/天津卫视.png\\\" group-title=\\\"卫视\\\",天津卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265026.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"云南卫视\\\" tvg-name=\\\"云南卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/云南卫视.png\\\" group-title=\\\"云南\\\",云南卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031120.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"浙江卫视\\\" tvg-name=\\\"浙江卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/浙江卫视.png\\\" group-title=\\\"浙江\\\",浙江卫视-50-FPS\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000004000007275.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"浙江卫视\\\" tvg-name=\\\"浙江卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/浙江卫视.png\\\" group-title=\\\"浙江\\\",浙江卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000014260.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"浙江卫视\\\" tvg-name=\\\"浙江卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/浙江卫视.png\\\" group-title=\\\"浙江\\\",浙江卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265031.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"重庆卫视\\\" tvg-name=\\\"重庆卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/重庆卫视.png\\\" group-title=\\\"重庆\\\",重庆卫视\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000001096.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"重庆卫视\\\" tvg-name=\\\"重庆卫视\\\" tvg-logo=\\\"https://epg.v1.mk/logo/重庆卫视.png\\\" group-title=\\\"重庆\\\",重庆卫视-HEVC\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000265017.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"华数4K\\\" tvg-name=\\\"华数4K\\\" tvg-logo=\\\"https://epg.v1.mk/logo/华数4K.png\\\" group-title=\\\"4K频道\\\",华数-4K\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000003000004748.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"纯享4K\\\" tvg-name=\\\"纯享4K\\\" tvg-logo=\\\"https://epg.v1.mk/logo/纯享4K.png\\\" group-title=\\\"4K频道\\\",纯享-4K\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000011651.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"咪咕4K\\\" tvg-name=\\\"咪咕4K\\\" tvg-logo=\\\"https://epg.v1.mk/logo/咪咕4K.png\\\" group-title=\\\"4K频道\\\",咪咕4K-1\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/3000000010000005180.m3u8?cdn=FifastbLive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"咪咕4K\\\" tvg-name=\\\"咪咕4K\\\" tvg-logo=\\\"https://epg.v1.mk/logo/咪咕4K.png\\\" group-title=\\\"4K频道\\\",咪咕4K-2\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/3000000010000015686.m3u8?cdn=FifastbLive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"咪咕4k\\\" tvg-name=\\\"咪咕4k\\\" tvg-logo=\\\"https://epg.v1.mk/logo/咪咕4k.png\\\" group-title=\\\"其他\\\",咪咕全民热练\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/3000000020000031315.m3u8?cdn=FifastbLive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"求索动物\\\" tvg-name=\\\"求索动物\\\" tvg-logo=\\\"https://epg.v1.mk/logo/求索动物.png\\\" group-title=\\\"其他\\\",求索动物\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000002000010046.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"求索纪录\\\" tvg-name=\\\"求索纪录\\\" tvg-logo=\\\"https://epg.v1.mk/logo/求索纪录.png\\\" group-title=\\\"其他\\\",求索纪录\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000002000032052.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"求索科学\\\" tvg-name=\\\"求索科学\\\" tvg-logo=\\\"https://epg.v1.mk/logo/求索科学.png\\\" group-title=\\\"其他\\\",求索科学\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000002000032344.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"求索生活\\\" tvg-name=\\\"求索生活\\\" tvg-logo=\\\"https://epg.v1.mk/logo/求索生活.png\\\" group-title=\\\"其他\\\",求索生活\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000002000003382.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NewTV精品综合\\\" tvg-name=\\\"NewTV精品综合\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NewTV精品综合.png\\\" group-title=\\\"NEWTV\\\",NewTV-精品综合\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000019008.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv精品大剧\\\" tvg-name=\\\"newtv精品大剧\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv精品大剧.png\\\" group-title=\\\"NEWTV\\\",NewTV-精品大剧\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000013968.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv精品纪录\\\" tvg-name=\\\"newtv精品纪录\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv精品纪录.png\\\" group-title=\\\"NEWTV\\\",NewTV-精品纪录\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000013730.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv精品体育\\\" tvg-name=\\\"newtv精品体育\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv精品体育.png\\\" group-title=\\\"NEWTV\\\",NewTV-精品体育\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000014634.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NEWTV精品萌宠\\\" tvg-name=\\\"NEWTV精品萌宠\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NEWTV精品萌宠.png\\\" group-title=\\\"NEWTV\\\",NewTV-精品萌宠\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000006000032328.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv爱情喜剧\\\" tvg-name=\\\"newtv爱情喜剧\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv爱情喜剧.png\\\" group-title=\\\"NEWTV\\\",NewTV-爱情喜剧\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000010.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv超级电视剧\\\" tvg-name=\\\"newtv超级电视剧\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv超级电视剧.png\\\" group-title=\\\"NEWTV\\\",NewTV-超级电视剧\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000006000268003.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv超级电影\\\" tvg-name=\\\"newtv超级电影\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv超级电影.png\\\" group-title=\\\"NEWTV\\\",NewTV-超级电影\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000003000012426.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv超级体育\\\" tvg-name=\\\"newtv超级体育\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv超级体育.png\\\" group-title=\\\"NEWTV\\\",NewTV-超级体育\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000009601.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv超级综艺\\\" tvg-name=\\\"newtv超级综艺\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv超级综艺.png\\\" group-title=\\\"NEWTV\\\",NewTV-超级综艺\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000006000268002.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv潮妈辣婆\\\" tvg-name=\\\"newtv潮妈辣婆\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv潮妈辣婆.png\\\" group-title=\\\"NEWTV\\\",NewTV-潮妈辣婆\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000018.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NewTV东北热剧\\\" tvg-name=\\\"NewTV东北热剧\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NewTV东北热剧.png\\\" group-title=\\\"NEWTV\\\",NewTV-东北热剧\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000266013.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv动作电影\\\" tvg-name=\\\"newtv动作电影\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv动作电影.png\\\" group-title=\\\"NEWTV\\\",NewTV-动作电影\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000018653.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NewTV古装剧场\\\" tvg-name=\\\"NewTV古装剧场\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NewTV古装剧场.png\\\" group-title=\\\"NEWTV\\\",NewTV-古装剧场\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000024.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NewTV欢乐剧场\\\" tvg-name=\\\"NewTV欢乐剧场\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NewTV欢乐剧场.png\\\" group-title=\\\"NEWTV\\\",NewTV-欢乐剧场\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000266012.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv家庭剧场\\\" tvg-name=\\\"newtv家庭剧场\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv家庭剧场.png\\\" group-title=\\\"NEWTV\\\",NewTV-家庭剧场\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000008284.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NewTV金牌综艺\\\" tvg-name=\\\"NewTV金牌综艺\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NewTV金牌综艺.png\\\" group-title=\\\"NEWTV\\\",NewTV-金牌综艺\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000026167.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv惊悚悬疑\\\" tvg-name=\\\"newtv惊悚悬疑\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv惊悚悬疑.png\\\" group-title=\\\"NEWTV\\\",NewTV-惊悚悬疑\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000024282.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv军旅剧场\\\" tvg-name=\\\"newtv军旅剧场\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv军旅剧场.png\\\" group-title=\\\"NEWTV\\\",NewTV-军旅剧场\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000014.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv军事评论\\\" tvg-name=\\\"newtv军事评论\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv军事评论.png\\\" group-title=\\\"NEWTV\\\",NewTV-军事评论\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000022.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NewTV魅力潇湘\\\" tvg-name=\\\"NewTV魅力潇湘\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NewTV魅力潇湘.png\\\" group-title=\\\"NEWTV\\\",NewTV-魅力潇湘\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000006197.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NewTV明星大片\\\" tvg-name=\\\"NewTV明星大片\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NewTV明星大片.png\\\" group-title=\\\"NEWTV\\\",NewTV-明星大片\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000016.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv农业致富\\\" tvg-name=\\\"newtv农业致富\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv农业致富.png\\\" group-title=\\\"NEWTV\\\",NewTV-农业致富\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000003.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NEWTV武博世界\\\" tvg-name=\\\"NEWTV武博世界\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NEWTV武博世界.png\\\" group-title=\\\"NEWTV\\\",NewTV-武博世界\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000007.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv炫舞未来\\\" tvg-name=\\\"newtv炫舞未来\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv炫舞未来.png\\\" group-title=\\\"NEWTV\\\",NewTV-炫舞未来\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000000515.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv怡伴健康\\\" tvg-name=\\\"newtv怡伴健康\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv怡伴健康.png\\\" group-title=\\\"NEWTV\\\",NewTV-怡伴健康\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000005000266011.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"newtv中国功夫\\\" tvg-name=\\\"newtv中国功夫\\\" tvg-logo=\\\"https://epg.v1.mk/logo/newtv中国功夫.png\\\" group-title=\\\"NEWTV\\\",NewTV-中国功夫\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/2000000003000000009.m3u8?cdn=hnbblive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NEWTV黑莓电影\\\" tvg-name=\\\"NEWTV黑莓电影\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NEWTV黑莓电影.png\\\" group-title=\\\"NEWTV\\\",NewTV-黑莓电影\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000019624.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NEWTV黑莓动画\\\" tvg-name=\\\"NEWTV黑莓动画\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NEWTV黑莓动画.png\\\" group-title=\\\"NEWTV\\\",NewTV-黑莓动画\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000004000021734.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NEWTVCJDY\\\" tvg-name=\\\"NEWTVCJDY\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NEWTVCJDY.png\\\" group-title=\\\"NEWTV\\\",NewTV-哒啵电竞\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000006000032327.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"NEWTVCJDY\\\" tvg-name=\\\"NEWTVCJDY\\\" tvg-logo=\\\"https://epg.v1.mk/logo/NEWTVCJDY.png\\\" group-title=\\\"NEWTV\\\",NewTV-哒啵赛事\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/1000000001000003775.m3u8?cdn=ystenlive\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV\\\" tvg-name=\\\"SITV\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV.png\\\" group-title=\\\"其他\\\",SiTV-动漫秀场\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031113.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV都市剧场\\\" tvg-name=\\\"SITV都市剧场\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV都市剧场.png\\\" group-title=\\\"其他\\\",SiTV-都市剧场\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031111.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV法治天地\\\" tvg-name=\\\"SITV法治天地\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV法治天地.png\\\" group-title=\\\"其他\\\",SiTV-法治天地\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/9001547084732463424.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV欢笑剧场\\\" tvg-name=\\\"SITV欢笑剧场\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV欢笑剧场.png\\\" group-title=\\\"其他\\\",SiTV-欢笑剧场\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000002000009455.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV欢笑剧场\\\" tvg-name=\\\"SITV欢笑剧场\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV欢笑剧场.png\\\" group-title=\\\"其他\\\",SiTV-欢笑剧场-4K\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000007000010001.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV金色学堂\\\" tvg-name=\\\"SITV金色学堂\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV金色学堂.png\\\" group-title=\\\"其他\\\",SiTV-金色学堂\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000010000026105.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV劲爆体育\\\" tvg-name=\\\"SITV劲爆体育\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV劲爆体育.png\\\" group-title=\\\"其他\\\",SiTV-劲爆体育\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000002000029972.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV乐游\\\" tvg-name=\\\"SITV乐游\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV乐游.png\\\" group-title=\\\"其他\\\",SiTV-乐游\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031112.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV\\\" tvg-name=\\\"SITV\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV.png\\\" group-title=\\\"其他\\\",SiTV-魅力足球\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031207.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV七彩戏剧\\\" tvg-name=\\\"SITV七彩戏剧\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV七彩戏剧.png\\\" group-title=\\\"其他\\\",SiTV-七彩戏剧\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031116.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV\\\" tvg-name=\\\"SITV\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV.png\\\" group-title=\\\"其他\\\",SiTV-生活时尚\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000002000019634.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"SITV\\\" tvg-name=\\\"SITV\\\" tvg-logo=\\\"https://epg.v1.mk/logo/SITV.png\\\" group-title=\\\"其他\\\",SiTV-游戏风云\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/5000000011000031114.m3u8?cdn=bestzb\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱电竞\\\" tvg-name=\\\"IHOT爱电竞\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱电竞.png\\\" group-title=\\\"IHOT\\\",iHOT-爱电竞\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000230630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱谍战\\\" tvg-name=\\\"IHOT爱谍战\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱谍战.png\\\" group-title=\\\"IHOT\\\",iHOT-爱谍战\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000070630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱动漫\\\" tvg-name=\\\"IHOT爱动漫\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱动漫.png\\\" group-title=\\\"IHOT\\\",iHOT-爱动漫\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000280630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱都市\\\" tvg-name=\\\"IHOT爱都市\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱都市.png\\\" group-title=\\\"IHOT\\\",iHOT-爱都市\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000080630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱怀旧\\\" tvg-name=\\\"IHOT爱怀旧\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱怀旧.png\\\" group-title=\\\"IHOT\\\",iHOT-爱怀旧\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000260630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱经典\\\" tvg-name=\\\"IHOT爱经典\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱经典.png\\\" group-title=\\\"IHOT\\\",iHOT-爱经典\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000060630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱科幻\\\" tvg-name=\\\"IHOT爱科幻\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱科幻.png\\\" group-title=\\\"IHOT\\\",iHOT-爱科幻\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000020630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱科学\\\" tvg-name=\\\"IHOT爱科学\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱科学.png\\\" group-title=\\\"IHOT\\\",iHOT-爱科学\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000160630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱浪漫\\\" tvg-name=\\\"IHOT爱浪漫\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱浪漫.png\\\" group-title=\\\"IHOT\\\",iHOT-爱浪漫\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000040630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱历史\\\" tvg-name=\\\"IHOT爱历史\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱历史.png\\\" group-title=\\\"IHOT\\\",iHOT-爱历史\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000150630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱旅行\\\" tvg-name=\\\"IHOT爱旅行\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱旅行.png\\\" group-title=\\\"IHOT\\\",iHOT-爱旅行\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000250630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱奇谈\\\" tvg-name=\\\"IHOT爱奇谈\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱奇谈.png\\\" group-title=\\\"IHOT\\\",iHOT-爱奇谈\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000270630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱青春\\\" tvg-name=\\\"IHOT爱青春\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱青春.png\\\" group-title=\\\"IHOT\\\",iHOT-爱青春\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000100630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱赛车\\\" tvg-name=\\\"IHOT爱赛车\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱赛车.png\\\" group-title=\\\"IHOT\\\",iHOT-爱赛车\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000240630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱体育\\\" tvg-name=\\\"IHOT爱体育\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱体育.png\\\" group-title=\\\"IHOT\\\",iHOT-爱体育\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000290630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱玩具\\\" tvg-name=\\\"IHOT爱玩具\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱玩具.png\\\" group-title=\\\"IHOT\\\",iHOT-爱玩具\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000220630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱喜剧\\\" tvg-name=\\\"IHOT爱喜剧\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱喜剧.png\\\" group-title=\\\"IHOT\\\",iHOT-爱喜剧\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000010630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱悬疑\\\" tvg-name=\\\"IHOT爱悬疑\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱悬疑.png\\\" group-title=\\\"IHOT\\\",iHOT-爱悬疑\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000050630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱幼教\\\" tvg-name=\\\"IHOT爱幼教\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱幼教.png\\\" group-title=\\\"IHOT\\\",iHOT-爱幼教\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000180630.m3u8?cdn=wasusyt\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1,tvg-id=\\\"IHOT爱院线\\\" tvg-name=\\\"IHOT爱院线\\\" tvg-logo=\\\"https://epg.v1.mk/logo/IHOT爱院线.png\\\" group-title=\\\"IHOT\\\",iHOT-爱院线\")\r\n\tfmt.Fprintln(w, \"http://\"+hostname+\"/itv/6000000006000030630.m3u8?cdn=wasusyt\")\r\n}"
  },
  {
    "path": "list/yylunbo.go",
    "content": "// Package list\r\n// @Time:2023/06/03 20:35\r\n// @File:yylunbo.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage list\r\n\r\nimport (\r\n\t\"io\"\r\n\t\"net/http\"\r\n)\r\n\r\ntype Yylist struct {\r\n}\r\n\r\ntype DataElement struct {\r\n\tAvatar string `json:\"avatar\"`\r\n\tBiz    string `json:\"biz\"`\r\n\tDesc   string `json:\"desc\"`\r\n\tSid    int    `json:\"sid\"`\r\n}\r\n\r\ntype ApiResponse struct {\r\n\tData struct {\r\n\t\tIsLastPage int           `json:\"isLastPage\"`\r\n\t\tData       []DataElement `json:\"data\"`\r\n\t} `json:\"data\"`\r\n}\r\n\r\nfunc (y *Yylist) Yylb(requesturl string) string {\r\n\tclient := &http.Client{}\r\n\treq, _ := http.NewRequest(\"GET\", requesturl, nil)\r\n\treq.Header.Set(\"Upgrade-Insecure-Requests\", \"1\")\r\n\treq.Header.Set(\"User-Agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36\")\r\n\tres, err := client.Do(req)\r\n\tif err != nil {\r\n\t\tpanic(err)\r\n\t}\r\n\tdefer res.Body.Close()\r\n\tbody, _ := io.ReadAll(res.Body)\r\n\treturn string(body)\r\n}"
  },
  {
    "path": "liveurls/bilibili.go",
    "content": "// Package liveurls\r\n// @Time:2023/02/10 01:03\r\n// @File:bilibili.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage liveurls\r\n\r\nimport (\r\n\t\"encoding/json\"\r\n\t\"fmt\"\r\n\t\"github.com/tidwall/gjson\"\r\n\t\"io\"\r\n\t\"net/http\"\r\n)\r\n\r\ntype BiliBili struct {\r\n\tRid      string\r\n\tLine     string\r\n\tQuality  string\r\n\tPlatform string\r\n}\r\n\r\nfunc (b *BiliBili) GetRealRoomID() any {\r\n\tvar firstmap = make(map[string]any)\r\n\tvar realroomid string\r\n\tapiurl := \"https://api.live.bilibili.com/room/v1/Room/room_init?id=\" + b.Rid\r\n\tclient := &http.Client{}\r\n\tr, _ := http.NewRequest(\"GET\", apiurl, nil)\r\n\tr.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\")\r\n\tresp, _ := client.Do(r)\r\n\tdefer resp.Body.Close()\r\n\tbody, _ := io.ReadAll(resp.Body)\r\n\tjson.Unmarshal(body, &firstmap)\r\n\tif firstmap[\"msg\"] == \"直播间不存在\" {\r\n\t\treturn nil\r\n\t}\r\n\tif newmap, ok := firstmap[\"data\"].(map[string]any); ok {\r\n\t\tif newmap[\"live_status\"] != float64(1) {\r\n\t\t\treturn nil\r\n\t\t} else {\r\n\t\t\tif flt, ok := newmap[\"room_id\"].(float64); ok {\r\n\t\t\t\trealroomid = fmt.Sprintf(\"%v\", int(flt))\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\treturn realroomid\r\n}\r\n\r\nfunc (b *BiliBili) GetPlayUrl() any {\r\n\tvar roomid string\r\n\tvar realurl string\r\n\tif str, ok := b.GetRealRoomID().(string); ok {\r\n\t\troomid = str\r\n\t} else {\r\n\t\treturn nil\r\n\t}\r\n\tclient := &http.Client{}\r\n\tparams := map[string]string{\r\n\t\t\"room_id\":  roomid,\r\n\t\t\"protocol\": \"0,1\",\r\n\t\t\"format\":   \"0,1,2\",\r\n\t\t\"codec\":    \"0,1\",\r\n\t\t\"qn\":       b.Quality,\r\n\t\t\"platform\": b.Platform,\r\n\t\t\"ptype\":    \"8\",\r\n\t}\r\n\tr, _ := http.NewRequest(\"GET\", \"https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo\", nil)\r\n\tq := r.URL.Query()\r\n\tfor k, v := range params {\r\n\t\tq.Add(k, v)\r\n\t}\r\n\tr.URL.RawQuery = q.Encode()\r\n\tresp, _ := client.Do(r)\r\n\tdefer resp.Body.Close()\r\n\tbody, _ := io.ReadAll(resp.Body)\r\n\tvar json = string(body)\r\n\tvalue := gjson.Get(json, \"data.playurl_info.playurl.stream\")\r\n\tvalue.ForEach(func(key, value gjson.Result) bool {\r\n\t\tnewvalue := gjson.Get(value.String(), \"format.0.format_name\")\r\n\t\tif newvalue.String() == \"ts\" {\r\n\t\t\tnnvalue := gjson.Get(value.String(), \"format.#\")\r\n\t\t\tvaluelast := fmt.Sprintf(\"%v\", nnvalue.Int()-1)\r\n\t\t\tcodeclen := gjson.Get(value.String(), \"format.\"+valuelast+\".codec.#\")\r\n\t\t\tcodeclast := fmt.Sprintf(\"%v\", codeclen.Int()-1)\r\n\t\t\tbase_url := gjson.Get(value.String(), \"format.\"+valuelast+\".codec.\"+codeclast+\".base_url\")\r\n\t\t\turl_info := gjson.Get(value.String(), \"format.\"+valuelast+\".codec.\"+codeclast+\".url_info\")\r\n\t\t\turl_info.ForEach(func(key, value gjson.Result) bool {\r\n\t\t\t\tkeyval := fmt.Sprintf(\"%v\", key)\r\n\t\t\t\tswitch b.Line {\r\n\t\t\t\tcase \"first\":\r\n\t\t\t\t\tif keyval == \"0\" {\r\n\t\t\t\t\t\thost := gjson.Get(value.String(), \"host\")\r\n\t\t\t\t\t\textra := gjson.Get(value.String(), \"extra\")\r\n\t\t\t\t\t\trealurl = fmt.Sprintf(\"%v%v%v\", host, base_url, extra)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\tcase \"second\":\r\n\t\t\t\t\tif keyval == \"1\" {\r\n\t\t\t\t\t\thost := gjson.Get(value.String(), \"host\")\r\n\t\t\t\t\t\textra := gjson.Get(value.String(), \"extra\")\r\n\t\t\t\t\t\trealurl = fmt.Sprintf(\"%v%v%v\", host, base_url, extra)\r\n\t\t\t\t\t}\r\n\t\t\t\tcase \"third\":\r\n\t\t\t\t\tif keyval == \"2\" {\r\n\t\t\t\t\t\thost := gjson.Get(value.String(), \"host\")\r\n\t\t\t\t\t\textra := gjson.Get(value.String(), \"extra\")\r\n\t\t\t\t\t\trealurl = fmt.Sprintf(\"%v%v%v\", host, base_url, extra)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true\r\n\t\t\t})\r\n\t\t}\r\n\t\treturn true\r\n\t})\r\n\treturn realurl\r\n}\r\n"
  },
  {
    "path": "liveurls/douyin.go",
    "content": "// Package liveurls\r\n// @Time:2023/02/03 01:59\r\n// @File:douyin.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage liveurls\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"github.com/tidwall/gjson\"\r\n\t\"io\"\r\n\t\"net/http\"\r\n\t\"regexp\"\r\n\t\"strconv\"\r\n)\r\n\r\ntype Douyin struct {\r\n\tStream string\r\n\tRid    string\r\n}\r\n\r\nfunc (d *Douyin) GetDouYinUrl() any {\r\n\tliveurl := \"https://live.douyin.com/\" + d.Rid\r\n\tclient := &http.Client{}\r\n\tre, _ := http.NewRequest(\"GET\", liveurl, nil)\r\n\tre.Header.Add(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\")\r\n\tre.Header.Add(\"upgrade-insecure-requests\", \"1\")\r\n\toresp, _ := client.Do(re)\r\n\tdefer oresp.Body.Close()\r\n\toreg := regexp.MustCompile(`(?i)__ac_nonce=(.*?);`)\r\n\tores := oreg.FindStringSubmatch(oresp.Header[\"Set-Cookie\"][0])\r\n\tr, _ := http.NewRequest(\"GET\", liveurl, nil)\r\n\tcookie := &http.Cookie{Name: \"__ac_nonce\", Value: ores[1]}\r\n\tr.AddCookie(cookie)\r\n\tr.Header.Add(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\")\r\n\tr.Header.Add(\"upgrade-insecure-requests\", \"1\")\r\n\tresp, _ := client.Do(r)\r\n\tdefer resp.Body.Close()\r\n\treg := regexp.MustCompile(`(?i)ttwid=.*?;`)\r\n\tres := reg.FindStringSubmatch(fmt.Sprintf(\"%s\", resp.Cookies()))[0]\r\n\turl := \"https://live.douyin.com/webcast/room/web/enter/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&language=zh-CN&enter_from=web_live&cookie_enabled=true&screen_width=1728&screen_height=1117&browser_language=zh-CN&browser_platform=MacIntel&browser_name=Chrome&browser_version=116.0.0.0&web_rid=\" + d.Rid\r\n\treq, _ := http.NewRequest(\"GET\", url, nil)\r\n\treq.Header.Add(\"User-Agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36\")\r\n\treq.Header.Add(\"Cookie\", res)\r\n\treq.Header.Add(\"Accept\", \"*/*\")\r\n\treq.Header.Add(\"Host\", \"live.douyin.com\")\r\n\treq.Header.Add(\"Connection\", \"keep-alive\")\r\n\tress, _ := client.Do(req)\r\n\tdefer ress.Body.Close()\r\n\tbody, _ := io.ReadAll(ress.Body)\r\n\tvar json = string(body)\r\n\tstatus, _ := strconv.Atoi(fmt.Sprintf(\"%s\", gjson.Get(json, \"data.data.0.status\")))\r\n\tif status != 2 {\r\n\t\treturn nil\r\n\t}\r\n\tvar realurl string\r\n\tvalue := gjson.Get(json, \"data.data.0.stream_url.live_core_sdk_data.pull_data.stream_data\")\r\n\tvalue.ForEach(func(key, value gjson.Result) bool {\r\n\t\tif gjson.Get(value.String(), \"data.origin\").Exists() {\r\n\t\t\tswitch d.Stream {\r\n\t\t\tcase \"flv\":\r\n\t\t\t\trealurl = fmt.Sprintf(\"%s\", gjson.Get(value.String(), \"data.origin.main.flv\"))\r\n\t\t\tcase \"hls\":\r\n\t\t\t\trealurl = fmt.Sprintf(\"%s\", gjson.Get(value.String(), \"data.origin.main.hls\"))\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true\r\n\t})\r\n\treturn realurl\r\n}\r\n"
  },
  {
    "path": "liveurls/douyu.go",
    "content": "// Package liveurls\r\n// @Time:2023/02/05 06:36\r\n// @File:douyu.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage liveurls\r\n\r\nimport (\r\n\t\"Golang/utils\"\r\n\t\"crypto/md5\"\r\n\t\"encoding/json\"\r\n\t\"fmt\"\r\n\t\"io\"\r\n\t\"net/http\"\r\n\t\"regexp\"\r\n\t\"strings\"\r\n\t\"time\"\r\n)\r\n\r\ntype Douyu struct {\r\n\tRid         string\r\n\tStream_type string\r\n}\r\n\r\nfunc md5V3(str string) string {\r\n\tw := md5.New()\r\n\tio.WriteString(w, str)\r\n\tmd5str := fmt.Sprintf(\"%x\", w.Sum(nil))\r\n\treturn md5str\r\n}\r\n\r\nfunc (d *Douyu) GetRoomId() any {\r\n\tliveurl := \"https://m.douyu.com/\" + d.Rid\r\n\tclient := &http.Client{}\r\n\tr, _ := http.NewRequest(\"GET\", liveurl, nil)\r\n\tr.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\")\r\n\tr.Header.Add(\"upgrade-insecure-requests\", \"1\")\r\n\tresp, _ := client.Do(r)\r\n\tdefer resp.Body.Close()\r\n\tbody, _ := io.ReadAll(resp.Body)\r\n\troomidreg := regexp.MustCompile(`(?i)rid\":(\\d{1,8}),\"vipId`)\r\n\troomidres := roomidreg.FindStringSubmatch(string(body))\r\n\tif roomidres == nil {\r\n\t\treturn nil\r\n\t}\r\n\trealroomid := roomidres[1]\r\n\treturn realroomid\r\n}\r\n\r\nfunc (d *Douyu) GetRealUrl() any {\r\n\tvar jsUtil = &utils.JsUtil{}\r\n\tdid := \"10000000000000000000000000001501\"\r\n\tvar timestamp = time.Now().Unix()\r\n\tvar realroomid string\r\n\trid := d.GetRoomId()\r\n\tif str, ok := rid.(string); ok {\r\n\t\trealroomid = str\r\n\t} else {\r\n\t\treturn nil\r\n\t}\r\n\tliveurl := \"https://www.douyu.com/\" + realroomid\r\n\tclient := &http.Client{}\r\n\tr, _ := http.NewRequest(\"GET\", liveurl, nil)\r\n\tr.Header.Add(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\")\r\n\tr.Header.Add(\"upgrade-insecure-requests\", \"1\")\r\n\tresp, _ := client.Do(r)\r\n\tdefer resp.Body.Close()\r\n\tbody, _ := io.ReadAll(resp.Body)\r\n\treg := regexp.MustCompile(`(?i)(vdwdae325w_64we[\\s\\S]*function ub98484234[\\s\\S]*?)function`)\r\n\tres := reg.FindStringSubmatch(string(body))\r\n\tnreg := regexp.MustCompile(`(?i)eval.*?;}`)\r\n\tstrfn := nreg.ReplaceAllString(res[1], \"strc;}\")\r\n\tvar funcContent1 []string\r\n\tfuncContent1 = append(append(funcContent1, strfn), \"ub98484234\")\r\n\tresult := jsUtil.JsRun(funcContent1, \"ub98484234\")\r\n\tnres := fmt.Sprintf(\"%s\", result)\r\n\tnnreg := regexp.MustCompile(`(?i)v=(\\d+)`)\r\n\tnnres := nnreg.FindStringSubmatch(nres)\r\n\tunrb := fmt.Sprintf(\"%v%v%v%v\", realroomid, did, timestamp, nnres[1])\r\n\trb := md5V3(unrb)\r\n\tnnnreg := regexp.MustCompile(`(?i)return rt;}\\);?`)\r\n\tstrfn2 := nnnreg.ReplaceAllString(nres, \"return rt;}\")\r\n\tstrfn3 := strings.Replace(strfn2, `(function (`, `function sign(`, -1)\r\n\tstrfn4 := strings.Replace(strfn3, `CryptoJS.MD5(cb).toString()`, `\"`+rb+`\"`, -1)\r\n\tvar funcContent2 []string\r\n\tfuncContent2 = append(append(funcContent2, strfn4), \"sign\")\r\n\tresult2 := jsUtil.JsRun(funcContent2, realroomid, did, timestamp)\r\n\tparam := fmt.Sprintf(\"%s\", result2)\r\n\trealparam := param + \"&rate=0\"\r\n\tr1, n4err := http.Post(\"https://www.douyu.com/lapi/live/getH5Play/\"+realroomid, \"application/x-www-form-urlencoded\", strings.NewReader(realparam))\r\n\tif n4err != nil {\r\n\t\treturn nil\r\n\t}\r\n\tdefer r1.Body.Close()\r\n\tbody1, _ := io.ReadAll(r1.Body)\r\n\tvar s1 map[string]any\r\n\tjson.Unmarshal(body1, &s1)\r\n\tvar flv_url string\r\n\tvar rtmp_url string\r\n\tvar rtmp_live string\r\n\tfor k, v := range s1 {\r\n\t\tif k == \"error\" {\r\n\t\t\tif s1[k] != float64(0) {\r\n\t\t\t\treturn nil\r\n\t\t\t}\r\n\t\t}\r\n\t\tif v, ok := v.(map[string]any); ok {\r\n\t\t\tfor k, v := range v {\r\n\t\t\t\tif k == \"rtmp_url\" {\r\n\t\t\t\t\tif urlstr, ok := v.(string); ok {\r\n\t\t\t\t\t\trtmp_url = urlstr\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if k == \"rtmp_live\" {\r\n\t\t\t\t\tif urlstr, ok := v.(string); ok {\r\n\t\t\t\t\t\trtmp_live = urlstr\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tflv_url = rtmp_url + \"/\" + rtmp_live\r\n\tn4reg := regexp.MustCompile(`(?i)(\\d{1,8}[0-9a-zA-Z]+)_?\\d{0,4}(.flv|/playlist)`)\r\n\thouzhui := n4reg.FindStringSubmatch(flv_url)\r\n\tvar real_url string\r\n\tswitch d.Stream_type {\r\n\tcase \"hls\":\r\n\t\treal_url = strings.Replace(flv_url, houzhui[1]+\".flv\", houzhui[1]+\".m3u8\", -1)\r\n\tcase \"flv\":\r\n\t\treal_url = flv_url\r\n\tcase \"xs\":\r\n\t\treal_url = strings.Replace(flv_url, houzhui[1]+\".flv\", houzhui[1]+\".xs\", -1)\r\n\t}\r\n\treturn real_url\r\n}"
  },
  {
    "path": "liveurls/huya.go",
    "content": "// Package liveurls\r\n// @Time:2023/02/05 23:34\r\n// @File:huya.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage liveurls\r\n\r\nimport (\r\n\t\"bytes\"\r\n\t\"crypto/md5\"\r\n\t\"encoding/base64\"\r\n\t\"encoding/hex\"\r\n\t\"encoding/json\"\r\n\t\"fmt\"\r\n\t\"io\"\r\n\t\"math/rand\"\r\n\t\"net/http\"\r\n\t\"net/url\"\r\n\t\"regexp\"\r\n\t\"strconv\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\t\"github.com/tidwall/gjson\"\r\n)\r\n\r\ntype Huya struct {\r\n\tRid   string\r\n\tMedia string\r\n\tType  string\r\n\tCdn   string\r\n}\r\n\r\ntype Data struct {\r\n}\r\n\r\ntype Payload struct {\r\n\tAppId   int    `json:\"appId\"`\r\n\tByPass  int    `json:\"byPass\"`\r\n\tContext string `json:\"context\"`\r\n\tVersion string `json:\"version\"`\r\n\tData    Data   `json:\"data\"`\r\n}\r\n\r\ntype ResponseData struct {\r\n\tData struct {\r\n\t\tUid string `json:\"uid\"`\r\n\t} `json:\"data\"`\r\n}\r\n\r\nfunc getContent(apiUrl string) ([]byte, error) {\r\n\tpayload := Payload{\r\n\t\tAppId:   5002,\r\n\t\tByPass:  3,\r\n\t\tContext: \"\",\r\n\t\tVersion: \"2.4\",\r\n\t\tData:    Data{},\r\n\t}\r\n\tjsonPayload, err := json.Marshal(payload)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\r\n\treq, err := http.NewRequest(\"POST\", apiUrl, bytes.NewBuffer(jsonPayload))\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\r\n\treq.Header.Set(\"Content-Type\", \"application/json\")\r\n\treq.Header.Set(\"Content-Length\", fmt.Sprintf(\"%d\", len(jsonPayload)))\r\n\treq.Header.Set(\"upgrade-insecure-requests\", \"1\")\r\n\treq.Header.Set(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36\")\r\n\r\n\tclient := &http.Client{}\r\n\tresp, err := client.Do(req)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\tdefer resp.Body.Close()\r\n\r\n\treturn io.ReadAll(resp.Body)\r\n}\r\n\r\nvar streamInfo = map[string]any{\"flv\": make(map[string]string), \"hls\": make(map[string]string)}\r\n\r\nfunc getUid() string {\r\n\tcontent, _ := getContent(\"https://udblgn.huya.com/web/anonymousLogin\")\r\n\tvar responseData ResponseData\r\n\tjson.Unmarshal(content, &responseData)\r\n\tuid := responseData.Data.Uid\r\n\treturn uid\r\n}\r\n\r\nvar uid, _ = strconv.Atoi(getUid())\r\n\r\nfunc getUUID() int64 {\r\n\tnow := time.Now().UnixNano() / int64(time.Millisecond)\r\n\trandNum := rand.Intn(1000)\r\n\treturn ((now % 10000000000 * 1000) + int64(randNum)) % 4294967295\r\n}\r\n\r\nfunc processAntiCode(antiCode string, uid int, streamName string) string {\r\n\tTimeLocation, err := time.LoadLocation(\"Asia/Shanghai\")\r\n\tif err != nil {\r\n\t\tTimeLocation = time.FixedZone(\"CST\", 8*60*60)\r\n\t}\r\n\tnow := time.Now().In(TimeLocation)\r\n\tq, _ := url.ParseQuery(antiCode)\r\n\tq.Set(\"t\", \"102\")\r\n\tq.Set(\"ctype\", \"tars_mp\")\r\n\tq.Set(\"wsTime\", strconv.FormatInt(time.Now().Unix()+21600, 16))\r\n\tq.Set(\"ver\", \"1\")\r\n\tq.Set(\"sv\", now.Format(\"2006010215\"))\r\n\tseqId := strconv.Itoa(uid + int(time.Now().UnixNano()/int64(time.Millisecond)))\r\n\tq.Set(\"seqid\", seqId)\r\n\tq.Set(\"uid\", strconv.Itoa(uid))\r\n\tq.Set(\"uuid\", strconv.FormatInt(getUUID(), 10))\r\n\th := md5.New()\r\n\th.Write([]byte(seqId + \"|\" + q.Get(\"ctype\") + \"|\" + q.Get(\"t\")))\r\n\tss := hex.EncodeToString(h.Sum(nil))\r\n\tfm, _ := base64.StdEncoding.DecodeString(q.Get(\"fm\"))\r\n\tq.Set(\"fm\", strings.Replace(strings.Replace(strings.Replace(strings.Replace(string(fm), \"$0\", q.Get(\"uid\"), -1), \"$1\", streamName, -1), \"$2\", ss, -1), \"$3\", q.Get(\"wsTime\"), -1))\r\n\th.Reset()\r\n\th.Write([]byte(q.Get(\"fm\")))\r\n\tq.Set(\"wsSecret\", hex.EncodeToString(h.Sum(nil)))\r\n\tq.Del(\"fm\")\r\n\tif _, ok := q[\"txyp\"]; ok {\r\n\t\tq.Del(\"txyp\")\r\n\t}\r\n\treturn q.Encode()\r\n}\r\n\r\nfunc format(jsonStr string, uid int) map[string]any {\r\n\tcdnType := map[string]string{\"HY\": \"hycdn\", \"AL\": \"alicdn\", \"TX\": \"txcdn\", \"HW\": \"hwcdn\", \"HS\": \"hscdn\", \"WS\": \"wscdn\"}\r\n\tojsonStr := gjson.Get(jsonStr, \"roomInfo.tLiveInfo.tLiveStreamInfo.vStreamInfo\").String()\r\n\tfmt.Println(gjson.Get(ojsonStr, \"value\"))\r\n\tqreg := regexp.MustCompile(`(?i){\"_proto\"[\\s\\S]*?\"value\":([\\s\\S]*),\"_classname\"`)\r\n\tqres := qreg.FindStringSubmatch(ojsonStr)\r\n\tgjson.Parse(qres[1]).ForEach(func(_, value gjson.Result) bool {\r\n\t\tsFlvUrl := value.Get(\"sFlvUrl\").String()\r\n\t\tsFlvUrlSuffix := value.Get(\"sFlvUrlSuffix\").String()\r\n\t\tsHlsUrl := value.Get(\"sHlsUrl\").String()\r\n\t\tsHlsUrlSuffix := value.Get(\"sHlsUrlSuffix\").String()\r\n\t\tsStreamName := value.Get(\"sStreamName\").String()\r\n\t\tsCdnType := value.Get(\"sCdnType\").String()\r\n\t\tsFlvAntiCode := value.Get(\"sFlvAntiCode\").String()\r\n\t\tsHlsAntiCode := value.Get(\"sHlsAntiCode\").String()\r\n\t\tif sFlvUrl != \"\" {\r\n\t\t\tstreamInfo[\"flv\"].(map[string]string)[cdnType[sCdnType]] = sFlvUrl + \"/\" + sStreamName + \".\" + sFlvUrlSuffix + \"?\" + processAntiCode(sFlvAntiCode, uid, sStreamName)\r\n\t\t}\r\n\t\tif sHlsUrl != \"\" {\r\n\t\t\tstreamInfo[\"hls\"].(map[string]string)[cdnType[sCdnType]] = sHlsUrl + \"/\" + sStreamName + \".\" + sHlsUrlSuffix + \"?\" + processAntiCode(sHlsAntiCode, uid, sStreamName)\r\n\t\t}\r\n\t\treturn true\r\n\t})\r\n\treturn streamInfo\r\n}\r\n\r\nfunc (h *Huya) GetLiveUrl() any {\r\n\tliveurl := \"https://m.huya.com/\" + h.Rid\r\n\tclient := &http.Client{}\r\n\tr, _ := http.NewRequest(\"GET\", liveurl, nil)\r\n\tr.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\")\r\n\tr.Header.Add(\"Accept\", \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\")\r\n\tresp, _ := client.Do(r)\r\n\tdefer resp.Body.Close()\r\n\tbody, _ := io.ReadAll(resp.Body)\r\n\tstr := string(body)\r\n\tfreg := regexp.MustCompile(`(?i)<script>[\\s\\S]window.HNF_GLOBAL_INIT = ([\\s\\S]*?) </script>`)\r\n\tres := freg.FindStringSubmatch(str)\r\n\tif len(res) > 1 && !strings.Contains(res[1], \"\\\"exceptionType\\\":0\") {\r\n\t\tjsonStr := res[1]\r\n\t\tliveStatus := gjson.Get(jsonStr, \"roomInfo.eLiveStatus\").Int()\r\n\t\tvar mediaurl any\r\n\r\n\t\tif liveStatus == 2 {\r\n\t\t\trealurl := format(jsonStr, uid)\r\n\t\t\tif h.Type == \"display\" {\r\n\t\t\t\treturn realurl\r\n\t\t\t}\r\n\t\t\tfor k, v := range realurl {\r\n\t\t\t\tif k == h.Media {\r\n\t\t\t\t\tif urlarr, ok := v.(map[string]string); ok {\r\n\t\t\t\t\t\tfor k, v := range urlarr {\r\n\t\t\t\t\t\t\tif k == h.Cdn {\r\n\t\t\t\t\t\t\t\tmediaurl = strings.Replace(v, \"http://\", \"https://\", 1)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if liveStatus == 3 {\r\n\t\t\tliveLineUrl := gjson.Get(jsonStr, \"roomProfile.liveLineUrl\").String()\r\n\t\t\tif liveLineUrl != \"\" {\r\n\t\t\t\tdecodedLiveLineUrl, _ := base64.StdEncoding.DecodeString(liveLineUrl)\r\n\t\t\t\tmediaurl = \"https:\" + string(decodedLiveLineUrl)\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmediaurl = nil\r\n\t\t}\r\n\t\treturn mediaurl\r\n\t} else if strings.Contains(res[1], \"\\\"exceptionType\\\":0\") {\r\n\t\tvar h5info any\r\n\t\tostr, _ := getContent(\"https://www.huya.com/\" + h.Rid)\r\n\t\tnstr := string(ostr)\r\n\t\tlreg := regexp.MustCompile(`(?i)<script>[\\s\\S]*hyPlayerConfig =[\\s\\S]*stream: ([\\s\\S]*)};[\\s\\S]*window.TT_LIVE_TIMING`)\r\n\t\tlres := lreg.FindStringSubmatch(nstr)\r\n\t\tgjson.Get(lres[1], \"data\").ForEach(func(key, value gjson.Result) bool {\r\n\t\t\tif strings.Contains(value.String(), \"gameStreamInfoList\") {\r\n\t\t\t\tcdnType := map[string]string{\"HY\": \"hycdn\", \"AL\": \"alicdn\", \"TX\": \"txcdn\", \"HW\": \"hwcdn\", \"HS\": \"hscdn\", \"WS\": \"wscdn\"}\r\n\t\t\t\tgjson.Get(value.String(), \"gameStreamInfoList\").ForEach(func(_, value gjson.Result) bool {\r\n\t\t\t\t\tsFlvUrl := value.Get(\"sFlvUrl\").String()\r\n\t\t\t\t\tsFlvUrlSuffix := value.Get(\"sFlvUrlSuffix\").String()\r\n\t\t\t\t\tsHlsUrl := value.Get(\"sHlsUrl\").String()\r\n\t\t\t\t\tsHlsUrlSuffix := value.Get(\"sHlsUrlSuffix\").String()\r\n\t\t\t\t\tsStreamName := value.Get(\"sStreamName\").String()\r\n\t\t\t\t\tsCdnType := value.Get(\"sCdnType\").String()\r\n\t\t\t\t\tsFlvAntiCode := value.Get(\"sFlvAntiCode\").String()\r\n\t\t\t\t\tsHlsAntiCode := value.Get(\"sHlsAntiCode\").String()\r\n\t\t\t\t\tif sFlvUrl != \"\" {\r\n\t\t\t\t\t\tstreamInfo[\"flv\"].(map[string]string)[cdnType[sCdnType]] = sFlvUrl + \"/\" + sStreamName + \".\" + sFlvUrlSuffix + \"?\" + processAntiCode(sFlvAntiCode, uid, sStreamName)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif sHlsUrl != \"\" {\r\n\t\t\t\t\t\tstreamInfo[\"hls\"].(map[string]string)[cdnType[sCdnType]] = sHlsUrl + \"/\" + sStreamName + \".\" + sHlsUrlSuffix + \"?\" + processAntiCode(sHlsAntiCode, uid, sStreamName)\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true\r\n\t\t\t\t})\r\n\t\t\t\tif h.Type == \"display\" {\r\n\t\t\t\t\th5info = streamInfo\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor k, v := range streamInfo {\r\n\t\t\t\t\t\tif k == h.Media {\r\n\t\t\t\t\t\t\tif urlarr, ok := v.(map[string]string); ok {\r\n\t\t\t\t\t\t\t\tfor k, v := range urlarr {\r\n\t\t\t\t\t\t\t\t\tif k == h.Cdn {\r\n\t\t\t\t\t\t\t\t\t\th5info = strings.Replace(v, \"http://\", \"https://\", 1)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\t\t\treturn true\r\n\t\t})\r\n\t\treturn h5info\r\n\t}\r\n\r\n\treturn nil\r\n}"
  },
  {
    "path": "liveurls/itv.go",
    "content": "package liveurls\r\n\r\nimport (\r\n\t\"context\"\r\n\t\"io\"\r\n\t\"net\"\r\n\t\"net/http\"\r\n\t\"regexp\"\r\n\t\"strings\"\r\n\t\"sync\"\r\n\t\"time\"\r\n)\r\n\r\ntype Itv struct{}\r\n\r\nvar (\r\n\thostMappings = map[string]string{\r\n\t\t\"cache.ott.ystenlive.itv.cmvideo.cn\": \"feiyangdigital.tg.ystenlive.ottdns.com\",\r\n\t\t\"cache.ott.bestlive.itv.cmvideo.cn\":  \"feiyangdigital.tg.bestlive.ottdns.com\",\r\n\t\t\"cache.ott.wasulive.itv.cmvideo.cn\":  \"feiyangdigital.tg.wasulive.ottdns.com\",\r\n\t\t\"cache.ott.fifalive.itv.cmvideo.cn\":  \"feiyangdigital.tg.fifalive.ottdns.com\",\r\n\t\t\"cache.ott.hnbblive.itv.cmvideo.cn\":  \"feiyangdigital.tg.hnbblive.ottdns.com\",\r\n\t}\r\n\tprogramList = map[string]string{\r\n\t\t\"wasusyt/6000000001000029752.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000029752/1.m3u8?channel-id=wasusyt&Contentid=6000000001000029752&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000002226.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000002226/1.m3u8?channel-id=bestzb&Contentid=5000000004000002226&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265001.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265001/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265001&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000023315.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000023315/1.m3u8?channel-id=ystenlive&Contentid=1000000001000023315&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000014161.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000014161/1.m3u8?channel-id=wasusyt&Contentid=6000000001000014161&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000022313.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000022313/1.m3u8?channel-id=wasusyt&Contentid=6000000001000022313&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265003.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265003/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265003&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031102.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031102/1.m3u8?channel-id=bestzb&Contentid=5000000011000031102&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265004.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265004/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265004&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000025222.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000025222/1.m3u8?channel-id=ystenlive&Contentid=1000000005000025222&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265005.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265005/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265005&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000015875.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000015875/1.m3u8?channel-id=wasusyt&Contentid=6000000001000015875&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265016.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265016/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265016&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000001737.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000001737/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001737&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000004574.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000004574/1.m3u8?channel-id=wasusyt&Contentid=6000000001000004574&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265006.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265006/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265006&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000024341.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000024341/1.m3u8?channel-id=ystenlive&Contentid=1000000001000024341&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000009055.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000009055/1.m3u8?channel-id=wasusyt&Contentid=6000000001000009055&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265007.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265007/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265007&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000001070.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000001070/1.m3u8?channel-id=wasusyt&Contentid=6000000001000001070&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265008.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265008/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265008&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000014583.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000014583/1.m3u8?channel-id=ystenlive&Contentid=1000000001000014583&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000032162.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000032162/1.m3u8?channel-id=wasusyt&Contentid=6000000001000032162&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265009.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265009/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265009&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000023734.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000023734/1.m3u8?channel-id=ystenlive&Contentid=1000000001000023734&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000012827.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000012827/1.m3u8?channel-id=bestzb&Contentid=5000000004000012827&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265010.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265010/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265010&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031106.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031106/1.m3u8?channel-id=bestzb&Contentid=5000000011000031106&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265011.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265011/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265011&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000032494.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000032494/1.m3u8?channel-id=ystenlive&Contentid=1000000001000032494&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000022586.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000022586/1.m3u8?channel-id=wasusyt&Contentid=6000000001000022586&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265012.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265012/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265012&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031108.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031108/1.m3u8?channel-id=bestzb&Contentid=5000000011000031108&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000008170.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000008170/1.m3u8?channel-id=ystenlive&Contentid=1000000001000008170&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000006673.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000006673/1.m3u8?channel-id=bestzb&Contentid=5000000004000006673&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265013.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265013/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265013&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031109.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031109/1.m3u8?channel-id=bestzb&Contentid=5000000011000031109&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265014.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265014/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265014&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000006000233002.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000006000233002/1.m3u8?channel-id=ystenlive&Contentid=1000000006000233002&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000008000023254.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000008000023254/1.m3u8?channel-id=bestzb&Contentid=5000000008000023254&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000006000268004.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000006000268004/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268004&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265015.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265015/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265015&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/7745129417417101820.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/7745129417417101820/1.m3u8?channel-id=hnbblive&Contentid=7745129417417101820&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/7114647837765104058.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/7114647837765104058/1.m3u8?channel-id=hnbblive&Contentid=7114647837765104058&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000002000002652.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000002000002652/1.m3u8?channel-id=bestzb&Contentid=5000000002000002652&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031126.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031126/1.m3u8?channel-id=bestzb&Contentid=5000000011000031126&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000020451.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000020451/1.m3u8?channel-id=wasusyt&Contentid=6000000001000020451&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265027.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265027/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265027&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000001910.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000001910/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001910&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265020.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265020/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265020&livemode=1&stbId=3\",\r\n\t\t\"bestzb/7851974109718180595.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/7851974109718180595/1.m3u8?channel-id=bestzb&Contentid=7851974109718180595&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000030159.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000030159/1.m3u8?channel-id=ystenlive&Contentid=1000000001000030159&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000009954.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000009954/1.m3u8?channel-id=wasusyt&Contentid=6000000001000009954&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265025.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265025/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265025&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000010584.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000010584/1.m3u8?channel-id=bestzb&Contentid=5000000004000010584&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265033.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265033/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265033&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031121.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031121/1.m3u8?channel-id=bestzb&Contentid=5000000011000031121&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000014176.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000014176/1.m3u8?channel-id=ystenlive&Contentid=1000000001000014176&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000031076.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000031076/1.m3u8?channel-id=wasusyt&Contentid=6000000001000031076&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265034.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265034/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265034&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031118.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031118/1.m3u8?channel-id=bestzb&Contentid=5000000011000031118&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000025843.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000025843/1.m3u8?channel-id=bestzb&Contentid=5000000004000025843&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000006211.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000006211/1.m3u8?channel-id=bestzb&Contentid=5000000004000006211&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000006000040016.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000006000040016/1.m3u8?channel-id=bestzb&Contentid=5000000006000040016&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031119.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031119/1.m3u8?channel-id=bestzb&Contentid=5000000011000031119&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000001925.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000001925/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001925&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000016510.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000016510/1.m3u8?channel-id=wasusyt&Contentid=6000000001000016510&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265029.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265029/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265029&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000024621.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000024621/1.m3u8?channel-id=ystenlive&Contentid=1000000001000024621&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000015436.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000015436/1.m3u8?channel-id=wasusyt&Contentid=6000000001000015436&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265023.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265023/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265023&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000006692.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000006692/1.m3u8?channel-id=bestzb&Contentid=5000000004000006692&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000018044.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000018044/1.m3u8?channel-id=wasusyt&Contentid=6000000001000018044&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265024.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265024/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265024&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031203.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031203/1.m3u8?channel-id=bestzb&Contentid=5000000011000031203&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031206.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031206/1.m3u8?channel-id=bestzb&Contentid=5000000011000031206&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031209.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031209/1.m3u8?channel-id=bestzb&Contentid=5000000011000031209&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031117.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031117/1.m3u8?channel-id=bestzb&Contentid=5000000011000031117&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000014861.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000014861/1.m3u8?channel-id=wasusyt&Contentid=6000000001000014861&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000001828.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000001828/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001828&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265030.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265030/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265030&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000006000268001.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000006000268001/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268001&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265032.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265032/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265032&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000011671.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000011671/1.m3u8?channel-id=bestzb&Contentid=5000000004000011671&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265022.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265022/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265022&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000002000013359.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000002000013359/1.m3u8?channel-id=ystenlive&Contentid=1000000002000013359&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000016568.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000016568/1.m3u8?channel-id=ystenlive&Contentid=1000000001000016568&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000004134.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000004134/1.m3u8?channel-id=wasusyt&Contentid=6000000001000004134&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265019.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265019/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265019&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000003639.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000003639/1.m3u8?channel-id=wasusyt&Contentid=6000000001000003639&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000014098.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000014098/1.m3u8?channel-id=bestzb&Contentid=5000000004000014098&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265018.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265018/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265018&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000010000030951.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000010000030951/1.m3u8?channel-id=bestzb&Contentid=5000000010000030951&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000010000027146.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000010000027146/1.m3u8?channel-id=bestzb&Contentid=5000000010000027146&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000007000010003.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000007000010003/1.m3u8?channel-id=bestzb&Contentid=5000000007000010003&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000010000032212.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000010000032212/1.m3u8?channel-id=bestzb&Contentid=5000000010000032212&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000010000018926.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000010000018926/1.m3u8?channel-id=bestzb&Contentid=5000000010000018926&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000002000000014.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000002000000014/1.m3u8?channel-id=hnbblive&Contentid=2000000002000000014&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031123.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031123/1.m3u8?channel-id=bestzb&Contentid=5000000011000031123&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000010282.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000010282/1.m3u8?channel-id=bestzb&Contentid=5000000004000010282&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265021.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265021/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265021&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000010000017540.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000010000017540/1.m3u8?channel-id=bestzb&Contentid=5000000010000017540&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031110.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031110/1.m3u8?channel-id=bestzb&Contentid=5000000011000031110&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000007410.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000007410/1.m3u8?channel-id=bestzb&Contentid=5000000004000007410&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000002116.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000002116/1.m3u8?channel-id=wasusyt&Contentid=6000000001000002116&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265028.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265028/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265028&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000006119.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000006119/1.m3u8?channel-id=bestzb&Contentid=5000000004000006119&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000006827.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000006827/1.m3u8?channel-id=bestzb&Contentid=5000000004000006827&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000001000009186.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000001000009186/1.m3u8?channel-id=wasusyt&Contentid=6000000001000009186&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265026.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265026/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265026&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031120.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031120/1.m3u8?channel-id=bestzb&Contentid=5000000011000031120&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000004000007275.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000004000007275/1.m3u8?channel-id=bestzb&Contentid=5000000004000007275&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000014260.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000014260/1.m3u8?channel-id=ystenlive&Contentid=1000000001000014260&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265031.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265031/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265031&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000001096.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000001096/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001096&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000265017.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000265017/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265017&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000003000004748.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000003000004748/1.m3u8?channel-id=wasusyt&Contentid=6000000003000004748&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000011651.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000011651/1.m3u8?channel-id=ystenlive&Contentid=1000000004000011651&livemode=1&stbId=3\",\r\n\t\t\"FifastbLive/3000000010000005180.m3u8\": \"http://gslbserv.itv.cmvideo.cn:80/3000000010000005180/1.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=3\",\r\n\t\t\"FifastbLive/3000000010000015686.m3u8\": \"http://gslbserv.itv.cmvideo.cn:80/3000000010000015686/1.m3u8?channel-id=FifastbLive&Contentid=3000000010000015686&livemode=1&stbId=3\",\r\n\t\t\"FifastbLive/3000000020000031315.m3u8\": \"http://gslbserv.itv.cmvideo.cn:80/3000000020000031315/1.m3u8?channel-id=FifastbLive&Contentid=3000000020000031315&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000002000010046.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000002000010046/1.m3u8?channel-id=wasusyt&Contentid=6000000002000010046&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000002000032052.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000002000032052/1.m3u8?channel-id=wasusyt&Contentid=6000000002000032052&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000002000032344.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000002000032344/1.m3u8?channel-id=wasusyt&Contentid=6000000002000032344&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000002000003382.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000002000003382/1.m3u8?channel-id=wasusyt&Contentid=6000000002000003382&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000019008.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000019008/1.m3u8?channel-id=ystenlive&Contentid=1000000004000019008&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000013968.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000013968/1.m3u8?channel-id=ystenlive&Contentid=1000000004000013968&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000013730.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000013730/1.m3u8?channel-id=ystenlive&Contentid=1000000004000013730&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000014634.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000014634/1.m3u8?channel-id=ystenlive&Contentid=1000000004000014634&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000006000032328.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000006000032328/1.m3u8?channel-id=ystenlive&Contentid=1000000006000032328&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000010.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000010/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000010&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000006000268003.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000006000268003/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268003&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000003000012426.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000003000012426/1.m3u8?channel-id=ystenlive&Contentid=1000000003000012426&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000009601.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000009601/1.m3u8?channel-id=ystenlive&Contentid=1000000001000009601&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000006000268002.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000006000268002/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268002&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000018.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000018/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000018&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000266013.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000266013/1.m3u8?channel-id=ystenlive&Contentid=1000000005000266013&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000018653.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000018653/1.m3u8?channel-id=ystenlive&Contentid=1000000004000018653&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000024.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000024/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000024&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000266012.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000266012/1.m3u8?channel-id=ystenlive&Contentid=1000000005000266012&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000008284.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000008284/1.m3u8?channel-id=ystenlive&Contentid=1000000004000008284&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000026167.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000026167/1.m3u8?channel-id=ystenlive&Contentid=1000000004000026167&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000024282.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000024282/1.m3u8?channel-id=ystenlive&Contentid=1000000004000024282&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000014.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000014/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000014&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000022.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000022/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000022&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000006197.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000006197/1.m3u8?channel-id=ystenlive&Contentid=1000000001000006197&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000016.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000016/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000016&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000003.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000003/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000003&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000007.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000007/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000007&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000000515.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000000515/1.m3u8?channel-id=ystenlive&Contentid=1000000001000000515&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000005000266011.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000005000266011/1.m3u8?channel-id=ystenlive&Contentid=1000000005000266011&livemode=1&stbId=3\",\r\n\t\t\"hnbblive/2000000003000000009.m3u8\":    \"http://gslbserv.itv.cmvideo.cn:80/2000000003000000009/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000009&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000019624.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000019624/1.m3u8?channel-id=ystenlive&Contentid=1000000004000019624&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000004000021734.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000004000021734/1.m3u8?channel-id=ystenlive&Contentid=1000000004000021734&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000006000032327.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000006000032327/1.m3u8?channel-id=ystenlive&Contentid=1000000006000032327&livemode=1&stbId=3\",\r\n\t\t\"ystenlive/1000000001000003775.m3u8\":   \"http://gslbserv.itv.cmvideo.cn:80/1000000001000003775/1.m3u8?channel-id=ystenlive&Contentid=1000000001000003775&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031113.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031113/1.m3u8?channel-id=bestzb&Contentid=5000000011000031113&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031111.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031111/1.m3u8?channel-id=bestzb&Contentid=5000000011000031111&livemode=1&stbId=3\",\r\n\t\t\"bestzb/9001547084732463424.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/9001547084732463424/1.m3u8?channel-id=bestzb&Contentid=9001547084732463424&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000002000009455.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000002000009455/1.m3u8?channel-id=bestzb&Contentid=5000000002000009455&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000007000010001.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000007000010001/1.m3u8?channel-id=bestzb&Contentid=5000000007000010001&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000010000026105.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000010000026105/1.m3u8?channel-id=bestzb&Contentid=5000000010000026105&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000002000029972.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000002000029972/1.m3u8?channel-id=bestzb&Contentid=5000000002000029972&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031112.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031112/1.m3u8?channel-id=bestzb&Contentid=5000000011000031112&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031207.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031207/1.m3u8?channel-id=bestzb&Contentid=5000000011000031207&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031116.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031116/1.m3u8?channel-id=bestzb&Contentid=5000000011000031116&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000002000019634.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000002000019634/1.m3u8?channel-id=bestzb&Contentid=5000000002000019634&livemode=1&stbId=3\",\r\n\t\t\"bestzb/5000000011000031114.m3u8\":      \"http://gslbserv.itv.cmvideo.cn:80/5000000011000031114/1.m3u8?channel-id=bestzb&Contentid=5000000011000031114&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000230630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000230630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000230630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000070630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000070630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000070630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000280630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000280630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000280630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000080630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000080630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000080630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000260630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000260630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000260630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000060630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000060630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000060630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000020630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000020630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000020630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000160630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000160630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000160630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000040630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000040630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000040630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000150630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000150630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000150630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000250630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000250630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000250630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000270630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000270630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000270630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000100630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000100630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000100630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000240630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000240630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000240630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000290630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000290630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000290630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000220630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000220630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000220630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000010630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000010630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000010630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000050630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000050630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000050630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000180630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000180630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000180630&livemode=1&stbId=3\",\r\n\t\t\"wasusyt/6000000006000030630.m3u8\":     \"http://gslbserv.itv.cmvideo.cn:80/6000000006000030630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000030630&livemode=1&stbId=3\",\r\n\t}\r\n\r\n\tdnsCache         = sync.Map{}\r\n\tsuccessCacheTime = 24 * time.Hour\r\n)\r\n\r\ntype cacheEntry struct {\r\n\tip     string\r\n\texpiry time.Time\r\n}\r\n\r\nfunc (i *Itv) HandleMainRequest(w http.ResponseWriter, r *http.Request, cdn string, id string) {\r\n\tkey := cdn + \"/\" + id\r\n\tstartUrl, ok := programList[key]\r\n\tif !ok {\r\n\t\thttp.Error(w, \"id not found!\", http.StatusNotFound)\r\n\t\treturn\r\n\t}\r\n\r\n\tdata, redirectURL, err := getHTTPResponse(startUrl)\r\n\tif err != nil {\r\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\r\n\t\treturn\r\n\t}\r\n\tredirectPrefix := redirectURL[:strings.LastIndex(redirectURL, \"/\")+1]\r\n\r\n\t// 替换TS文件的链接\r\n\tgolang := \"http://\" + r.Host + r.URL.Path\r\n\tre := regexp.MustCompile(`((?i).*?\\.ts)`)\r\n\tdata = re.ReplaceAllStringFunc(data, func(match string) string {\r\n\t\treturn golang + \"?ts=\" + redirectPrefix + match\r\n\t})\r\n\r\n\t// 将&替换为$\r\n\tdata = strings.ReplaceAll(data, \"&\", \"$\")\r\n\r\n\tw.Header().Set(\"Content-Disposition\", \"attachment;filename=\"+id)\r\n\tw.WriteHeader(http.StatusOK) // Set the status code to 200\r\n    w.Write([]byte(data)) // Write the response body\r\n}\r\n\r\nfunc (i *Itv) HandleTsRequest(w http.ResponseWriter, ts string) {\r\n\t// 将$替换回&\r\n\tts = strings.ReplaceAll(ts, \"$\", \"&\")\r\n\r\n\tw.Header().Set(\"Content-Type\", \"video/MP2T\")\r\n\tcontent, _, err := getHTTPResponse(ts)\r\n\tif err != nil {\r\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\r\n\t\treturn\r\n\t}\r\n\tw.WriteHeader(http.StatusOK) // Set the status code to 200\r\n    w.Write([]byte(content)) // Write the response body\r\n}\r\n\r\nfunc getHTTPResponse(requestURL string) (string, string, error) {\r\n\tdialer := &net.Dialer{\r\n\t\tTimeout: 5 * time.Second,\r\n\t}\r\n\r\n\tvar mappedHost string\r\n\r\n\t// 自定义resolver\r\n\tresolver := net.Resolver{\r\n\t\tPreferGo: true,\r\n\t\tDial: func(ctx context.Context, network, address string) (net.Conn, error) {\r\n\t\t\tfor originalHost, host := range hostMappings {\r\n\t\t\t\tif strings.Contains(address, originalHost) {\r\n\t\t\t\t\tip := resolveIP(host)\r\n\t\t\t\t\tmappedHost = host\r\n\t\t\t\t\tif ip != \"\" {\r\n\t\t\t\t\t\taddress = strings.Replace(address, originalHost, ip, 1)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn dialer.DialContext(ctx, network, address)\r\n\t\t},\r\n\t}\r\n\r\n\tclient := &http.Client{\r\n\t\tTransport: &http.Transport{\r\n\t\t\tDialContext: resolver.Dial,\r\n\t\t},\r\n\t}\r\n\r\n\tresp, err := client.Get(requestURL)\r\n\tif err != nil {\r\n\t\tif mappedHost != \"\" {\r\n\t\t\tclearCache(mappedHost) // 清除缓存失败的IP\r\n\t\t}\r\n\t\treturn \"\", \"\", err\r\n\t}\r\n\tdefer resp.Body.Close()\r\n\r\n\tif resp.StatusCode != http.StatusOK {\r\n\t\tif mappedHost != \"\" {\r\n\t\t\tclearCache(mappedHost) // 请求失败清除缓存\r\n\t\t}\r\n\t\treturn \"\", \"\", err\r\n\t}\r\n\r\n\tredirectURL := resp.Header.Get(\"Location\")\r\n\tif redirectURL == \"\" {\r\n\t\tredirectURL = requestURL\r\n\t}\r\n\r\n\tbody, err := readResponseBody(resp)\r\n\tif err != nil {\r\n\t\tif mappedHost != \"\" {\r\n\t\t\tclearCache(mappedHost) // 读取响应体失败时清除缓存\r\n\t\t}\r\n\t\treturn \"\", \"\", err\r\n\t}\r\n\r\n\tif mappedHost != \"\" {\r\n\t\tupdateCacheTime(mappedHost, successCacheTime) // 成功获取响应后缓存IP\r\n\t}\r\n\r\n\treturn body, redirectURL, nil\r\n}\r\n\r\nfunc resolveIP(host string) string {\r\n\tnow := time.Now()\r\n\tif entry, found := dnsCache.Load(host); found {\r\n\t\tcachedEntry := entry.(cacheEntry)\r\n\t\tif now.Before(cachedEntry.expiry) {\r\n\t\t\treturn cachedEntry.ip // 使用缓存中的IP\r\n\t\t}\r\n\t\tdnsCache.Delete(host) // 缓存过期，删除\r\n\t}\r\n\r\n\tips, err := net.LookupIP(host) // DNS解析\r\n\tif err != nil || len(ips) == 0 {\r\n\t\treturn \"\" // 解析失败，返回空字符串\r\n\t}\r\n\r\n\tip := ips[0].String()\r\n\tdnsCache.Store(host, cacheEntry{ip: ip, expiry: now.Add(successCacheTime)}) // 缓存解析到的IP\r\n\treturn ip\r\n}\r\n\r\nfunc updateCacheTime(host string, duration time.Duration) {\r\n\tif entry, found := dnsCache.Load(host); found {\r\n\t\tcachedEntry := entry.(cacheEntry)\r\n\t\tcachedEntry.expiry = time.Now().Add(duration) // 更新缓存过期时间\r\n\t\tdnsCache.Store(host, cachedEntry)\r\n\t}\r\n}\r\n\r\nfunc clearCache(host string) {\r\n\tdnsCache.Delete(host) // 删除缓存\r\n}\r\n\r\nfunc readResponseBody(resp *http.Response) (string, error) {\r\n\tvar builder strings.Builder\r\n\t_, err := io.Copy(&builder, resp.Body)\r\n\tif err != nil {\r\n\t\treturn \"\", err\r\n\t}\r\n\treturn builder.String(), nil\r\n}"
  },
  {
    "path": "liveurls/youtube.go",
    "content": "// Package liveurls\r\n// @Time:2023/02/17 16:32\r\n// @File:youtube.go\r\n// @SoftWare:Goland\r\n// @Author:Popeye\r\n// @Contact:TG@popeyelau\r\n\r\npackage liveurls\r\n\r\nimport (\r\n\t\"bytes\"\r\n\t\"fmt\"\r\n\t\"github.com/tidwall/gjson\"\r\n\t\"io\"\r\n\t\"net/http\"\r\n\t\"strconv\"\r\n\t\"sync\"\r\n\t\"time\"\r\n\r\n\t\"github.com/etherlabsio/go-m3u8/m3u8\"\r\n)\r\n\r\nvar streamCachedMap sync.Map\r\n\r\ntype Youtube struct {\r\n\t//https://www.youtube.com/watch?v=cK4LemjoFd0\r\n\t//Rid: cK4LemjoFd0\r\n\tRid     string\r\n\tQuality string\r\n}\r\n\r\nfunc (y *Youtube) GetLiveUrl() any {\r\n\tif cached, ok := getKey(y.Rid); ok {\r\n\t\treturn cached\r\n\t}\r\n\t//proxyUrl, err := url.Parse(\"http://127.0.0.1:8888\")\r\n\tclient := &http.Client{\r\n\t\tTimeout: time.Second * 5,\r\n\t\tCheckRedirect: func(req *http.Request, via []*http.Request) error {\r\n\t\t\treturn http.ErrUseLastResponse\r\n\t\t},\r\n\t\t//Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)},\r\n\t}\r\n\r\n\tjson := []byte(fmt.Sprintf(`{\"context\": {\"client\": {\"hl\": \"zh\",\"clientVersion\": \"2.20201021.03.00\",\"clientName\": \"WEB\"}},\"videoId\": \"%s\"}`, y.Rid))\r\n\treqBody := bytes.NewBuffer(json)\r\n\tr, _ := http.NewRequest(\"POST\", \"https://www.youtube.com/youtubei/v1/player\", reqBody)\r\n\tr.Header.Add(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\")\r\n\tresp, err := client.Do(r)\r\n\tif err != nil {\r\n\t\treturn err\r\n\t}\r\n\tdefer resp.Body.Close()\r\n\tbody, _ := io.ReadAll(resp.Body)\r\n\tstr := string(body)\r\n\r\n\tstream := gjson.Get(str, \"streamingData.hlsManifestUrl\")\r\n\tif stream.Exists() && len(stream.String()) > 0 {\r\n\t\tquality := y.getResolution(stream.String())\r\n\t\tif quality != nil {\r\n\t\t\treturn *quality\r\n\t\t}\r\n\t\treturn stream\r\n\t}\r\n\r\n\tformats := gjson.Get(str, \"streamingData.formats\")\r\n\tif formats.Exists() && formats.IsArray() {\r\n\t\tarr := formats.Array()\r\n\t\tplayback := arr[len(arr)-1].Get(\"url\").String()\r\n\t\treturn playback\r\n\t}\r\n\r\n\treturn nil\r\n}\r\n\r\nfunc (y *Youtube) getResolution(liveurl string) *string {\r\n\tclient := &http.Client{Timeout: time.Second * 5}\r\n\tr, _ := http.NewRequest(\"GET\", liveurl, nil)\r\n\tr.Header.Add(\"user-agent\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\")\r\n\tresp, err := client.Do(r)\r\n\tif err != nil {\r\n\t\treturn nil\r\n\t}\r\n\tplaylist, err := m3u8.Read(resp.Body)\r\n\tdefer resp.Body.Close()\r\n\tif err != nil {\r\n\t\treturn nil\r\n\t}\r\n\r\n\tplaylists := playlist.Playlists()\r\n\r\n\tif len(playlists) < 1 {\r\n\t\treturn nil\r\n\t}\r\n\r\n\tmapping := map[string]string{}\r\n\tfor _, item := range playlists {\r\n\t\tmapping[strconv.Itoa(item.Resolution.Height)] = item.URI\r\n\t}\r\n\r\n\tif stream, ok := mapping[y.Quality]; ok {\r\n\t\tsetKey(y.Rid, stream, 600)\r\n\t\treturn &stream\r\n\t}\r\n\r\n\tstream := playlists[len(playlists)-1].URI\r\n\tsetKey(y.Rid, stream, 600)\r\n\treturn &stream\r\n}\r\n\r\nfunc setKey(key string, data interface{}, timeout int) {\r\n\tstreamCachedMap.Store(key, data)\r\n\ttime.AfterFunc(time.Second*time.Duration(timeout), func() {\r\n\t\tstreamCachedMap.Delete(key)\r\n\t})\r\n}\r\n\r\nfunc getKey(key string) (interface{}, bool) {\r\n\treturn streamCachedMap.Load(key)\r\n}"
  },
  {
    "path": "liveurls/ysptp.go",
    "content": "package liveurls\r\n\r\nimport (\r\n\t\"Golang/utils\"\r\n\t\"encoding/json\"\r\n\t\"io\"\r\n\t\"net/http\"\r\n\t\"regexp\"\r\n\t\"strings\"\r\n\t\"sync\"\r\n\t\"time\"\r\n)\r\n\r\ntype Ysptp struct{}\r\n\r\nvar cache sync.Map\r\n\r\ntype CacheItem struct {\r\n\tValue      string\r\n\tExpiration int64\r\n}\r\n\r\nvar cctvList = map[string]string{\r\n\t\"cctv1.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv1.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv2.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv2.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv3.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv3.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv4.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv4.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv5.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv5.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv5p.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv5p.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv6.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv6.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv7.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv7.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv8.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv8.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv9.m3u8\":        \"http://liveali-tpgq.cctv.cn/live/cctv9.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv10.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv10.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv11.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv11.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv12.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv12.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv13.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv13.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv14.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv14.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv15.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv15.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv16.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv16.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv17.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv17.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cgtnar.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cgtnar.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cgtndoc.m3u8\":      \"http://liveali-tpgq.cctv.cn/live/cgtndoc.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cgtnen.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cgtnen.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cgtnfr.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cgtnfr.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cgtnru.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cgtnru.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cgtnsp.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cgtnsp.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv4k.m3u8\":       \"http://liveali-tpgq.cctv.cn/live/cctv4k.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv4k_10m.m3u8\":   \"http://liveali-tpgq.cctv.cn/live/cctv4k10m.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv4k16.m3u8\":     \"http://liveali-tpgq.cctv.cn/live/cctv4k16.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv4k16_10m.m3u8\": \"http://liveali-tpgq.cctv.cn/live/cctv4k1610m.m3u8,http://liveali-tpgq.cctv.cn/live/\",\r\n\t\"cctv8k_36m.m3u8\":   \"http://liveali-tp4k.cctv.cn/live/4K36M/playlist.m3u8,http://liveali-tp4k.cctv.cn/live/4K36M/\",\r\n\t\"cctv8k_120m.m3u8\":  \"http://liveali-tp4k.cctv.cn/live/8K120M/playlist.m3u8,http://liveali-tp4k.cctv.cn/live/8K120M/\",\r\n}\r\n\r\nfunc (y *Ysptp) HandleMainRequest(w http.ResponseWriter, r *http.Request, id string) {\r\n\tuid := utils.DefaultQuery(r, \"uid\", \"1234123122\")\r\n\r\n\tif _, ok := cctvList[id]; !ok {\r\n\t\thttp.Error(w, \"id not found!\", http.StatusNotFound)\r\n\t\treturn\r\n\t}\r\n\r\n\turls := strings.Split(cctvList[id], \",\")\r\n\tdata := getURL(id, urls[0], uid, urls[1])\r\n\tgolang := \"http://\" + r.Host + r.URL.Path\r\n\tre := regexp.MustCompile(`((?i).*?\\.ts)`)\r\n\tdata = re.ReplaceAllString(data, golang+\"?ts=\"+urls[1]+\"$1\")\r\n\r\n\tw.Header().Set(\"Content-Disposition\", \"attachment;filename=\"+id)\r\n\tw.WriteHeader(http.StatusOK) // Set the status code to 200\r\n    w.Write([]byte(data)) // Write the response body\r\n}\r\n\r\nfunc (y *Ysptp) HandleTsRequest(w http.ResponseWriter, ts, wsTime string) {\r\n\tdata := ts + \"&wsTime=\" + wsTime\r\n\tw.Header().Set(\"Content-Type\", \"video/MP2T\")\r\n\tw.WriteHeader(http.StatusOK) // Set the status code to 200\r\n    w.Write([]byte(getTs(data))) // Write the response body\r\n}\r\n\r\nfunc getURL(id, url, uid, path string) string {\r\n\tcacheKey := id + uid\r\n\tif playURL, found := getCache(cacheKey); found {\r\n\t\treturn fetchData(playURL, path, uid)\r\n\t}\r\n\r\n\tbstrURL := \"https://ytpvdn.cctv.cn/cctvmobileinf/rest/cctv/videoliveUrl/getstream\"\r\n\tpostData := `appcommon={\"ap\":\"cctv_app_tv\",\"an\":\"央视投屏助手\",\"adid\":\" ` + uid + `\",\"av\":\"1.1.7\"}&url=` + url\r\n\r\n\treq, _ := http.NewRequest(\"POST\", bstrURL, strings.NewReader(postData))\r\n\treq.Header.Set(\"User-Agent\", \"cctv_app_tv\")\r\n\treq.Header.Set(\"Referer\", \"api.cctv.cn\")\r\n\treq.Header.Set(\"UID\", uid)\r\n\r\n\tclient := &http.Client{}\r\n\tresp, _ := client.Do(req)\r\n\tdefer resp.Body.Close()\r\n\tvar body strings.Builder\r\n\t_, _ = io.Copy(&body, resp.Body)\r\n\r\n\tvar result map[string]interface{}\r\n\tjson.Unmarshal([]byte(body.String()), &result)\r\n\tplayURL := result[\"url\"].(string)\r\n\r\n\tsetCache(cacheKey, playURL)\r\n\r\n\treturn fetchData(playURL, path, uid)\r\n}\r\n\r\nfunc fetchData(playURL, path, uid string) string {\r\n\tclient := &http.Client{}\r\n\tfor {\r\n\t\treq, _ := http.NewRequest(\"GET\", playURL, nil)\r\n\t\treq.Header.Set(\"User-Agent\", \"cctv_app_tv\")\r\n\t\treq.Header.Set(\"Referer\", \"api.cctv.cn\")\r\n\t\treq.Header.Set(\"UID\", uid)\r\n\r\n\t\tresp, _ := client.Do(req)\r\n\t\tdefer resp.Body.Close()\r\n\t\tvar body strings.Builder\r\n\t\t_, _ = io.Copy(&body, resp.Body)\r\n\r\n\t\tdata := body.String()\r\n\t\tre := regexp.MustCompile(`(.*\\.m3u8\\?.*)`)\r\n\t\tmatches := re.FindStringSubmatch(data)\r\n\t\tif len(matches) > 0 {\r\n\t\t\tplayURL = path + matches[0]\r\n\t\t} else {\r\n\t\t\treturn data\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunc getTs(url string) string {\r\n\treq, _ := http.NewRequest(\"GET\", url, nil)\r\n\treq.Header.Set(\"User-Agent\", \"cctv_app_tv\")\r\n\treq.Header.Set(\"Referer\", \"https://api.cctv.cn/\")\r\n\treq.Header.Set(\"UID\", \"1234123122\")\r\n\treq.Header.Set(\"accept\", \"*/*\")\r\n\treq.Header.Set(\"accept-encoding\", \"gzip, deflate\")\r\n\treq.Header.Set(\"accept-language\", \"zh-CN,zh;q=0.9\")\r\n\treq.Header.Set(\"Connection\", \"keep-alive\")\r\n\r\n\tclient := &http.Client{}\r\n\tresp, _ := client.Do(req)\r\n\tdefer resp.Body.Close()\r\n\tvar body strings.Builder\r\n\t_, _ = io.Copy(&body, resp.Body)\r\n\r\n\treturn body.String()\r\n}\r\n\r\nfunc getCache(key string) (string, bool) {\r\n\tif item, found := cache.Load(key); found {\r\n\t\tcacheItem := item.(CacheItem)\r\n\t\tif time.Now().Unix() < cacheItem.Expiration {\r\n\t\t\treturn cacheItem.Value, true\r\n\t\t}\r\n\t}\r\n\treturn \"\", false\r\n}\r\n\r\nfunc setCache(key, value string) {\r\n\tcache.Store(key, CacheItem{\r\n\t\tValue:      value,\r\n\t\tExpiration: time.Now().Unix() + 3600,\r\n\t})\r\n}"
  },
  {
    "path": "liveurls/yy.go",
    "content": "// Package liveurls\r\n// @Time:2023/06/03 05:40\r\n// @File:yy.go\r\n// @SoftWare:Goland\r\n// @Author:feiyang\r\n// @Contact:TG@feiyangdigital\r\n\r\npackage liveurls\r\n\r\nimport (\r\n\t\"bytes\"\r\n\t\"encoding/json\"\r\n\t\"fmt\"\r\n\t\"io\"\r\n\t\"net/http\"\r\n\t\"regexp\"\r\n\t\"strconv\"\r\n\t\"time\"\r\n)\r\n\r\ntype Yy struct {\r\n\tRid     string\r\n\tQuality string\r\n}\r\n\r\ntype StreamLineAddr struct {\r\n\tCdnInfo struct {\r\n\t\tUrl string `json:\"url\"`\r\n\t} `json:\"cdn_info\"`\r\n}\r\n\r\ntype Result struct {\r\n\tAvpInfoRes struct {\r\n\t\tStreamLineAddr map[string]StreamLineAddr `json:\"stream_line_addr\"`\r\n\t} `json:\"avp_info_res\"`\r\n}\r\n\r\nfunc (y *Yy) GetLiveUrl() any {\r\n\tfirstrid := y.Rid\r\n\tquality := y.Quality\r\n\tvar rid string\r\n\tcheckUrl := \"https://wap.yy.com/mobileweb/\" + firstrid\r\n\tclient := &http.Client{}\r\n\treq, _ := http.NewRequest(\"GET\", checkUrl, nil)\r\n\treq.Header.Set(\"Referer\", \"https://wap.yy.com\")\r\n\treq.Header.Set(\"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\")\r\n\tres, _ := client.Do(req)\r\n\tdefer res.Body.Close()\r\n\tbody, _ := io.ReadAll(res.Body)\r\n\tre := regexp.MustCompile(`md5Hash[\\s\\S]*?sid.*'(.*)'.*?getQuery`)\r\n\trealdata := re.FindStringSubmatch(string(body))\r\n\r\n\tif len(realdata) > 0 {\r\n\t\trid = realdata[1]\r\n\t} else {\r\n\t\treturn nil\r\n\t}\r\n\tmillis_13 := time.Now().UnixNano() / int64(time.Millisecond)\r\n\tmillis_10 := time.Now().Unix()\r\n\tdata := fmt.Sprintf(`{\"head\":{\"seq\":%d,\"appidstr\":\"0\",\"bidstr\":\"0\",\"cidstr\":\"%s\",\"sidstr\":\"%s\",\"uid64\":0,\"client_type\":108,\"client_ver\":\"5.14.13\",\"stream_sys_ver\":1,\"app\":\"yylive_web\",\"playersdk_ver\":\"5.14.13\",\"thundersdk_ver\":\"0\",\"streamsdk_ver\":\"5.14.13\"},\"client_attribute\":{\"client\":\"web\",\"model\":\"\",\"cpu\":\"\",\"graphics_card\":\"\",\"os\":\"chrome\",\"osversion\":\"118.0.0.0\",\"vsdk_version\":\"\",\"app_identify\":\"\",\"app_version\":\"\",\"business\":\"\",\"width\":\"1728\",\"height\":\"1117\",\"scale\":\"\",\"client_type\":8,\"h265\":0},\"avp_parameter\":{\"version\":1,\"client_type\":8,\"service_type\":0,\"imsi\":0,\"send_time\":%d,\"line_seq\":-1,\"gear\":%s,\"ssl\":1,\"stream_format\":0}}`, millis_13, rid, rid, millis_10, quality)\r\n\turl := \"https://stream-manager.yy.com/v3/channel/streams?uid=0&cid=\" + rid + \"&sid=\" + rid + \"&appid=0&sequence=\" + strconv.FormatInt(millis_13, 10) + \"&encode=json\"\r\n\treq, _ = http.NewRequest(\"POST\", url, bytes.NewBuffer([]byte(data)))\r\n\treq.Header.Set(\"Content-Type\", \"text/plain;charset=UTF-8\")\r\n\treq.Header.Set(\"Referer\", \"https://www.yy.com/\")\r\n\treq.Header.Set(\"User-Agent\", \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42\")\r\n\r\n\tres, _ = client.Do(req)\r\n\tdefer res.Body.Close()\r\n\tbody, _ = io.ReadAll(res.Body)\r\n\tvar result Result\r\n\tjson.Unmarshal(body, &result)\r\n\tif len(result.AvpInfoRes.StreamLineAddr) > 0 {\r\n\t\tvar arr []string\r\n\t\tfor k := range result.AvpInfoRes.StreamLineAddr {\r\n\t\t\tarr = append(arr, k)\r\n\t\t}\r\n\t\treturn result.AvpInfoRes.StreamLineAddr[arr[0]].CdnInfo.Url\r\n\t} else {\r\n\t\treturn nil\r\n\t}\r\n}\r\n"
  },
  {
    "path": "package.json",
    "content": "{\r\n    \"engines\": {\r\n        \"node\": \"18.x\"\r\n    }\r\n}"
  },
  {
    "path": "utils/http.go",
    "content": "package utils\r\n\r\nimport (\r\n  \"os\"\r\n  \"fmt\"\r\n  \"time\"\r\n  \"net/http\"\r\n  \"net/url\"\r\n//   \"log\"\r\n)\r\n\r\nfunc GetTestVideoUrl(w http.ResponseWriter) {\r\n\tTimeLocation, err := time.LoadLocation(\"Asia/Shanghai\")\r\n\tif err != nil {\r\n\t\tTimeLocation = time.FixedZone(\"CST\", 8*60*60)\r\n\t}\r\n\tstr_time := time.Now().In(TimeLocation).Format(\"2006-01-02 15:04:05\")\r\n  fmt.Fprintln(w, \"#EXTM3U\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1 tvg-name=\\\"\"+str_time+\"\\\" tvg-logo=\\\"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/tg.jpg\\\" group-title=\\\"列表更新时间\\\",\"+str_time)\r\n\tfmt.Fprintln(w, \"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/time/time.mp4\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1 tvg-name=\\\"4K60PSDR-H264-AAC测试\\\" tvg-logo=\\\"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/tg.jpg\\\" group-title=\\\"4K频道\\\",4K60PSDR-H264-AAC测试\")\r\n\tfmt.Fprintln(w, \"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/sdr4kvideo/index.m3u8\")\r\n\tfmt.Fprintln(w, \"#EXTINF:-1 tvg-name=\\\"4K60PHLG-HEVC-EAC3测试\\\" tvg-logo=\\\"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/tg.jpg\\\" group-title=\\\"4K频道\\\",4K60PHLG-HEVC-EAC3测试\")\r\n\tfmt.Fprintln(w, \"https://cdn.jsdelivr.net/gh/feiyangdigital/testvideo/hlg4kvideo/index.m3u8\")\r\n}\r\n\r\nfunc GetLivePrefix(r *http.Request) string {\r\n\t// 尝试从环境变量读取url\r\n\tenvUrl := os.Getenv(\"LIVE_URL\")\r\n\t// log.Println(\"env url:\", envUrl)\r\n\tif envUrl == \"\" {\r\n\t\t// 默认url\r\n\t\tenvUrl = \"https://www.goodiptv.club\"\r\n\t  }\r\n    firstUrl := DefaultQuery(r, \"url\", envUrl)\r\n    realUrl, _ := url.QueryUnescape(firstUrl)\r\n    return realUrl\r\n}\r\n\r\nfunc DefaultQuery(r *http.Request, name string, defaultValue string) string {\r\n  param := r.URL.Query().Get(name)\r\n  if param == \"\" {\r\n    return defaultValue\r\n  }\r\n  return param\r\n}\r\n  \r\nfunc Duanyan(adurl string, realurl any) string {\r\n  var liveurl string\r\n  if str, ok := realurl.(string); ok {\r\n    liveurl = str\r\n  } else {\r\n\tliveurl = adurl\r\n  }\r\n  // log.Println(\"Redirect url:\", liveurl)\r\n return liveurl\r\n}"
  },
  {
    "path": "utils/jsRun.go",
    "content": "// Package utils\n// @Time:2023/08/24 06:36\n// @File:jsRun.go\n// @SoftWare:Goland\n// @Author:feiyang\n// @Contact:TG@feiyangdigital\n\npackage utils\n\nimport (\n\t\"fmt\"\n\tjs \"github.com/dop251/goja\"\n\t\"sync\"\n)\n\ntype JsUtil struct {\n\tpool sync.Pool\n}\n\nfunc (j *JsUtil) getVm() *js.Runtime {\n\tv := j.pool.Get()\n\tif v != nil {\n\t\treturn v.(*js.Runtime)\n\t}\n\treturn js.New()\n}\n\nfunc (j *JsUtil) putVm(vm *js.Runtime) {\n\tvm.Set(\"global\", nil) // 清除全局对象\n\tj.pool.Put(vm)\n}\n\nfunc (j *JsUtil) JsRun(funcContent []string, params ...any) any {\n\tvm := j.getVm()\n\tdefer j.putVm(vm)\n\t_, err := vm.RunString(funcContent[0])\n\tif err != nil {\n\t\treturn err\n\t}\n\tjsfn, ok := js.AssertFunction(vm.Get(funcContent[1]))\n\tif !ok {\n\t\treturn fmt.Errorf(\"执行函数失败\")\n\t}\n\tjsValues := make([]js.Value, 0, len(params))\n\tfor _, v := range params {\n\t\tjsValues = append(jsValues, vm.ToValue(v))\n\t}\n\tresult, err := jsfn(\n\t\tjs.Undefined(),\n\t\tjsValues...,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn result\n}"
  },
  {
    "path": "vercel.json",
    "content": "{\n  \"routes\": [\n    {\n      \"src\": \"/live/.*\",\n      \"dest\": \"/api/live.go\"\n    },\n    {\n      \"src\": \"/yqk/.*\",\n      \"dest\": \"/api/yqk/yqk.go\"\n    },\n    {\n      \"src\": \"/favicon.ico\",\n      \"dest\": \"https://assets.vercel.com/image/upload/front/favicon/vercel/favicon.ico\"\n    },\n    {\n      \"src\": \"/.*\",\n      \"dest\": \"/api/index.go\"\n    }\n  ]\n}\n"
  }
]