From 20a5fbde12ca472dc4296521dbe3e96dee47ab20 Mon Sep 17 00:00:00 2001 From: yyoshiki41 Date: Tue, 8 Nov 2016 16:51:26 +0900 Subject: [PATCH] Add area function --- area.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ area_test.go | 32 ++++++++++++++++++++++++++++++++ client.go | 2 +- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 area.go create mode 100644 area_test.go diff --git a/area.go b/area.go new file mode 100644 index 0000000..bb9351e --- /dev/null +++ b/area.go @@ -0,0 +1,44 @@ +package radiko + +import ( + "net/http" + + "golang.org/x/net/html" +) + +const ( + areaURL = "http://radiko.jp/area" +) + +// AreaID returns areaID. +func AreaID() (string, error) { + resp, err := http.Get(areaURL) + if err != nil { + return "", err + } + defer resp.Body.Close() + + doc, err := html.Parse(resp.Body) + if err != nil { + return "", err + } + + return processSpanNode(doc), nil +} + +func processSpanNode(n *html.Node) string { + var areaID string + + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "span" && len(n.Attr) > 0 { + areaID = n.Attr[0].Val + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(n) + + return areaID +} diff --git a/area_test.go b/area_test.go new file mode 100644 index 0000000..d93696b --- /dev/null +++ b/area_test.go @@ -0,0 +1,32 @@ +package radiko + +import ( + "strings" + "testing" + + "golang.org/x/net/html" +) + +func TestAreaID(t *testing.T) { + areaID, err := AreaID() + if err != nil { + t.Errorf("Failed to download player.swf: %s", err) + } + if areaID == "" { + t.Errorf("Invalid area id: %s", areaID) + } +} + +func TestProcessSpanNode(t *testing.T) { + s := `document.write('TOKYO JAPAN');` + doc, err := html.Parse(strings.NewReader(s)) + if err != nil { + t.Errorf("Parse HTML: %s", err) + } + + areaID := processSpanNode(doc) + if areaID != "JP13" { + t.Errorf("Failed to process span node.\nAreaID: %s", + areaID) + } +} diff --git a/client.go b/client.go index eb087ea..0eeafc0 100644 --- a/client.go +++ b/client.go @@ -55,7 +55,7 @@ func New() (*Client, error) { } if httpClient == nil { - return nil, errors.New("HTTP Client is nil") + return nil, errors.New("A HTTP client is nil.") } return &Client{