parser.go 929 B

12345678910111213141516171819202122232425262728293031323334
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package json // import "miniflux.app/v2/internal/reader/json"
  4. import (
  5. "bufio"
  6. "bytes"
  7. "encoding/json"
  8. "fmt"
  9. "io"
  10. "miniflux.app/v2/internal/model"
  11. )
  12. var utf8BOM = []byte{0xEF, 0xBB, 0xBF}
  13. // Parse returns a normalized feed struct from a JSON feed.
  14. func Parse(baseURL string, data io.Reader) (*model.Feed, error) {
  15. reader := bufio.NewReader(data)
  16. // RFC 8259 allows parsers to ignore a leading UTF-8 byte order mark,
  17. // but encoding/json rejects it.
  18. if prefix, err := reader.Peek(len(utf8BOM)); err == nil && bytes.Equal(prefix, utf8BOM) {
  19. reader.Discard(len(utf8BOM))
  20. }
  21. jsonFeed := new(JSONFeed)
  22. if err := json.NewDecoder(reader).Decode(jsonFeed); err != nil {
  23. return nil, fmt.Errorf("json: unable to parse feed: %w", err)
  24. }
  25. return NewJSONAdapter(jsonFeed).BuildFeed(baseURL), nil
  26. }