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 }