github.com/soulteary/pocket-bookcase@v0.0.0-20240428065142-0b5a9a0fc98a/internal/domains/archiver.go (about)

     1  package domains
     2  
     3  import (
     4  	"fmt"
     5  	"path/filepath"
     6  
     7  	"github.com/go-shiori/warc"
     8  	"github.com/soulteary/pocket-bookcase/internal/core"
     9  	"github.com/soulteary/pocket-bookcase/internal/dependencies"
    10  	"github.com/soulteary/pocket-bookcase/internal/model"
    11  )
    12  
    13  type ArchiverDomain struct {
    14  	deps *dependencies.Dependencies
    15  }
    16  
    17  func (d *ArchiverDomain) DownloadBookmarkArchive(book model.BookmarkDTO) (*model.BookmarkDTO, error) {
    18  	content, contentType, err := core.DownloadBookmark(book.URL)
    19  	if err != nil {
    20  		return nil, fmt.Errorf("error downloading url: %s", err)
    21  	}
    22  
    23  	processRequest := core.ProcessRequest{
    24  		DataDir:     d.deps.Config.Storage.DataDir,
    25  		Bookmark:    book,
    26  		Content:     content,
    27  		ContentType: contentType,
    28  	}
    29  
    30  	result, isFatalErr, err := core.ProcessBookmark(d.deps, processRequest)
    31  	content.Close()
    32  
    33  	if err != nil && isFatalErr {
    34  		return nil, fmt.Errorf("failed to process: %v", err)
    35  	}
    36  
    37  	return &result, nil
    38  }
    39  
    40  func (d *ArchiverDomain) GetBookmarkArchive(book *model.BookmarkDTO) (*warc.Archive, error) {
    41  	archivePath := model.GetArchivePath(book)
    42  
    43  	if !d.deps.Domains.Storage.FileExists(archivePath) {
    44  		return nil, fmt.Errorf("archive for bookmark %d doesn't exist", book.ID)
    45  	}
    46  
    47  	// FIXME: This only works in local filesystem
    48  	return warc.Open(filepath.Join(d.deps.Config.Storage.DataDir, archivePath))
    49  }
    50  
    51  func NewArchiverDomain(deps *dependencies.Dependencies) *ArchiverDomain {
    52  	return &ArchiverDomain{
    53  		deps: deps,
    54  	}
    55  }