-
Notifications
You must be signed in to change notification settings - Fork 1
/
datamodel.puml
183 lines (147 loc) · 4.8 KB
/
datamodel.puml
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
@startuml datamodel
' The primary collection an Item is related to, e.g. a Podcast, Show or Conference
interface Collection {
externalIds(system: Directory): [String!]
' title of the podcast that is the primary field to be used to represent the podcast in directories, lists and other uses.
title: String!
' subtitle is an extension to the title. The subtitle is meant to clarify what the podcast is about. While a title can be anything, a subtitle should be more descriptive in what the content actually wants to convey and what the most important information is, you want everybody want to know about the offering.
subtitle: String
' A summary is a much more precise and elaborate description of the podcast\'s content. While title and subtitle are rather concise, a summary is meant to consist of one or more sentences that form a paragraph or more.
summary: String
description: HTML
image: Image
' imageUrl: URL @deprecated(reason: "try to use image.url if possible")
link: URL
'items: ItemsConnection
}
interface Grouping {
type: GroupingVariant!
title: String!
seasonNumber: Int
items: ItemsConnection
}
Grouping "1" -- "*" Item
interface Podcast {
type: PodcastVariant
episodes: ItemsConnection
feedUrls: [URL!]
}
Show "1" -- "*" Item
Podcast -right-> PodcastVariant
Podcast "1" -- "*" Grouping
Collection <|-- Show
Podcast <|-- Show
'Grouping <|-- Show
' A single item of a Podcast e.g. a single Episode, Teaser, Talk or Lecture
interface Item {
guid: ID!
externalIds(system: Directory): [String!]
' Ordinal of the episode, either globally e.g. "72" or per season
episodeNumber: Int
' e.g. "FG072 Verantwortung in der Informatik"
title: String!
subtitle: String
summary: String
description: HTML
publicationDate: Datetime!
depublicationDate: Datetime
duration: Duration!
durationSeconds: Int!
link: URL
image: Image
'imageUrl: URL @deprecated(reason: "try to use image.url if possible")
' an guid grouping this Item to a season, series or multi part publication
groupingId: ID
' Audio Assets
' - media Assets played by an audio player
' - format support depends on the used browser (https://en.wikipedia.org/wiki/HTML5_audio'Supported_audio_coding_formats)
' - also allows HLS streams
audios: [Asset!]!
' Files
' - list of files available for download
' - if no files are present, a player will use audio assets as downloads
files: [Asset!]
' Contributors are natural persons providing content to that item
contributors: [Contributor!]
' Chapters are sections of an episode
chapters: [Chapter!],
' Transcripts are full text
' transcripts: [Transcript!]
show: Collection
nextEpisode: Item
}
Item "1" --> "*" Asset : audios
Item "0" --> "*" Asset : files
Item --> Item : nextEpisode
'Item --> Contributor
Item --> Marker
' chapters of an Item, following the Podlove Simple Chapters format (https://podlove.org/simple-chapters/)
interface Marker {
' start time following [hh]:[mm]:[ss].[sss] format
start: Duration!
title: String!
' image that will be presented in the header section if the chapter is available
image: Image
'imageUrl: URL @deprecated(reason: "try to use image.url if possible")
' Link related to the chapter
' TODO: should we call this link instead?
href: URL
}
Marker <|-- Chapter
Marker <|- Region
Region o- Chapter
class Region {
end: Duration!
}
interface Asset {
' absolute path to media asset
url: URL!
' file size in byte
size: Int!
' title to be displayed in download tab e.g. "MPEG-4 AAC Audio (m4a)"
title: String
' media asset mimeType e.g. "audio/mp4"
mimeType: String!
}
interface Contributor {
' used as a reference e.g. in transcripts
id: ID!
' name of the contributor e.g. Hans Meier
name: String!
' URI identifying the person e.g. his personal domain or this main social media profile e.g. Twitter/Mastodon
uri: URL
' avatar e.g. profile photo of the contributor
avatar: Image
'avatarUrl: URL @deprecated(reason: "try to use avatar.url if possible")
' contributors group e.g. { id: "1", slug: "onair", title: "On Air" }
wikidataId: String
}
(Item, Contributor) . Contribution
interface Contribution {
role: Role
group: String
}
interface Image {
url: URL!
description: String
attribution: String
}
' An object with a globally unique `ID`.
interface Node {
' A globally unique identifier. Can be used in various places throughout the system to identify this single value.
nodeId: ID!
}
interface Organization {
name: String!
image: Image
uri: URL
wikidataId: String
}
Organization -- Podcast
enum PodcastVariant {
' episodic: Stand-alone episodes that should be presented last-to-first.
EPISODIC
' Serial: Episodes that should be presented first-to-last. Great for narratives, storytelling, thematic, and multiple seasons.
SERIAL
}
@enduml