diff --git a/commands.go b/commands.go index a8e0c43..2c4c556 100644 --- a/commands.go +++ b/commands.go @@ -195,6 +195,8 @@ func add(user *gumble.User, username, url string) { } } } + } else if fmt.Sprint(err) == "video exceeds the maximum allowed duration." { + dj.SendPrivateMessage(user, VIDEO_TOO_LONG_MSG) } else { dj.SendPrivateMessage(user, INVALID_YOUTUBE_ID_MSG) } @@ -208,7 +210,7 @@ func add(user *gumble.User, username, url string) { oldLength := dj.queue.Len() if newPlaylist, err := NewPlaylist(username, shortUrl); err == nil { dj.client.Self.Channel.Send(fmt.Sprintf(PLAYLIST_ADDED_HTML, username, newPlaylist.title), false) - if oldLength == 0 && !dj.audioStream.IsPlaying() { + if oldLength == 0 && dj.queue.Len() != 0 && !dj.audioStream.IsPlaying() { if err := dj.queue.CurrentSong().Download(); err == nil { dj.queue.CurrentSong().Play() } else { diff --git a/mumbledj.gcfg b/mumbledj.gcfg index ab6e099..e674c12 100644 --- a/mumbledj.gcfg +++ b/mumbledj.gcfg @@ -22,6 +22,9 @@ PlaylistSkipRatio = 0.5 # NOTE: If you do not want a comment by default, set the variable equal to an empty string (""). DefaultComment = "Hello! I am a bot. Type !help for a list of commands." +# Maximum song duration in seconds (0 = unristrcted) +# Default Value: 0 +MaxSongDuration = 0 [Cache] diff --git a/parseconfig.go b/parseconfig.go index 27d8ed1..18de314 100644 --- a/parseconfig.go +++ b/parseconfig.go @@ -20,6 +20,7 @@ type DjConfig struct { SkipRatio float32 PlaylistSkipRatio float32 DefaultComment string + MaxSongDuration int } Cache struct { Enabled bool diff --git a/playlist.go b/playlist.go index 9fed006..06cbfff 100644 --- a/playlist.go +++ b/playlist.go @@ -58,9 +58,9 @@ func NewPlaylist(user, id string) (*Playlist, error) { id: id, title: playlistTitle, } - + j := 0 for i := 0; i < playlistItems; i++ { - index := strconv.Itoa(i) + index := strconv.Itoa(j) songTitle, _ := jq.String("data", "items", index, "video", "title") songId, _ := jq.String("data", "items", index, "video", "id") songThumbnail, _ := jq.String("data", "items", index, "video", "thumbnail", "hqDefault") @@ -75,7 +75,11 @@ func NewPlaylist(user, id string) (*Playlist, error) { playlist: playlist, dontSkip: false, } - dj.queue.AddSong(newSong) + // Don't spam the chat if a playlist contains songs that are too long + if dj.conf.General.MaxSongDuration == 0 || duration <= dj.conf.General.MaxSongDuration { + dj.queue.AddSong(newSong) + j += 1 + } } return playlist, nil diff --git a/song.go b/song.go index c07315f..05f4beb 100644 --- a/song.go +++ b/song.go @@ -60,6 +60,10 @@ func NewSong(user, id string, playlist *Playlist) (*Song, error) { duration, _ := jq.Int("data", "duration") videoDuration := fmt.Sprintf("%d:%02d", duration/60, duration%60) + if dj.conf.General.MaxSongDuration > 0 && duration > dj.conf.General.MaxSongDuration { + return nil, errors.New("video exceeds the maximum allowed duration.") + } + song := &Song{ submitter: user, title: videoTitle, diff --git a/strings.go b/strings.go index cd151c6..3a43444 100644 --- a/strings.go +++ b/strings.go @@ -22,6 +22,9 @@ const CHANNEL_DOES_NOT_EXIST_MSG = "The channel you specified does not exist." // Message shown to users when they attempt to add an invalid URL to the queue. const INVALID_URL_MSG = "The URL you submitted does not match the required format." +// Message shown to users when they attempt to add a video that's too long +const VIDEO_TOO_LONG_MSG = "The video you submitted exceeds the duration allowed by the server." + // Message shown to users when they attempt to perform an action on a song when // no song is playing. const NO_MUSIC_PLAYING_MSG = "There is no music playing at the moment."