refactored piwigo context to a interface on most of the functions
This commit is contained in:
parent
6064e94858
commit
eae6db1683
@ -3,7 +3,6 @@ package app
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
|
||||||
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/localFileStructure"
|
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/localFileStructure"
|
||||||
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo"
|
"git.haefelfinger.net/piwigo/PiwigoDirectoryUploader/internal/pkg/piwigo"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
@ -70,12 +69,9 @@ func configureContext() (*appContext, error) {
|
|||||||
context := new(appContext)
|
context := new(appContext)
|
||||||
context.LocalRootPath = *imagesRootPath
|
context.LocalRootPath = *imagesRootPath
|
||||||
context.Piwigo = new(piwigo.PiwigoContext)
|
context.Piwigo = new(piwigo.PiwigoContext)
|
||||||
context.Piwigo.Url = fmt.Sprintf("%s/ws.php?format=json", *piwigoUrl)
|
err := context.Piwigo.Initialize(*piwigoUrl, *piwigoUser, *piwigoPassword, *piwigoUploadChunkSizeInKB)
|
||||||
context.Piwigo.Username = *piwigoUser
|
|
||||||
context.Piwigo.Password = *piwigoPassword
|
|
||||||
context.Piwigo.ChunkSizeInKB = *piwigoUploadChunkSizeInKB
|
|
||||||
|
|
||||||
return context, nil
|
return context, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func loginToPiwigoAndConfigureContext(context *appContext) error {
|
func loginToPiwigoAndConfigureContext(context *appContext) error {
|
||||||
|
@ -1,25 +1,61 @@
|
|||||||
package piwigo
|
package piwigo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/cookiejar"
|
"net/http/cookiejar"
|
||||||
"net/url"
|
"net/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type PiwigoFormPoster interface {
|
||||||
|
getChunkSizeInKB() int
|
||||||
|
postForm(formData url.Values) (resp *http.Response, err error)
|
||||||
|
}
|
||||||
|
|
||||||
type PiwigoContext struct {
|
type PiwigoContext struct {
|
||||||
Url string
|
url string
|
||||||
Username string
|
username string
|
||||||
Password string
|
password string
|
||||||
ChunkSizeInKB int
|
chunkSizeInKB int
|
||||||
Cookies *cookiejar.Jar
|
Cookies *cookiejar.Jar
|
||||||
}
|
}
|
||||||
|
|
||||||
func (context *PiwigoContext) PostForm(formData url.Values) (resp *http.Response, err error) {
|
func (context *PiwigoContext) Initialize(baseUrl string, username string, password string, chunkSizeInKB int) error {
|
||||||
|
if baseUrl == "" {
|
||||||
|
return errors.New("Please provide a valid piwigo server base URL")
|
||||||
|
}
|
||||||
|
_, err := url.Parse(baseUrl)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if username == "" {
|
||||||
|
return errors.New("Please provide a valid username for the given piwigo server.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if chunkSizeInKB < 256 {
|
||||||
|
return errors.New("The minimum chunksize is 256KB. Please provide a value above. Default is 512KB")
|
||||||
|
}
|
||||||
|
|
||||||
|
context.url = fmt.Sprintf("%s/ws.php?format=json", baseUrl)
|
||||||
|
context.username = username
|
||||||
|
context.password = password
|
||||||
|
context.chunkSizeInKB = chunkSizeInKB
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (context *PiwigoContext) getChunkSizeInKB() int {
|
||||||
|
return context.chunkSizeInKB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (context *PiwigoContext) postForm(formData url.Values) (resp *http.Response, err error) {
|
||||||
context.initializeCookieJarIfRequired()
|
context.initializeCookieJarIfRequired()
|
||||||
|
|
||||||
client := http.Client{Jar: context.Cookies}
|
client := http.Client{Jar: context.Cookies}
|
||||||
response, err := client.PostForm(context.Url, formData)
|
response, err := client.PostForm(context.url, formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Errorln("The HTTP request failed with error %s", err)
|
logrus.Errorln("The HTTP request failed with error %s", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -39,18 +39,18 @@ type LogoutResponse struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Login(context *PiwigoContext) error {
|
func Login(context *PiwigoContext) error {
|
||||||
logrus.Debugf("Logging in to %s using user %s", context.Url, context.Username)
|
logrus.Debugf("Logging in to %s using user %s", context.url, context.username)
|
||||||
|
|
||||||
if !strings.HasPrefix(context.Url, "https") {
|
if !strings.HasPrefix(context.url, "https") {
|
||||||
logrus.Warnf("The server url %s does not use https! Credentials are not encrypted!", context.Url)
|
logrus.Warnf("The server url %s does not use https! Credentials are not encrypted!", context.url)
|
||||||
}
|
}
|
||||||
|
|
||||||
formData := url.Values{}
|
formData := url.Values{}
|
||||||
formData.Set("method", "pwg.session.login")
|
formData.Set("method", "pwg.session.login")
|
||||||
formData.Set("username", context.Username)
|
formData.Set("username", context.username)
|
||||||
formData.Set("password", context.Password)
|
formData.Set("password", context.password)
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -73,12 +73,12 @@ func Login(context *PiwigoContext) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Logout(context *PiwigoContext) error {
|
func Logout(context *PiwigoContext) error {
|
||||||
logrus.Debugf("Logging out from %s", context.Url)
|
logrus.Debugf("Logging out from %s", context.url)
|
||||||
|
|
||||||
formData := url.Values{}
|
formData := url.Values{}
|
||||||
formData.Set("method", "pwg.session.logout")
|
formData.Set("method", "pwg.session.logout")
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -90,21 +90,21 @@ func Logout(context *PiwigoContext) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if statusResponse.Status != "ok" {
|
if statusResponse.Status != "ok" {
|
||||||
logrus.Errorf("Logout from %s failed", context.Url)
|
logrus.Errorf("Logout from %s failed", context.url)
|
||||||
} else {
|
} else {
|
||||||
logrus.Infof("Successfully logged out from %s", context.Url)
|
logrus.Infof("Successfully logged out from %s", context.url)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStatus(context *PiwigoContext) (*GetStatusResponse, error) {
|
func GetStatus(context PiwigoFormPoster) (*GetStatusResponse, error) {
|
||||||
logrus.Debugln("Getting current login state...")
|
logrus.Debugln("Getting current login state...")
|
||||||
|
|
||||||
formData := url.Values{}
|
formData := url.Values{}
|
||||||
formData.Set("method", "pwg.session.getStatus")
|
formData.Set("method", "pwg.session.getStatus")
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -117,7 +117,7 @@ func GetStatus(context *PiwigoContext) (*GetStatusResponse, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if statusResponse.Status != "ok" {
|
if statusResponse.Status != "ok" {
|
||||||
errorMessage := fmt.Sprintf("Could not get session state from %s", context.Url)
|
errorMessage := fmt.Sprintln("Could not get session state from server")
|
||||||
logrus.Errorln(errorMessage)
|
logrus.Errorln(errorMessage)
|
||||||
return nil, errors.New(errorMessage)
|
return nil, errors.New(errorMessage)
|
||||||
}
|
}
|
||||||
|
@ -50,12 +50,12 @@ type createCategoryResponse struct {
|
|||||||
} `json:"result"`
|
} `json:"result"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAllCategories(context *PiwigoContext) (map[string]*PiwigoCategory, error) {
|
func GetAllCategories(context PiwigoFormPoster) (map[string]*PiwigoCategory, error) {
|
||||||
formData := url.Values{}
|
formData := url.Values{}
|
||||||
formData.Set("method", "pwg.categories.getList")
|
formData.Set("method", "pwg.categories.getList")
|
||||||
formData.Set("recursive", "true")
|
formData.Set("recursive", "true")
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -119,7 +119,7 @@ func buildCategoryKeys(categories map[int]*PiwigoCategory) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateCategory(context *PiwigoContext, parentId int, name string) (int, error) {
|
func CreateCategory(context PiwigoFormPoster, parentId int, name string) (int, error) {
|
||||||
formData := url.Values{}
|
formData := url.Values{}
|
||||||
formData.Set("method", "pwg.categories.add")
|
formData.Set("method", "pwg.categories.add")
|
||||||
formData.Set("name", name)
|
formData.Set("name", name)
|
||||||
@ -129,7 +129,7 @@ func CreateCategory(context *PiwigoContext, parentId int, name string) (int, err
|
|||||||
formData.Set("parent", fmt.Sprint(parentId))
|
formData.Set("parent", fmt.Sprint(parentId))
|
||||||
}
|
}
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@ func CreateCategory(context *PiwigoContext, parentId int, name string) (int, err
|
|||||||
return 0, errors.New("Could not create category")
|
return 0, errors.New("Could not create category")
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Infof("Successfully got all categories from %s", context.Url)
|
logrus.Infof("Successfully got all categories from server...")
|
||||||
|
|
||||||
return createResponse.Result.ID, nil
|
return createResponse.Result.ID, nil
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ type imageExistResponse struct {
|
|||||||
Result map[string]string `json:"result"`
|
Result map[string]string `json:"result"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func ImageUploadRequired(context *PiwigoContext, md5sums []string) ([]string, error) {
|
func ImageUploadRequired(context PiwigoFormPoster, md5sums []string) ([]string, error) {
|
||||||
//TODO: make sure to split to multiple queries -> to honor max upload queries
|
//TODO: make sure to split to multiple queries -> to honor max upload queries
|
||||||
//TODO: Make sure to return the found imageIds of the found sums to update the local image nodes
|
//TODO: Make sure to return the found imageIds of the found sums to update the local image nodes
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ func ImageUploadRequired(context *PiwigoContext, md5sums []string) ([]string, er
|
|||||||
|
|
||||||
logrus.Tracef("Looking up missing files: %s", md5sumList)
|
logrus.Tracef("Looking up missing files: %s", md5sumList)
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -68,8 +68,8 @@ func ImageUploadRequired(context *PiwigoContext, md5sums []string) ([]string, er
|
|||||||
return missingFiles, nil
|
return missingFiles, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func UploadImage(context *PiwigoContext, filePath string, md5sum string, category int) (int, error) {
|
func UploadImage(context PiwigoFormPoster, filePath string, md5sum string, category int) (int, error) {
|
||||||
if context.ChunkSizeInKB <= 0 {
|
if context.getChunkSizeInKB() <= 0 {
|
||||||
return 0, errors.New("Uploadchunk size is less or equal to zero. 512 is a recommendet value to begin with.")
|
return 0, errors.New("Uploadchunk size is less or equal to zero. 512 is a recommendet value to begin with.")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ func UploadImage(context *PiwigoContext, filePath string, md5sum string, categor
|
|||||||
}
|
}
|
||||||
|
|
||||||
fileSizeInKB := fileInfo.Size() / 1024
|
fileSizeInKB := fileInfo.Size() / 1024
|
||||||
logrus.Infof("Uploading %s using chunksize of %d KB and total size of %d KB", filePath, context.ChunkSizeInKB, fileSizeInKB)
|
logrus.Infof("Uploading %s using chunksize of %d KB and total size of %d KB", filePath, context.getChunkSizeInKB(), fileSizeInKB)
|
||||||
|
|
||||||
err = uploadImageChunks(filePath, context, fileSizeInKB, md5sum)
|
err = uploadImageChunks(filePath, context, fileSizeInKB, md5sum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -94,7 +94,7 @@ func UploadImage(context *PiwigoContext, filePath string, md5sum string, categor
|
|||||||
return imageId, nil
|
return imageId, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func uploadImageChunks(filePath string, context *PiwigoContext, fileSizeInKB int64, md5sum string) error {
|
func uploadImageChunks(filePath string, context PiwigoFormPoster, fileSizeInKB int64, md5sum string) error {
|
||||||
file, err := os.Open(filePath)
|
file, err := os.Open(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -102,8 +102,9 @@ func uploadImageChunks(filePath string, context *PiwigoContext, fileSizeInKB int
|
|||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
reader := bufio.NewReader(file)
|
reader := bufio.NewReader(file)
|
||||||
buffer := make([]byte, context.ChunkSizeInKB*1024)
|
bufferSize := 1024 * context.getChunkSizeInKB()
|
||||||
numberOfChunks := (fileSizeInKB / int64(context.ChunkSizeInKB)) + 1
|
buffer := make([]byte, bufferSize)
|
||||||
|
numberOfChunks := (fileSizeInKB / int64(context.getChunkSizeInKB())) + 1
|
||||||
currentChunk := int64(0)
|
currentChunk := int64(0)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@ -130,7 +131,7 @@ func uploadImageChunks(filePath string, context *PiwigoContext, fileSizeInKB int
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func uploadImageChunk(context *PiwigoContext, base64chunk string, md5sum string, position int64) error {
|
func uploadImageChunk(context PiwigoFormPoster, base64chunk string, md5sum string, position int64) error {
|
||||||
formData := url.Values{}
|
formData := url.Values{}
|
||||||
formData.Set("method", "pwg.images.addChunk")
|
formData.Set("method", "pwg.images.addChunk")
|
||||||
formData.Set("data", base64chunk)
|
formData.Set("data", base64chunk)
|
||||||
@ -141,7 +142,7 @@ func uploadImageChunk(context *PiwigoContext, base64chunk string, md5sum string,
|
|||||||
|
|
||||||
logrus.Tracef("Uploading chunk %d of file with sum %s", position, md5sum)
|
logrus.Tracef("Uploading chunk %d of file with sum %s", position, md5sum)
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -161,7 +162,7 @@ func uploadImageChunk(context *PiwigoContext, base64chunk string, md5sum string,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func uploadImageFinal(context *PiwigoContext, originalFilename string, md5sum string, categoryId int) (int, error) {
|
func uploadImageFinal(context PiwigoFormPoster, originalFilename string, md5sum string, categoryId int) (int, error) {
|
||||||
formData := url.Values{}
|
formData := url.Values{}
|
||||||
formData.Set("method", "pwg.images.add")
|
formData.Set("method", "pwg.images.add")
|
||||||
formData.Set("original_sum", md5sum)
|
formData.Set("original_sum", md5sum)
|
||||||
@ -171,7 +172,7 @@ func uploadImageFinal(context *PiwigoContext, originalFilename string, md5sum st
|
|||||||
|
|
||||||
logrus.Debugf("Finalizing upload of file %s with sum %s to category %d", originalFilename, md5sum, categoryId)
|
logrus.Debugf("Finalizing upload of file %s with sum %s to category %d", originalFilename, md5sum, categoryId)
|
||||||
|
|
||||||
response, err := context.PostForm(formData)
|
response, err := context.postForm(formData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user