package rar import ( "fmt" "net/http" "strings" zurghttp "github.com/debridmediamanager/zurg/pkg/http" "github.com/debridmediamanager/zurg/pkg/logutil" "github.com/nwaples/rardecode" ) type RarReader struct { client *zurghttp.HTTPClient log *logutil.Logger } func NewRarReader(client *zurghttp.HTTPClient, log *logutil.Logger) *RarReader { return &RarReader{ client: client, log: log, } } // GetRARContents extracts the file names from a RAR archive. func (r *RarReader) GetRARContents(downloadLink string) ([]string, error) { dlReq, err := http.NewRequest(http.MethodGet, downloadLink, nil) if err != nil { return nil, err } downloadResp, err := r.client.Do(dlReq) if err != nil { return nil, err } defer downloadResp.Body.Close() if downloadResp.StatusCode/100 != 2 { return nil, fmt.Errorf("received a %s status code", downloadResp.Status) } var fileList []string rarReader, err := rardecode.NewReader(downloadResp.Body, "") if err != nil { return nil, err } for { r.log.Debugf("Reading next file from RAR archive") header, err := rarReader.Next() if err != nil { if strings.Contains(err.Error(), "unexpected EOF") { break } return nil, err } if header == nil { break } fileList = append(fileList, header.Name) r.log.Debugf("Found file: %s", header.Name) r.log.Debugf("File size: %d MB", header.PackedSize/1024/1024) } return fileList, nil }