twitchpl

package module
v0.0.0-...-7b2ea36 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 8, 2023 License: MIT Imports: 10 Imported by: 0

README

twitchpl - Get direct Twitch m3u8 HLS playlist ▶️🎵

Small lib used to extract twitch.tv livestreams HLS playlist for future needs

🔨 Installation

go install github.com/wmw64/twitchpl/cmd/twitchpl@latest

Features

  • 🚀 Choose stream quality: best, worst or audio_only

🧑‍💻 Usage

CLI

wmw@zsh:~$ twitchpl honeymad
{
        "channel": "honeymad",
        "quality": "best",
        "resolution": "1920x1080",
        "frame_rate": 60,
        "url": "https://video-weaver.fra05.hls.ttvnw.net/v1/playlist/CzmA.m3u8"
}
wmw@zsh:~$

In your project

package main

import (
	"fmt"
	"os"

	"github.com/wmw64/twitchpl"
)

func main() {
	args := os.Args[1:]

	if len(args) == 0 {
		println("Pass twitch channel as an argument. Example: twitchpl asmongold")
		os.Exit(3)
	}

	pl, err := twitchpl.Get(context.Background(), args[0])
	if err != nil {
		panic(err)
	}

	// println(pl.AsJSON()) // Best quality by default
	// {
	// 	"channel": "asmongold",
	// 	"quality": "best",
	// 	"resolution": "1920x1080",
	// 	"frame_rate": 60,
	// 	"url": "https://video-weaver.arn04.hls.ttvnw.net/v1/playlist/C..JIG.m3u8"
	// }

	println(pl.AsURL())
	// https://video-weaver.arn04.hls.ttvnw.net/v1/playlist/C..JIG.m3u8

	//	println(pl.Worst().AsJSON())
	//	println(pl.Best().AsURL())
}

🧠 What I Learned

  • m3u8 parsing
  • GraphQL requests
  • Golangs basics (HTTP requests, nested structs, error handling)

📝 ToDo

  • Detect if channel doesn't exists
  • Ignore restreams

👤 Author & License

©️ 2021 Ivan Smyshlyaev. MIT License 👉 My instagram page

Documentation

Index

Constants

View Source
const (
	ClientID = "kimne78kx3ncx6brgo4mv6wki5h1ko"
	UsherAPI = "https://usher.ttvnw.net/api/channel/hls/%s.m3u8"
	TTVAPI   = "https://eu.luminous.dev/playlist/%s"
	GraphURL = "https://gql.twitch.tv/gql"
)

Variables

View Source
var (
	Client = &http.Client{
		Timeout: 30 * time.Second,
		Transport: &http.Transport{
			MaxIdleConnsPerHost: 100,
			IdleConnTimeout:     90 * time.Second,
		},
	}
	UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
)

Functions

func GetMPL

func GetMPL(ctx context.Context, channel string, useAdProxy bool) (string, error)

Types

type GraphQLQuery

type GraphQLQuery struct {
	OperationName string           `json:"operationName"`
	Query         string           `json:"query"`
	Variables     GraphQLVariables `json:"variables"`
}

func NewPlaybackAccessTokenQuery

func NewPlaybackAccessTokenQuery(login string) GraphQLQuery

type GraphQLVariables

type GraphQLVariables struct {
	Login      string `json:"login"`
	PlayerType string `json:"playerType"`
	VodID      string `json:"vodID"`
	IsLive     bool   `json:"isLive"`
	IsVod      bool   `json:"isVod"`
}

type Outputter

type Outputter struct {
	Channel    string  `json:"channel"`
	Quality    string  `json:"quality"`
	Resolution string  `json:"resolution"`
	URL        string  `json:"url"`
	FrameRate  float64 `json:"frame_rate"`
}

type PlaybackAccessTokenGraphQLData

type PlaybackAccessTokenGraphQLData struct {
	StreamPlaybackAccessToken StreamPlaybackAccessToken `json:"streamPlaybackAccessToken"`
}

type PlaybackAccessTokenGraphQLResponse

type PlaybackAccessTokenGraphQLResponse struct {
	Data PlaybackAccessTokenGraphQLData `json:"data"`
}

type PlaylistManager

type PlaylistManager struct {
	StreamPlaybackAccessToken *StreamPlaybackAccessToken
	Variant                   *[]QualityVariant
	Outputter                 *Outputter
	ChannelName               string
	Quality                   string
	Resolution                string
	DesiredVariant            string
	Errors                    []error
}

func Get

func Get(ctx context.Context, channel string, useAdProxy bool) (*PlaylistManager, error)

func (*PlaylistManager) AsJSON

func (p *PlaylistManager) AsJSON() string

func (*PlaylistManager) AsURL

func (p *PlaylistManager) AsURL() string

func (*PlaylistManager) Audio

func (p *PlaylistManager) Audio() *PlaylistManager

func (*PlaylistManager) Best

func (p *PlaylistManager) Best() *PlaylistManager

func (*PlaylistManager) Worst

func (p *PlaylistManager) Worst() *PlaylistManager

type QualityVariant

type QualityVariant struct {
	Name       string
	Resolution string
	URL        string
	FrameRate  float64
}

type StreamPlaybackAccessToken

type StreamPlaybackAccessToken struct {
	Signature string `json:"signature"`
	Value     string `json:"value"`
}

Directories

Path Synopsis
cmd
twitchpl command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL