File: stream.go

package info (click to toggle)
miniflux 2.2.16-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,188 kB
  • sloc: xml: 4,853; javascript: 1,158; sh: 257; makefile: 161
file content (119 lines) | stat: -rw-r--r-- 3,382 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

package googlereader // import "miniflux.app/v2/internal/googlereader"

import (
	"fmt"
	"strings"
)

type StreamType int

const (
	// NoStream - no stream type
	NoStream StreamType = iota
	// ReadStream - read stream type
	ReadStream
	// StarredStream - starred stream type
	StarredStream
	// ReadingListStream - reading list stream type
	ReadingListStream
	// KeptUnreadStream - kept unread stream type
	KeptUnreadStream
	// BroadcastStream - broadcast stream type
	BroadcastStream
	// BroadcastFriendsStream - broadcast friends stream type
	BroadcastFriendsStream
	// LabelStream - label stream type
	LabelStream
	// FeedStream - feed stream type
	FeedStream
	// LikeStream - like stream type
	LikeStream
)

// Stream defines a stream type and its ID.
type Stream struct {
	Type StreamType
	ID   string
}

func (s Stream) String() string {
	return fmt.Sprintf("%v - '%s'", s.Type, s.ID)
}

func (st StreamType) String() string {
	switch st {
	case NoStream:
		return "NoStream"
	case ReadStream:
		return "ReadStream"
	case StarredStream:
		return "StarredStream"
	case ReadingListStream:
		return "ReadingListStream"
	case KeptUnreadStream:
		return "KeptUnreadStream"
	case BroadcastStream:
		return "BroadcastStream"
	case BroadcastFriendsStream:
		return "BroadcastFriendsStream"
	case LabelStream:
		return "LabelStream"
	case FeedStream:
		return "FeedStream"
	case LikeStream:
		return "LikeStream"
	default:
		return st.String()
	}
}

func getStream(streamID string, userID int64) (Stream, error) {
	switch {
	case strings.HasPrefix(streamID, feedPrefix):
		return Stream{Type: FeedStream, ID: strings.TrimPrefix(streamID, feedPrefix)}, nil
	case strings.HasPrefix(streamID, fmt.Sprintf(userStreamPrefix, userID)), strings.HasPrefix(streamID, streamPrefix):
		id := strings.TrimPrefix(streamID, fmt.Sprintf(userStreamPrefix, userID))
		id = strings.TrimPrefix(id, streamPrefix)
		switch id {
		case readStreamSuffix:
			return Stream{ReadStream, ""}, nil
		case starredStreamSuffix:
			return Stream{StarredStream, ""}, nil
		case readingListStreamSuffix:
			return Stream{ReadingListStream, ""}, nil
		case keptUnreadStreamSuffix:
			return Stream{KeptUnreadStream, ""}, nil
		case broadcastStreamSuffix:
			return Stream{BroadcastStream, ""}, nil
		case broadcastFriendsStreamSuffix:
			return Stream{BroadcastFriendsStream, ""}, nil
		case likeStreamSuffix:
			return Stream{LikeStream, ""}, nil
		default:
			return Stream{NoStream, ""}, fmt.Errorf("googlereader: unknown stream with id: %s", id)
		}
	case strings.HasPrefix(streamID, fmt.Sprintf(userLabelPrefix, userID)), strings.HasPrefix(streamID, labelPrefix):
		id := strings.TrimPrefix(streamID, fmt.Sprintf(userLabelPrefix, userID))
		id = strings.TrimPrefix(id, labelPrefix)
		return Stream{LabelStream, id}, nil
	case streamID == "":
		return Stream{NoStream, ""}, nil
	default:
		return Stream{NoStream, ""}, fmt.Errorf("googlereader: unknown stream type: %s", streamID)
	}
}

func getStreams(streamIDs []string, userID int64) ([]Stream, error) {
	streams := make([]Stream, 0, len(streamIDs))
	for _, streamID := range streamIDs {
		stream, err := getStream(streamID, userID)
		if err != nil {
			return []Stream{}, err
		}
		streams = append(streams, stream)
	}
	return streams, nil
}