Documentation
¶
Index ¶
- Constants
- Variables
- func GenerateFromPassword(password string) (encodedHash string, err error)
- func ParsableTimeFormat(time time.Time) string
- type Audit
- type AuditType
- type AutoSkipSetting
- type Bookmark
- type CameraPreset
- type CameraPresetPreference
- type CameraType
- type Chat
- type ChatReaction
- type Course
- func (c *Course) BeforeSave(tx *gorm.DB) (err error)
- func (c Course) CanUseSource(lectureHallID uint, sourceType string) bool
- func (c Course) CompareTo(other Course) bool
- func (c Course) GetCameraPresetPreference() []CameraPresetPreference
- func (c Course) GetLastRecording(u *User) Stream
- func (c Course) GetLiveStreams() []Stream
- func (c Course) GetNextLecture(u *User) Stream
- func (c Course) GetNextLectureDate() time.Time
- func (c Course) GetNextLectureDateFormatted() string
- func (c Course) GetRecordings() []Stream
- func (c Course) GetSourceModeForLectureHall(id uint) SourceMode
- func (c Course) GetSourcePreference() []SourcePreference
- func (c Course) GetStreamUrl(stream Stream) string
- func (c Course) GetUrl() string
- func (c Course) HasNextLecture() bool
- func (c Course) HasRecordings() bool
- func (c Course) HasStreams() bool
- func (c Course) IsEnrolled() bool
- func (c Course) IsHidden() bool
- func (c Course) IsLive() bool
- func (c Course) IsLoggedIn() bool
- func (c Course) IsNextLectureSelfStream(u *User) bool
- func (c Course) IsNextLectureStartingSoon() bool
- func (c Course) IsPublic() bool
- func (c Course) NextLectureHasReachedTimeSlot(u *User) bool
- func (c Course) NumStreams() int
- func (c Course) NumUsers() int
- func (c *Course) SetCameraPresetPreference(pref []CameraPresetPreference)
- func (c *Course) SetSourcePreference(pref []SourcePreference)
- func (c *Course) ShouldGenerateSubtitles(version StreamVersion, lectureHallID uint) bool
- func (c Course) StreamTimes() []string
- func (c *Course) ToDTO(u *User) CourseDTO
- type CourseDTO
- type CustomSpeeds
- type DefaultModeSetting
- type DownloadableVod
- type Email
- type File
- type FileType
- type InfoPage
- type InfoPageType
- type IngestServer
- type LectureHall
- type LectureHallDTO
- type Model
- type Notification
- type NotificationTarget
- type PlaybackSpeedSetting
- type PlaybackSpeedSettings
- type Poll
- type PollOption
- type RegisterLink
- type Runner
- type Semester
- type ServerNotification
- type ShortLink
- type Silence
- type SourceMode
- type SourcePreference
- type Stat
- type Stream
- func (s Stream) Attachments() []File
- func (s Stream) Color() string
- func (s Stream) FirstSilenceAsProgress() float64
- func (s Stream) FriendlyDate() string
- func (s Stream) FriendlyNextDate() string
- func (s Stream) FriendlyTime() string
- func (s Stream) GetDescriptionHTML() string
- func (s Stream) GetJson(lhs []LectureHall, course Course) gin.H
- func (s Stream) GetLGThumbnail() (string, error)
- func (s Stream) GetLGThumbnailForVideoType(videoType VideoType) (string, error)
- func (s Stream) GetName() string
- func (s Stream) GetSilencesJson() string
- func (s Stream) GetStartInSeconds() int
- func (s Stream) GetThumbIdForSource(source string) uint
- func (s Stream) GetVodFiles() []DownloadableVod
- func (s Stream) HLSUrl() string
- func (s Stream) IsComingUp() bool
- func (s Stream) IsConverting() bool
- func (s Stream) IsDownloadable() bool
- func (s Stream) IsPast() bool
- func (s Stream) IsPlanned() bool
- func (s Stream) IsSelfStream() bool
- func (s Stream) IsStartingInMoreThanOneDay() bool
- func (s Stream) IsStartingInOneDay() bool
- func (s Stream) ParsableLiveNowTimestamp() string
- func (s Stream) ParsableStartTime() string
- func (s Stream) TimeSlotReached() bool
- func (s Stream) ToDTO() StreamDTO
- type StreamDTO
- type StreamName
- type StreamProgress
- type StreamProtocol
- type StreamUnit
- type StreamVersion
- type Subtitles
- type Token
- type TranscodingFailure
- type TranscodingProgress
- type UploadKey
- type User
- func (u *User) AdministeredCoursesBetweenSemesters(firstSemester Semester, lastSemester Semester) []Course
- func (u *User) AdministeredCoursesForSemesters(semesters []Semester) []Course
- func (u *User) BeforeCreate(tx *gorm.DB) (err error)
- func (u *User) ComparePasswordAndHash(password string) (match bool, err error)
- func (u *User) CoursesBetweenSemestersWithoutAdministeredCourses(firstSemester Semester, lastSemester Semester) []Course
- func (u *User) CoursesForSemester(year int, term string) []Course
- func (u *User) CoursesForSemestersWithoutAdministeredCourses(semesters []Semester) []Course
- func (u *User) GetAutoSkipEnabled() (AutoSkipSetting, error)
- func (u *User) GetCustomSpeeds() (speeds CustomSpeeds)
- func (u *User) GetDefaultMode() (DefaultModeSetting, error)
- func (u *User) GetEnabledPlaybackSpeeds() (res []float32)
- func (u *User) GetLoginString() string
- func (u *User) GetPlaybackSpeeds() (speeds PlaybackSpeedSettings)
- func (u *User) GetPreferredGreeting() string
- func (u *User) GetPreferredName() string
- func (u *User) GetPreferredView() string
- func (u *User) GetSeekingTime() int
- func (u *User) HasTestCourse() bool
- func (u *User) IsAdminOfCourse(course Course) bool
- func (u *User) IsAllowedToWatchPrivateCourse(course Course) bool
- func (u *User) IsEligibleToSearchForCourse(course Course) bool
- func (u *User) IsEligibleToWatchCourse(course Course) bool
- func (u *User) PreferredNameChangeAllowed() bool
- func (u *User) SetPassword(password string) (err error)
- type UserSetting
- type UserSettingType
- type VideoSection
- type VideoSeekChunk
- type VideoType
- type Worker
Constants ¶
const ( FILETYPE_INVALID = iota // Deprecated: vods can now be downloaded from the edge server using the signed playlist url + ?download=1. FILETYPE_VOD FILETYPE_ATTACHMENT FILETYPE_IMAGE_JPG FILETYPE_THUMB_COMB FILETYPE_THUMB_CAM FILETYPE_THUMB_PRES FILETYPE_THUMB_LG_COMB FILETYPE_THUMB_LG_CAM FILETYPE_THUMB_LG_PRES FILETYPE_THUMB_LG_CAM_PRES // generated from CAM and PRES, preferred over the others )
const ( TargetAll = iota + 1 // TargetAll Is any user, regardless if logged in or not TargetUser // TargetUser Are all users that are logged in TargetStudent // TargetStudent Are all users that are logged in and are students TargetLecturer // TargetLecturer Are all users that are logged in and are lecturers TargetAdmin // TargetAdmin Are all users that are logged in and are admins )
const ( TokenScopeAdmin = "admin" TokenScopeLecturer = "lecturer" )
const ( AdminType = 1 LecturerType = 2 GenericType = 3 StudentType = 4 )
Variables ¶
var ( ErrReplyToReply = errors.New("reply to reply not allowed") ErrReplyToWrongStream = errors.New("reply to message from different stream not allowed") ErrReplyToNoMsg = errors.New("reply to message not found") ErrMessageTooLong = errors.New("message too long") ErrMessageNoText = errors.New("message has no text") ErrCooledDown = errors.New("user is cooled down") )
var ( ErrUsernameTooLong = errors.New("username is too long") ErrUsernameNoText = errors.New("username has no text") )
var ( ErrInvalidHash = errors.New("the encoded hash is not in the correct format") ErrIncompatibleVersion = errors.New("incompatible version of argon2") )
Functions ¶
func GenerateFromPassword ¶
func ParsableTimeFormat ¶
ParsableTimeFormat returns a JavaScript friendly formatted date string
Types ¶
type Audit ¶
type AutoSkipSetting ¶
type AutoSkipSetting struct {
Enabled bool `json:"enabled"`
}
AutoSkipSetting wraps whether auto skip is enabled in JSON
type Bookmark ¶
type Bookmark struct {
gorm.Model
Description string `gorm:"not null" json:"description"`
Hours uint `gorm:"not null" json:"hours"`
Minutes uint `gorm:"not null" json:"minutes"`
Seconds uint `gorm:"not null" json:"seconds"`
UserID uint `gorm:"not null" json:"-"`
StreamID uint `gorm:"not null" json:"-"`
}
type CameraPreset ¶
type CameraPresetPreference ¶
type Chat ¶
type Chat struct {
gorm.Model
UserID string `gorm:"not null" json:"userId"`
UserName string `gorm:"not null" json:"name"`
Message string `gorm:"type:text;not null;index:,class:FULLTEXT" json:"-"`
SanitizedMessage string `gorm:"-" json:"message"` // don't store the sanitized message in the database
StreamID uint `gorm:"not null" json:"-"`
Admin bool `gorm:"not null;default:false" json:"admin"`
Color string `gorm:"not null;default:'#368bd6'" json:"color"`
Visible sql.NullBool `gorm:"not null;default:true" json:"-"`
IsVisible bool `gorm:"-" json:"visible"` // IsVisible is .Bool value of Visible for simplicity
Reactions []ChatReaction `gorm:"foreignKey:chat_id;" json:"reactions"`
AddressedToUsers []User `gorm:"many2many:chat_user_addressedto" json:"-"`
AddressedToIds []uint `gorm:"-" json:"addressedTo"`
Replies []Chat `gorm:"foreignkey:ReplyTo" json:"replies"`
ReplyTo sql.NullInt64 `json:"replyTo"`
Resolved bool `gorm:"not null;default:false" json:"resolved"`
}
func (*Chat) AfterFind ¶
AfterFind is a GORM hook that sanitizes the message after it's loaded from the database.
func (*Chat) BeforeCreate ¶
BeforeCreate is a GORM hook that is called before a new chat is created. Messages won't be saved if any of these apply: - message is empty (after trimming) - message is too long (>maxMessageLength) - user is cooled down (user sent > coolDownMessages messages within coolDown) - message is a reply, and:
- reply is to a reply (not allowed)
- reply is to a message from a different stream
- reply is to a message that doesn't exist
func (*Chat) SanitiseMessage ¶
func (c *Chat) SanitiseMessage()
SanitiseMessage sets chat.SanitizedMessage to the sanitized html version of chat.Message, including <a> tags for links
type ChatReaction ¶
type Course ¶
type Course struct {
gorm.Model
UserID uint `gorm:"not null"` // Owner of the course
Name string `gorm:"not null"`
Slug string `gorm:"not null"` // eg. eidi
Year int `gorm:"not null"` // eg. 2021
TeachingTerm string `gorm:"not null"` // eg. Summer/Winter
TUMOnlineIdentifier string
VODEnabled bool `gorm:"default:true"`
DownloadsEnabled bool `gorm:"default:false"`
ChatEnabled bool `gorm:"default:false"`
AnonymousChatEnabled bool `gorm:"not null;default:true"`
ModeratedChatEnabled bool `gorm:"not null;default:false"`
VodChatEnabled bool
Visibility string `gorm:"default:loggedin"` // public, loggedin or enrolled
Streams []Stream
Users []User `gorm:"many2many:course_users;"`
Admins []User `gorm:"many2many:course_admins;"`
Token string
UserCreatedByToken bool `gorm:"default:false"`
CameraPresetPreferences string // json encoded. e.g. [{lectureHallID:1, presetID:4}, ...]
SourcePreferences string // json encoded. e.g. [{lectureHallID:1, sourceMode:0}, ...]
Language sql.NullString
Pinned bool `gorm:"-"` // Used to determine if the course is pinned when loaded for a specific user.
LivePrivate bool `gorm:"not null; default:false"` // whether Livestreams are private
VodPrivate bool `gorm:"not null; default:false"` // Whether VODs are made private after livestreams
}
func (*Course) BeforeSave ¶
BeforeSave returns an error if the course to be inserted is invalid
func (Course) CanUseSource ¶
CanUseSource returns whether the specified source type is allowed for the lecture hall id given
func (Course) GetCameraPresetPreference ¶
func (c Course) GetCameraPresetPreference() []CameraPresetPreference
GetCameraPresetPreference retrieves the camera preset preferences
func (Course) GetLastRecording ¶
GetLastRecording returns the most recent lecture of the course Assumes an ascending order of c.Streams
func (Course) GetLiveStreams ¶
GetLiveStreams returns the current live streams of the course or an empty slice if none are live
func (Course) GetNextLecture ¶
GetNextLecture returns the next lecture of the course
func (Course) GetNextLectureDate ¶
GetNextLectureDate returns the next lecture date of the course
func (Course) GetNextLectureDateFormatted ¶
GetNextLectureDateFormatted returns a JavaScript friendly formatted date string
func (Course) GetRecordings ¶
GetRecordings returns all recording of this course as streams
func (Course) GetSourceModeForLectureHall ¶
func (c Course) GetSourceModeForLectureHall(id uint) SourceMode
GetSourceModeForLectureHall retrieves the source preference for the given lecture hall, returns default SourcePreference if non-existing
func (Course) GetSourcePreference ¶
func (c Course) GetSourcePreference() []SourcePreference
GetSourcePreference retrieves the source preferences
func (Course) GetStreamUrl ¶
GetStreamUrl returns the URL of the stream, e.g. /w/MyStream/42
func (Course) HasNextLecture ¶
HasNextLecture checks whether there is another upcoming lecture
func (Course) HasRecordings ¶
HasRecordings returns whether the course has any recordings.
func (Course) HasStreams ¶
HasStreams checks whether the lecture has any streams (recorded, live or upcoming) associated to it
func (Course) IsEnrolled ¶
IsEnrolled returns true if visibility is set to 'enrolled' and false if not
func (Course) IsLoggedIn ¶
IsLoggedIn returns true if visibility is set to 'loggedin' and false if not
func (Course) IsNextLectureSelfStream ¶
IsNextLectureSelfStream checks whether the next lecture is a self stream
func (Course) IsNextLectureStartingSoon ¶
IsNextLectureStartingSoon checks whether the course has a lecture that starts soon
func (Course) NextLectureHasReachedTimeSlot ¶
NextLectureHasReachedTimeSlot returns whether the courses next lecture arrived at its timeslot
func (Course) NumStreams ¶
NumStreams returns the number of streams for the course that are VoDs or live
func (*Course) SetCameraPresetPreference ¶
func (c *Course) SetCameraPresetPreference(pref []CameraPresetPreference)
SetCameraPresetPreference updates the camera preset preferences
func (*Course) SetSourcePreference ¶
func (c *Course) SetSourcePreference(pref []SourcePreference)
SetSourcePreference updates the source preferences
func (*Course) ShouldGenerateSubtitles ¶ added in v1.5.7
func (c *Course) ShouldGenerateSubtitles(version StreamVersion, lectureHallID uint) bool
ShouldGenerateSubtitles returns true for the optimal StreamVersion for subtitle generation. If no language is set for the course, false is always returned. If the stream is a self-stream, it will return true for the COMB version. For lecture hall streams, it checks the source preference of the course for the given lecture hall ID, returning true for the respective version if it's scheduled to stream only from that (i.e. true for cam if only streamed as cam) otherwise the PRES version is preferred.
func (Course) StreamTimes ¶
type CustomSpeeds ¶
type CustomSpeeds []float32
type DefaultModeSetting ¶
type DefaultModeSetting struct {
Beta bool `json:"beta"`
}
DefaultModeSetting wraps whether the default stream mode for the user is beta
type DownloadableVod ¶
type DownloadableVod struct {
FriendlyName, DownloadURL string
}
type Email ¶
type Email struct {
gorm.Model
From string `gorm:"not null"`
To string `gorm:"not null"`
Subject string `gorm:"not null"`
Body string `gorm:"longtext;not null"`
Success bool `gorm:"not null;default:false"`
Retries int `gorm:"not null;default:0"`
LastTry time.Time `gorm:"default:null"`
Errors string `gorm:"longtext;default:null"`
}
Email represents an email to be sent.
type File ¶
type File struct {
gorm.Model
StreamID uint `gorm:"not null"`
Path string `gorm:"not null"`
Filename string
Type FileType `gorm:"not null; default: 1"`
}
func (File) GetDownloadFileName ¶
func (File) GetFriendlyFileName ¶
func (File) GetVodTypeByName ¶
GetVodTypeByName infers the type of a video file based on its name.
type InfoPage ¶
type InfoPage struct {
gorm.Model
Name string `gorm:"not null"` // e.g. 'privacy', 'imprint',...
RawContent string `gorm:"text; not null"`
Type InfoPageType `gorm:"not null; default: 1"`
}
type IngestServer ¶
type IngestServer struct {
gorm.Model `json:"gorm_model"`
Url string `json:"url"` // e.g. rtmp://user:[email protected]
OutUrl string `gorm:"not null"` // e.g. https://out.server.com/streams/%s/playlist.m3u8 where %s is the stream name
Workload int `json:"workload,omitempty"` // # of streams currently ingesting to this server
StreamNames []StreamName // array of stream names that will be assigned to this server
}
IngestServer represents a server we ingest our streams to. This is used for load balancing.
type LectureHall ¶
type LectureHall struct {
gorm.Model
Name string `gorm:"not null"` // as in smp (e.g. room_00_13_009A)
FullName string `gorm:"not null"` // e.g. '5613.EG.009A (00.13.009A, Seminarraum), Boltzmannstr. 3(5613), 85748 Garching b. München'
StreamProtocol StreamProtocol `gorm:"not null; default:1"` // 1 = rtsp, 2 = srt
CombIP string
PresIP string
CamIP string
CameraIP string // ip of the actual camera (not smp)
CameraType CameraType `gorm:"not null; default:1"`
Streams []Stream
CameraPresets []CameraPreset
RoomID int // used by TUMOnline
PwrCtrlIp string // power control api for red live light
ExternalURL string
// Legacy is true if a stream is handled by a worker, false if handled by a runner.
// todo: remove with worker code
Legacy bool `gorm:"not null; default:true"`
}
func (*LectureHall) BeforeSave ¶
func (l *LectureHall) BeforeSave(*gorm.DB) error
BeforeSave returns an error if either source is invalid.
func (LectureHall) NumSources ¶
func (l LectureHall) NumSources() int
func (*LectureHall) ToDTO ¶
func (l *LectureHall) ToDTO() *LectureHallDTO
type LectureHallDTO ¶
type Model ¶
type Model struct {
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"-"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}
Model is a base model that can be embedded in other models it's basically the same as gorm.Model but with convenient json annotations
type Notification ¶
type Notification struct {
Model
Title *string `json:"title,omitempty"`
Body string `json:"-" gorm:"not null"`
Target NotificationTarget `json:"target" gorm:"not null; default:1"`
// SanitizedBody is the body of the notification, converted from markdown to HTML
SanitizedBody string `json:"body" gorm:"-"`
}
Notification is a message (e.g. a feature alert) that is displayed to users
func (*Notification) AfterFind ¶
func (n *Notification) AfterFind(_ *gorm.DB) error
AfterFind populates the SanitizedBody after getting the Notification from the database
func (Notification) GetBodyForGoTemplate ¶
func (n Notification) GetBodyForGoTemplate() template.HTML
type NotificationTarget ¶
type NotificationTarget int
NotificationTarget is a User group the Notification is displayed to
type PlaybackSpeedSetting ¶
type PlaybackSpeedSettings ¶
type PlaybackSpeedSettings []PlaybackSpeedSetting
func (PlaybackSpeedSettings) GetEnabled ¶
func (s PlaybackSpeedSettings) GetEnabled() (res []float32)
type Poll ¶
type Poll struct {
gorm.Model
StreamID uint // used by gorm
Stream Stream `gorm:"foreignKey:stream_id;not null;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`
Question string `gorm:"not null" json:"question"`
Active bool `gorm:"not null;default:true" json:"active"`
PollOptions []PollOption `gorm:"many2many:chat_poll_options" json:"pollOptions"`
}
type PollOption ¶
type PollOption struct {
gorm.Model
Answer string `gorm:"not null" json:"answer"`
Votes []User `gorm:"many2many:poll_option_user_votes" json:"-"`
}
func (PollOption) GetStatsMap ¶
func (o PollOption) GetStatsMap(votes int64) gin.H
type RegisterLink ¶
type Runner ¶
type Runner struct {
// Hostname is the hostname of the runner
Hostname string `gorm:"column:hostname;primaryKey;unique;not null"`
// Port is the port, the runners gRPC server listens on.
Port uint32 `gorm:"column:port;not null"`
// LastSeen is the timestamp of the last successful heartbeat.
// if the runner wasn't seen in more than 5 seconds, it's considered dead
// and won't be assigned further jobs.
LastSeen time.Time `gorm:"column:last_seen;"`
// TimeOfRegister is the timestamp of the register message.
TimeOfRegister time.Time `gorm:"column:time_of_register;"`
// Draining is true if the runner is shutting down.
// In this case, no further jobs will be assigned.
Draining bool `gorm:"column:draining;not null;default:false"`
// JobCount is the number of currently running jobs.
// It's updated through heartbeats and used to select
// the runner with the least workload for new jobs.
JobCount uint64 `gorm:"column:job_count;not null;default:0"`
// Version is the version of the runner.
Version string `gorm:"column:version;not null;default:'dev'"`
}
Runner represents a runner handling streams, converting videos, extracting silence from audios, creating thumbnails, etc.
func (*Runner) BeforeCreate ¶
BeforeCreate returns an error, if Runner r is invalid
type Semester ¶
func (*Semester) IsBetweenSemesters ¶
IsBetweenSemesters checks if s is between firstSemester (inclusive) and lastSemester (inclusive)
func (*Semester) IsGreaterEqualThan ¶
IsGreaterEqualThan checks if s comes after or is equal to s1
func (*Semester) IsInRangeOfSemesters ¶
IsInRangeOfSemesters checks if s is element of semesters slice
type ServerNotification ¶
type ServerNotification struct {
gorm.Model
Text string `gorm:"not null"`
Warn bool `gorm:"not null;default:false"` // if false -> Info
Start time.Time `gorm:"not null"`
Expires time.Time `gorm:"not null"`
}
ServerNotification todo: rename to ServerAlert to avoid confusion with Notification
func (ServerNotification) BeforeCreate ¶
func (s ServerNotification) BeforeCreate(tx *gorm.DB) error
func (ServerNotification) FormatExpires ¶
func (s ServerNotification) FormatExpires() string
func (ServerNotification) FormatFrom ¶
func (s ServerNotification) FormatFrom() string
func (ServerNotification) HTML ¶
func (s ServerNotification) HTML() template.HTML
type ShortLink ¶
type ShortLink struct {
gorm.Model
Link string `gorm:"type:varchar(256); unique; not null"`
CourseId uint `gorm:"not null"`
}
ShortLink friendly name for a link to courses highlight page
type SourceMode ¶
type SourceMode int
SourceMode 0 -> COMB, 1-> PRES, 2 -> CAM
const ( SourceModeCOMB SourceMode = iota SourceModePRESOnly SourceModeCAMOnly )
type SourcePreference ¶
type SourcePreference struct {
LectureHallID uint `json:"lecture_hall_id"`
SourceMode SourceMode `json:"source_mode"`
}
type Stream ¶
type Stream struct {
gorm.Model
Name string `gorm:"index:,class:FULLTEXT"`
Description string `gorm:"type:text;index:,class:FULLTEXT"`
CourseID uint
Start time.Time `gorm:"not null"`
End time.Time `gorm:"not null"`
ChatEnabled bool `gorm:"default:null"`
RoomName string
RoomCode string
EventTypeName string
TUMOnlineEventID uint
SeriesIdentifier string `gorm:"default:null"`
StreamKey string `gorm:"not null"`
PlaylistUrl string
PlaylistUrlPRES string
PlaylistUrlCAM string
LiveNow bool `gorm:"not null"`
LiveNowTimestamp time.Time `gorm:"default:null;column:live_now_timestamp"`
Recording bool
Premiere bool `gorm:"default:null"`
Ended bool `gorm:"default:null"`
Chats []Chat
Stats []Stat
Units []StreamUnit
VodViews uint `gorm:"default:0"` // todo: remove me before next semester
StartOffset uint `gorm:"default:null"`
EndOffset uint `gorm:"default:null"`
LectureHallID uint `gorm:"default:null"`
Silences []Silence
Files []File `gorm:"foreignKey:StreamID"`
ThumbInterval uint32 `gorm:"default:null"`
StreamName string
Duration sql.NullInt32 `gorm:"default:null"`
StreamWorkers []Worker `gorm:"many2many:stream_workers;"`
StreamProgresses []StreamProgress `gorm:"foreignKey:StreamID"`
VideoSections []VideoSection
TranscodingProgresses []TranscodingProgress `gorm:"foreignKey:StreamID"`
Private bool `gorm:"not null;default:false"`
Watched bool `gorm:"-"` // Used to determine if stream is watched when loaded for a specific user.
}
func (Stream) Attachments ¶
func (Stream) FirstSilenceAsProgress ¶
FirstSilenceAsProgress returns the end of the first silence as a quotient of the length of the stream
func (Stream) FriendlyDate ¶
func (Stream) FriendlyNextDate ¶
func (Stream) FriendlyTime ¶
func (Stream) GetDescriptionHTML ¶
func (Stream) GetLGThumbnail ¶
func (Stream) GetLGThumbnailForVideoType ¶
func (Stream) GetSilencesJson ¶
func (Stream) GetStartInSeconds ¶
GetStartInSeconds returns the number of seconds until the stream starts (or 0 if it has already started or is a vod)
func (Stream) GetThumbIdForSource ¶
GetThumbIdForSource returns the id of file that stores the thumbnail sprite for a specific source type.
func (Stream) GetVodFiles ¶
func (s Stream) GetVodFiles() []DownloadableVod
GetVodFiles returns all downloadable files that user can see when using the download dropdown for a stream.
func (Stream) IsComingUp ¶
IsComingUp returns whether the stream begins in 30 minutes
func (Stream) IsConverting ¶
func (Stream) IsDownloadable ¶
IsDownloadable returns true if the stream is a recording and has at least one stream associated with it.
func (Stream) IsSelfStream ¶
IsSelfStream returns whether the stream is a scheduled stream in a lecture hall
func (Stream) IsStartingInMoreThanOneDay ¶
IsStartingInMoreThanOneDay returns whether the stream starts in at least 2 days
func (Stream) IsStartingInOneDay ¶
IsStartingInOneDay returns whether the stream starts within 1 day
func (Stream) ParsableLiveNowTimestamp ¶
ParsableLiveNowTimestamp returns a JavaScript friendly formatted date string
func (Stream) ParsableStartTime ¶
ParsableStartTime returns a JavaScript friendly formatted date string
func (Stream) TimeSlotReached ¶
TimeSlotReached returns whether stream has passed the starting time
type StreamName ¶
type StreamName struct {
gorm.Model
StreamName string `gorm:"type:varchar(64); unique; not null"`
IsTranscoding bool `gorm:"not null;default:false"`
IngestServerID uint `gorm:"not null"`
StreamID uint // Is null when the slot is not used
FreedAt time.Time `gorm:"not null;default:0"`
}
StreamName is essentially a "streaming slot" used for load balancing
type StreamProgress ¶
type StreamProgress struct {
Progress float64 `gorm:"not null" json:"progress"` // The progress of the stream as represented as a floating point value between 0 and 1.
Watched bool `gorm:"not null;default:false" json:"watched"` // Whether the user has marked the stream as watched.
// We need to use a primary key in order to use ON CONFLICT in dao/progress.go, same as e.g. https://www.sqlite.org/lang_conflict.html.
StreamID uint `gorm:"primaryKey" json:"streamId"`
UserID uint `gorm:"primaryKey" json:"-"`
}
StreamProgress represents the progress of a stream or video. Currently, it is only used for VoDs.
type StreamUnit ¶
type StreamUnit struct {
gorm.Model
UnitName string
UnitDescription string
UnitStart uint `gorm:"not null"`
UnitEnd uint `gorm:"not null"`
StreamID uint `gorm:"not null"`
}
func (StreamUnit) GetDescriptionHTML ¶
func (s StreamUnit) GetDescriptionHTML() template.HTML
func (StreamUnit) GetRoundedUnitLen ¶
func (s StreamUnit) GetRoundedUnitLen() string
func (StreamUnit) GetUnitDurationMS ¶
func (s StreamUnit) GetUnitDurationMS() uint
type StreamVersion ¶
type StreamVersion string
const ( COMB StreamVersion = "COMB" CAM StreamVersion = "CAM" PRES StreamVersion = "PRES" )
type Subtitles ¶
type Subtitles struct {
gorm.Model
StreamID uint `gorm:"not null"`
Content string `gorm:"not null"` // the .srt content provided by the voice-service
Language string `gorm:"not null"`
}
Subtitles represents subtitles for a particular stream in a particular language
func (*Subtitles) BeforeCreate ¶
BeforeCreate is currently not implemented for Subtitles
type Token ¶
type Token struct {
gorm.Model
UserID uint // used by gorm
User User `gorm:"foreignKey:user_id;not null;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` // creator of the token
Token string `json:"token" gorm:"not null"` // secret token
Expires sql.NullTime `json:"expires"` // expiration date (null if none)
Scope string `json:"scope" gorm:"not null"` // scope of the token, currently only admin
LastUse sql.NullTime `json:"last_use"` // last time the token was used
}
Token can be used to authenticate instead of a user account
type TranscodingFailure ¶
type TranscodingFailure struct {
gorm.Model
StreamID uint `gorm:"not null"`
Stream Stream
Version StreamVersion `gorm:"not null"`
Logs string `gorm:"not null"`
ExitCode int
FilePath string `gorm:"not null"` // the source file that could not be transcoded
Hostname string `gorm:"not null"` // the hostname of the worker that failed
// Ignored by gorm:
FriendlyTime string `gorm:"-"`
}
TranscodingFailure represents a failed transcoding attempt
type TranscodingProgress ¶
type TranscodingProgress struct {
StreamID uint `gorm:"primaryKey" json:"streamID"`
Version StreamVersion `gorm:"primaryKey" json:"version"`
Progress int `gorm:"not null; default:0" json:"progress"`
}
TranscodingProgress is the progress as a percentage of the conversion of a single stream view (e.g. stream 123, COMB view)
type UploadKey ¶
type UploadKey struct {
gorm.Model
UploadKey string `gorm:"not null"`
Stream Stream
StreamID uint
VideoType VideoType `gorm:"not null"`
}
UploadKey represents a key that is created when a user uploads a file, sent to the worker with the upload request and back to TUM-Live to authenticate the request.
type User ¶
type User struct {
gorm.Model
Name string `gorm:"type:varchar(80); not null" json:"name"`
LastName *string `json:"-"`
Email sql.NullString `gorm:"type:varchar(256); uniqueIndex; default:null" json:"-"`
MatriculationNumber string `gorm:"type:varchar(256); uniqueIndex; default:null" json:"-"`
LrzID string `json:"-"`
Role uint `gorm:"default:4" json:"-"` // AdminType = 1, LecturerType = 2, GenericType = 3, StudentType = 4
Password string `gorm:"default:null" json:"-"`
Courses []Course `gorm:"many2many:course_users" json:"-"` // courses a lecturer invited this user to
AdministeredCourses []Course `gorm:"many2many:course_admins"` // courses this user is an admin of
PinnedCourses []Course `gorm:"many2many:pinned_courses"`
Settings []UserSetting `gorm:"foreignkey:UserID"`
Bookmarks []Bookmark `gorm:"foreignkey:UserID" json:"-"`
}
func (*User) AdministeredCoursesBetweenSemesters ¶
func (u *User) AdministeredCoursesBetweenSemesters(firstSemester Semester, lastSemester Semester) []Course
AdministeredCoursesBetweenSemesters returns all courses, that the user is a course admin of, between firstSemester and lasSemester
func (*User) AdministeredCoursesForSemesters ¶
AdministeredCoursesForSemesters returns all courses, that the user is a course admin of, in the given semester range or semesters
func (*User) BeforeCreate ¶
BeforeCreate is a GORM hook that is called before a new user is created. Users won't be saved if any of these apply: - username is empty (after trimming) - username is too long (>maxUsernameLength)
func (*User) ComparePasswordAndHash ¶
func (*User) CoursesBetweenSemestersWithoutAdministeredCourses ¶
func (u *User) CoursesBetweenSemestersWithoutAdministeredCourses(firstSemester Semester, lastSemester Semester) []Course
CoursesBetweenSemestersWithoutAdministeredCourses returns all courses of the user in the given semester range or semesters excluding administered courses
func (*User) CoursesForSemestersWithoutAdministeredCourses ¶
CoursesForSemestersWithoutAdministeredCourses returns all courses of the user in the given semester range or semesters excluding administered courses
func (*User) GetAutoSkipEnabled ¶
func (u *User) GetAutoSkipEnabled() (AutoSkipSetting, error)
GetAutoSkipEnabled returns whether the user has enabled auto skip
func (*User) GetCustomSpeeds ¶
func (u *User) GetCustomSpeeds() (speeds CustomSpeeds)
func (*User) GetDefaultMode ¶
func (u *User) GetDefaultMode() (DefaultModeSetting, error)
func (*User) GetEnabledPlaybackSpeeds ¶
func (*User) GetLoginString ¶
GetLoginString returns the email if it is set, otherwise the lrzID
func (*User) GetPlaybackSpeeds ¶
func (u *User) GetPlaybackSpeeds() (speeds PlaybackSpeedSettings)
func (*User) GetPreferredGreeting ¶
GetPreferredGreeting returns the preferred greeting of the user if set, otherwise Moin
func (*User) GetPreferredName ¶
GetPreferredName returns the preferred name of the user if set, otherwise the firstName from TUMOnline
func (*User) GetPreferredView ¶
func (*User) GetSeekingTime ¶
GetSeekingTime returns the seeking time preference for the user. If the user is nil, the default seeking time of 15 seconds is returned.
func (*User) HasTestCourse ¶
HasTestCourse checks if the user has a test course
func (*User) IsAdminOfCourse ¶
IsAdminOfCourse checks if the user is an admin of the course
func (*User) IsAllowedToWatchPrivateCourse ¶
IsAllowedToWatchPrivateCourse checks if the user is allowed to watch a private course.
func (*User) IsEligibleToSearchForCourse ¶
IsEligibleToSearchForCourse is a stricter version of IsEligibleToWatchCourse; in case of hidden course, it returns true only when the user is an admin of the course
func (*User) IsEligibleToWatchCourse ¶
IsEligibleToWatchCourse checks if the user is allowed to access the course
func (*User) PreferredNameChangeAllowed ¶
PreferredNameChangeAllowed returns false if the user has set a preferred name within the last 3 months, otherwise true
func (*User) SetPassword ¶
type UserSetting ¶
type UserSetting struct {
gorm.Model
UserID uint `gorm:"not null"`
Type UserSettingType `gorm:"not null"`
Value string `gorm:"not null"` // json encoded setting
}
type UserSettingType ¶
type UserSettingType int
const ( PreferredName UserSettingType = iota + 1 Greeting CustomPlaybackSpeeds SeekingTime UserDefinedSpeeds AutoSkip DefaultMode LectureView )
type VideoSection ¶
type VideoSection struct {
gorm.Model
Description string `gorm:"not null;index:,class:FULLTEXT" json:"description"`
StartHours uint `gorm:"not null" json:"startHours"`
StartMinutes uint `gorm:"not null" json:"startMinutes"`
StartSeconds uint `gorm:"not null" json:"startSeconds"`
StreamID uint `gorm:"not null" json:"streamID"`
FileID uint `gorm:"not null" json:"fileID"`
}
type VideoSeekChunk ¶
type Worker ¶
type Worker struct {
WorkerID string `gorm:"primaryKey"`
Host string
Status string
Workload uint // How much the worker has to do. +1 per silence detection job, +2 per converting job, +3 per streaming job
LastSeen time.Time
// VM stats:
CPU string
Memory string
Disk string
Uptime string
Version string
}
Source Files
¶
- audit.go
- bookmark.go
- camera_preset.go
- chat.go
- chat_reaction.go
- course.go
- email.go
- file.go
- info-page.go
- ingest-server.go
- lecture_hall.go
- model-base.go
- model_logger.go
- notification.go
- poll.go
- progress.go
- register_link.go
- runner.go
- semester.go
- server-notification.go
- shortlink.go
- silence.go
- stat.go
- stream-name.go
- stream-unit.go
- stream.go
- subtitles.go
- token.go
- transcoding-failure.go
- transcodingProgress.go
- upload-key.go
- user.go
- video-section.go
- video-seek-chunk.go
- worker.go