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
}