70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
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
|
|
}
|