71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
package downloader
|
|
|
|
import (
|
|
"fmt"
|
|
"m3u8-downloader/pkg/constants"
|
|
"m3u8-downloader/pkg/http"
|
|
"m3u8-downloader/pkg/media"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
)
|
|
|
|
type DownloadService struct {
|
|
client *http.HTTPWrapper
|
|
}
|
|
|
|
func GetDownloadService() *DownloadService {
|
|
return &DownloadService{
|
|
client: http.DefaultClient,
|
|
}
|
|
}
|
|
|
|
func (s *DownloadService) GetStreamMetadata(url string) (*media.PlaylistMetadata, error) {
|
|
return media.GetPlaylistMetadata(url), nil
|
|
}
|
|
|
|
func (s *DownloadService) ParseSegmentPlaylist(url string) (*media.SegmentPlaylist, error) {
|
|
content, err := s.client.Get(url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return media.ParseMediaPlaylist(string(content)), nil
|
|
}
|
|
|
|
func (s *DownloadService) ParseMasterPlaylist(url string) (*media.StreamSet, error) {
|
|
metadata := media.GetPlaylistMetadata(url)
|
|
content, err := s.client.Get(url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
video, audio := media.ParsePlaylistLines(string(content))
|
|
master := media.NewMasterPlaylist(video, audio)
|
|
return media.NewStreamSet(metadata, master), nil
|
|
}
|
|
|
|
func (s *DownloadService) DownloadFile(url string) error {
|
|
fmt.Println("Downloading: " + url)
|
|
if err := os.MkdirAll(constants.OutputDirPath, 0755); err != nil {
|
|
return fmt.Errorf("failed to create directory: %w", err)
|
|
}
|
|
|
|
fileName := path.Base(url)
|
|
filePath := filepath.Join(constants.OutputDirPath, fileName)
|
|
data, err := s.client.Get(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
out, err := os.Create(filePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close()
|
|
|
|
_, err = out.Write(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|