- Also implement hubs for jsonfeed
This commit is contained in:
parent
c1f2b7a5a7
commit
66489b6de7
|
|
@ -114,7 +114,6 @@ func (h *microsubHandler) checkAuthToken(header string, token *TokenResponse) bo
|
||||||
|
|
||||||
dec := json.NewDecoder(res.Body)
|
dec := json.NewDecoder(res.Body)
|
||||||
err = dec.Decode(&token)
|
err = dec.Decode(&token)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error in json object: %v", err)
|
log.Printf("Error in json object: %v", err)
|
||||||
return false
|
return false
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ import (
|
||||||
"p83.nl/go/ekster/pkg/microsub"
|
"p83.nl/go/ekster/pkg/microsub"
|
||||||
|
|
||||||
"github.com/garyburd/redigo/redis"
|
"github.com/garyburd/redigo/redis"
|
||||||
|
"p83.nl/go/ekster/pkg/jsonfeed"
|
||||||
"willnorris.com/go/microformats"
|
"willnorris.com/go/microformats"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -100,7 +101,7 @@ func (b *memoryBackend) feedHeader(fetchURL, contentType string, body io.Reader)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if strings.HasPrefix(contentType, "application/json") { // json feed?
|
} else if strings.HasPrefix(contentType, "application/json") { // json feed?
|
||||||
var jfeed JSONFeed
|
var jfeed jsonfeed.Feed
|
||||||
dec := json.NewDecoder(body)
|
dec := json.NewDecoder(body)
|
||||||
err := dec.Decode(&jfeed)
|
err := dec.Decode(&jfeed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -224,7 +225,7 @@ func (b *memoryBackend) feedItems(fetchURL, contentType string, body io.Reader)
|
||||||
items = append(items, item)
|
items = append(items, item)
|
||||||
}
|
}
|
||||||
} else if strings.HasPrefix(contentType, "application/json") { // json feed?
|
} else if strings.HasPrefix(contentType, "application/json") { // json feed?
|
||||||
var feed JSONFeed
|
var feed jsonfeed.Feed
|
||||||
dec := json.NewDecoder(body)
|
dec := json.NewDecoder(body)
|
||||||
err := dec.Decode(&feed)
|
err := dec.Decode(&feed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
/*
|
|
||||||
Microsub server
|
|
||||||
Copyright (C) 2018 Peter Stuifzand
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package main
|
|
||||||
|
|
||||||
type JSONFeedAttachment struct {
|
|
||||||
URL string `json:"url"`
|
|
||||||
MimeType string `json:"mime_type"`
|
|
||||||
Title string `json:"title,omitempty"`
|
|
||||||
SizeInBytes int `json:"size_in_bytes,omitempty"`
|
|
||||||
DurationInSeconds int `json:"duration_in_seconds,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type JSONFeedItem struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
ContentText string `json:"content_text,omitempty"`
|
|
||||||
ContentHTML string `json:"content_html,omitempty"`
|
|
||||||
Summary string `json:"summary,omitempty"`
|
|
||||||
Title string `json:"title,omitempty"`
|
|
||||||
URL string `json:"url,omitempty"`
|
|
||||||
Image string `json:"image,omitempty"`
|
|
||||||
ExternalURL string `json:"external_url,omitempty"`
|
|
||||||
DatePublished string `json:"date_published,omitempty"`
|
|
||||||
Author JSONFeedAuthor `json:"author,omitempty"`
|
|
||||||
Tags []string `json:"tags,omitempty"`
|
|
||||||
Attachments []JSONFeedAttachment `json:"attachments,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type JSONFeedAuthor struct {
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
URL string `json:"url,omitempty"`
|
|
||||||
Avatar string `json:"avatar,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type JSONFeedHub struct {
|
|
||||||
Type string `json:"type"`
|
|
||||||
URL string `json:"url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type JSONFeed struct {
|
|
||||||
Version string `json:"version"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
HomePageURL string `json:"home_page_url"`
|
|
||||||
FeedURL string `json:"feed_url"`
|
|
||||||
NextUrl string `json:"next_url"`
|
|
||||||
Icon string `json:"icon"`
|
|
||||||
Favicon string `json:"favicon"`
|
|
||||||
Author JSONFeedAuthor `json:"author,omitempty"`
|
|
||||||
Items []JSONFeedItem `json:"items"`
|
|
||||||
Hubs []JSONFeedHub `json:"hubs"`
|
|
||||||
}
|
|
||||||
65
pkg/jsonfeed/jsonfeed.go
Normal file
65
pkg/jsonfeed/jsonfeed.go
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
Microsub server
|
||||||
|
Copyright (C) 2018 Peter Stuifzand
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package jsonfeed
|
||||||
|
|
||||||
|
type Attachment struct {
|
||||||
|
URL string `json:"url"`
|
||||||
|
MimeType string `json:"mime_type"`
|
||||||
|
Title string `json:"title,omitempty"`
|
||||||
|
SizeInBytes int `json:"size_in_bytes,omitempty"`
|
||||||
|
DurationInSeconds int `json:"duration_in_seconds,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Item struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
ContentText string `json:"content_text,omitempty"`
|
||||||
|
ContentHTML string `json:"content_html,omitempty"`
|
||||||
|
Summary string `json:"summary,omitempty"`
|
||||||
|
Title string `json:"title,omitempty"`
|
||||||
|
URL string `json:"url,omitempty"`
|
||||||
|
Image string `json:"image,omitempty"`
|
||||||
|
ExternalURL string `json:"external_url,omitempty"`
|
||||||
|
DatePublished string `json:"date_published,omitempty"`
|
||||||
|
Author Author `json:"author,omitempty"`
|
||||||
|
Tags []string `json:"tags,omitempty"`
|
||||||
|
Attachments []Attachment `json:"attachments,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Author struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
URL string `json:"url,omitempty"`
|
||||||
|
Avatar string `json:"avatar,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Hub struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
URL string `json:"url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Feed struct {
|
||||||
|
Version string `json:"version"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
HomePageURL string `json:"home_page_url"`
|
||||||
|
FeedURL string `json:"feed_url"`
|
||||||
|
NextUrl string `json:"next_url"`
|
||||||
|
Icon string `json:"icon"`
|
||||||
|
Favicon string `json:"favicon"`
|
||||||
|
Author Author `json:"author,omitempty"`
|
||||||
|
Items []Item `json:"items"`
|
||||||
|
Hubs []Hub `json:"hubs"`
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
package websub
|
package websub
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
@ -10,6 +12,7 @@ import (
|
||||||
"linkheader"
|
"linkheader"
|
||||||
"rss"
|
"rss"
|
||||||
|
|
||||||
|
"p83.nl/go/ekster/pkg/jsonfeed"
|
||||||
"willnorris.com/go/microformats"
|
"willnorris.com/go/microformats"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -25,7 +28,7 @@ func GetHubURL(client *http.Client, topic string) (string, error) {
|
||||||
return hubURL, err
|
return hubURL, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", fmt.Errorf("No hub url found for topic %s", topic)
|
return "", fmt.Errorf("no hub url found for topic %s", topic)
|
||||||
}
|
}
|
||||||
|
|
||||||
func isFeedContentType(contentType string) bool {
|
func isFeedContentType(contentType string) bool {
|
||||||
|
|
@ -67,7 +70,7 @@ func parseBodyLinks(client *http.Client, topic string) (string, error) {
|
||||||
if feed.HubURL != "" {
|
if feed.HubURL != "" {
|
||||||
return feed.HubURL, nil
|
return feed.HubURL, nil
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("No WebSub hub url found in the RSS feed")
|
return "", fmt.Errorf("no WebSub hub url found in the RSS feed")
|
||||||
} else if strings.HasPrefix(contentType, "text/html") {
|
} else if strings.HasPrefix(contentType, "text/html") {
|
||||||
topicURL, _ := url.Parse(topic)
|
topicURL, _ := url.Parse(topic)
|
||||||
md := microformats.Parse(resp.Body, topicURL)
|
md := microformats.Parse(resp.Body, topicURL)
|
||||||
|
|
@ -76,10 +79,26 @@ func parseBodyLinks(client *http.Client, topic string) (string, error) {
|
||||||
return hubs[0], nil
|
return hubs[0], nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("No WebSub hub url found in HTML <link> elements")
|
return "", fmt.Errorf("no WebSub hub url found in HTML <link> elements")
|
||||||
|
} else if strings.HasPrefix(contentType, "application/json") {
|
||||||
|
var feed jsonfeed.Feed
|
||||||
|
dec := json.NewDecoder(resp.Body)
|
||||||
|
err := dec.Decode(&feed)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("error while parsing json feed: %s\n", err)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range feed.Hubs {
|
||||||
|
if v.Type == "WebSub" {
|
||||||
|
return v.URL, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("no WebSub hub url found in jsonfeed")
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", fmt.Errorf("Unknown content type of response: %s", resp.Header.Get("Content-Type"))
|
return "", fmt.Errorf("unknown content type of response: %s", resp.Header.Get("Content-Type"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseLinkHeaders(client *http.Client, topic string) (string, error) {
|
func parseLinkHeaders(client *http.Client, topic string) (string, error) {
|
||||||
|
|
@ -100,7 +119,7 @@ func parseLinkHeaders(client *http.Client, topic string) (string, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", fmt.Errorf("No hub url found in HTTP Link headers")
|
return "", fmt.Errorf("no hub url found in HTTP Link headers")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subscribe subscribes topicURL on hubURL
|
// Subscribe subscribes topicURL on hubURL
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user