func importOPMLTask(pfc *PFContext) (TaskMessage, error) { c := pfc.C var blobKey appengine.BlobKey if blobKeyString := pfc.R.PostFormValue("opmlBlobKey"); blobKeyString == "" { return TaskMessage{}, errors.New("Missing blob key") } else { blobKey = appengine.BlobKey(blobKeyString) } reader := blobstore.NewReader(c, blobKey) opml, err := rss.ParseOPML(reader) if err != nil { // Remove the blob if err := blobstore.Delete(c, blobKey); err != nil { c.Warningf("Error deleting blob (key %s): %s", blobKey, err) } return TaskMessage{}, err } // Remove the blob if err := blobstore.Delete(c, blobKey); err != nil { c.Warningf("Error deleting blob (key %s): %s", blobKey, err) } importStarted := time.Now() parentRef := storage.FolderRef{ UserID: pfc.UserID, } doneChannel := make(chan *rss.Outline) importing := importSubscriptions(pfc, doneChannel, pfc.UserID, parentRef, opml.Outlines()) for i := 0; i < importing; i++ { subscription := <-doneChannel c.Infof("Completed %s", subscription.Title) } c.Infof("All completed in %s", time.Since(importStarted)) return TaskMessage{ Message: _l("Subscriptions imported successfully"), Refresh: true, }, nil }
func importOPML(pfc *PFContext) (interface{}, error) { c := pfc.C r := pfc.R blobs, other, err := blobstore.ParseUpload(r) if err != nil { return nil, NewReadableError(_l("Error receiving file"), &err) } else if len(other["client"]) > 0 { if clientID := other["client"][0]; clientID != "" { pfc.ChannelID = string(pfc.UserID) + "," + clientID } } var blobKey appengine.BlobKey if blobInfos := blobs["opml"]; len(blobInfos) == 0 { return nil, NewReadableError(_l("File not uploaded"), nil) } else { blobKey = blobInfos[0].BlobKey reader := blobstore.NewReader(c, blobKey) if _, err := rss.ParseOPML(reader); err != nil { if err := blobstore.Delete(c, blobKey); err != nil { c.Warningf("Error deleting blob (key %s): %s", blobKey, err) } return nil, NewReadableError(_l("Error reading OPML file"), &err) } } params := taskParams{ "opmlBlobKey": string(blobKey), } if err := startTask(pfc, "import", params, importQueue); err != nil { // Remove the blob if err := blobstore.Delete(c, blobKey); err != nil { c.Warningf("Error deleting blob (key %s): %s", blobKey, err) } return nil, NewReadableError(_l("Cannot import - too busy"), &err) } return _l("Importing, please wait…"), nil }