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 }