diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dddce8..807d273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ MumbleDJ Changelog ================== +### November 5, 2016 -- `v3.2.1` +* Fixed YouTube video offsets. Now YouTube URLs with `?t=` at the end will start the audio playback at the appropriate position. + ### November 5, 2016 -- `v3.2.0` * Fixed a Go panic that would occur when a YouTube playlist contained a private video. * Added back immediate skipping for tracks/playlists that are skipped by the submitter. This was a feature that was present in the last major version of MumbleDJ but was forgotten when rewriting the bot (sorry!). diff --git a/main.go b/main.go index 0642810..3af1786 100644 --- a/main.go +++ b/main.go @@ -32,7 +32,7 @@ func init() { services.DJ = DJ bot.DJ = DJ - DJ.Version = "v3.2.0" + DJ.Version = "v3.2.1" logrus.SetLevel(logrus.WarnLevel) } diff --git a/services/youtube.go b/services/youtube.go index 5fd0678..3fc6e6d 100644 --- a/services/youtube.go +++ b/services/youtube.go @@ -13,6 +13,8 @@ import ( "math" "net/http" "regexp" + "strings" + "time" "github.com/ChannelMeter/iso8601duration" "github.com/antonholmquist/jason" @@ -98,9 +100,12 @@ func (yt *YouTube) GetTracks(url string, submitter *gumble.User) ([]interfaces.T tracks []interfaces.Track ) + dummyOffset, _ := time.ParseDuration("0s") + urlSplit := strings.Split(url, "?t=") + playlistURL = "https://www.googleapis.com/youtube/v3/playlists?part=snippet&id=%s&key=%s" playlistItemsURL = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails&playlistId=%s&maxResults=%d&key=%s&pageToken=%s" - id, err = yt.getID(url) + id, err = yt.getID(urlSplit[0]) if err != nil { return nil, err } @@ -161,7 +166,7 @@ func (yt *YouTube) GetTracks(url string, submitter *gumble.User) ([]interfaces.T // Unfortunately we have to execute another API call for each video as the YouTube API does not // return video durations from the playlistItems endpoint... - newTrack, _ := yt.getTrack(videoID, submitter) + newTrack, _ := yt.getTrack(videoID, submitter, dummyOffset) newTrack.Playlist = playlist tracks = append(tracks, newTrack) @@ -182,7 +187,13 @@ func (yt *YouTube) GetTracks(url string, submitter *gumble.User) ([]interfaces.T return tracks, nil } - track, err = yt.getTrack(id, submitter) + // Submitter added a track! + offset := dummyOffset + if len(urlSplit) == 2 { + offset, _ = time.ParseDuration(urlSplit[1]) + } + + track, err = yt.getTrack(id, submitter, offset) if err != nil { return nil, err } @@ -190,7 +201,7 @@ func (yt *YouTube) GetTracks(url string, submitter *gumble.User) ([]interfaces.T return tracks, nil } -func (yt *YouTube) getTrack(id string, submitter *gumble.User) (bot.Track, error) { +func (yt *YouTube) getTrack(id string, submitter *gumble.User, offset time.Duration) (bot.Track, error) { var ( resp *http.Response err error @@ -221,15 +232,16 @@ func (yt *YouTube) getTrack(id string, submitter *gumble.User) (bot.Track, error duration := durationConverted.ToDuration() return bot.Track{ - ID: id, - URL: "https://youtube.com/watch?v=" + id, - Title: title, - Author: author, - Submitter: submitter.Name, - Service: yt.ReadableName, - Filename: id + ".track", - ThumbnailURL: thumbnail, - Duration: duration, - Playlist: nil, + ID: id, + URL: "https://youtube.com/watch?v=" + id, + Title: title, + Author: author, + Submitter: submitter.Name, + Service: yt.ReadableName, + Filename: id + ".track", + ThumbnailURL: thumbnail, + Duration: duration, + PlaybackOffset: offset, + Playlist: nil, }, nil }