Compare commits
6 Commits
Author | SHA1 | Date |
---|---|---|
Simon Bruder | 327235c451 | |
Simon Bruder | d63397b1ed | |
Simon Bruder | 1da5439358 | |
Simon Bruder | 58c9465add | |
Matthieu Grieger | dff929ddc9 | |
Matthieu Grieger | 138c1008eb |
|
@ -0,0 +1 @@
|
|||
Dockerfile
|
|
@ -0,0 +1,13 @@
|
|||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
settings:
|
||||
registry: r.sbruder.de
|
||||
username:
|
||||
from_secret: docker_username
|
||||
password:
|
||||
from_secret: docker_password
|
||||
repo: r.sbruder.de/mumbledj
|
|
@ -1,6 +1,9 @@
|
|||
MumbleDJ Changelog
|
||||
==================
|
||||
|
||||
### November 5, 2016 -- `v3.2.1`
|
||||
* Fixed YouTube video offsets. Now YouTube URLs with `?t=<timestamp>` 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!).
|
||||
|
|
44
Dockerfile
44
Dockerfile
|
@ -1,19 +1,39 @@
|
|||
FROM alpine:3.3
|
||||
FROM golang:alpine as builder
|
||||
|
||||
ENV GOPATH=/
|
||||
RUN apk add --no-cache \
|
||||
build-base \
|
||||
opus-dev
|
||||
|
||||
RUN apk add --update ca-certificates go ffmpeg make build-base opus-dev python aria2
|
||||
RUN apk upgrade
|
||||
COPY . /go/src/github.com/matthieugrieger/mumbledj
|
||||
WORKDIR /go/src/github.com/matthieugrieger/mumbledj
|
||||
|
||||
RUN wget https://yt-dl.org/downloads/latest/youtube-dl -O /bin/youtube-dl && chmod a+x /bin/youtube-dl
|
||||
RUN go get -v \
|
||||
&& go build -v -ldflags="-s -w"
|
||||
|
||||
COPY . /src/github.com/matthieugrieger/mumbledj
|
||||
COPY config.yaml /root/.config/mumbledj/config.yaml
|
||||
FROM alpine
|
||||
|
||||
WORKDIR /src/github.com/matthieugrieger/mumbledj
|
||||
RUN adduser -D mumbledj
|
||||
|
||||
RUN make
|
||||
RUN make install
|
||||
RUN apk del go make build-base && rm -rf /var/cache/apk/*
|
||||
RUN apk add --no-cache \
|
||||
aria2 \
|
||||
libressl \
|
||||
python2
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/mumbledj"]
|
||||
RUN wget -O /usr/bin/youtube-dl https://yt-dl.org/downloads/latest/youtube-dl \
|
||||
&& chmod +x /usr/bin/youtube-dl
|
||||
|
||||
RUN wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz \
|
||||
&& tar xvf ffmpeg-git-amd64-static.tar.xz '*/ffmpeg' || true \
|
||||
&& mv ffmpeg-git-*-amd64-static/ffmpeg /usr/bin/ffmpeg \
|
||||
&& rm -rf ffmpeg-git-* \
|
||||
&& apk add --no-cache upx \
|
||||
&& upx /usr/bin/ffmpeg \
|
||||
&& apk del upx
|
||||
|
||||
COPY --from=builder /go/src/github.com/matthieugrieger/mumbledj/mumbledj /usr/bin/mumbledj
|
||||
|
||||
COPY config.yaml /home/mumbledj/.config/mumbledj/config.yaml
|
||||
|
||||
USER mumbledj
|
||||
|
||||
ENTRYPOINT ["/usr/bin/mumbledj"]
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
<p align="center"><b>A Mumble bot that plays audio fetched from various media websites.</b></p>
|
||||
<p align="center"><a href="https://travis-ci.org/matthieugrieger/mumbledj"><img src="https://travis-ci.org/matthieugrieger/mumbledj.svg?branch=master"/></a> <a href="https://raw.githubusercontent.com/matthieugrieger/mumbledj/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg"/></a> <a href="https://github.com/matthieugrieger/mumbledj/releases"><img src="https://img.shields.io/github/release/matthieugrieger/mumbledj.svg"/></a> <a href="https://goreportcard.com/report/github.com/matthieugrieger/mumbledj"><img src="https://goreportcard.com/badge/github.com/matthieugrieger/mumbledj"/></a> <a href="https://codecov.io/gh/matthieugrieger/mumbledj"><img src="https://img.shields.io/codecov/c/github/matthieugrieger/mumbledj.svg"/></a> <a href="https://gitter.im/matthieugrieger/mumbledj"><img src="https://img.shields.io/gitter/room/matthieugrieger/mumbledj.svg" /></a></p>
|
||||
|
||||
<p align="center"><b>Unfortunately, this project is no longer maintained. Don't expect any responses on bug reports, feature requests, etc. Forks are welcome!</b></p>
|
||||
|
||||
## Table of Contents
|
||||
|
||||
* [Features](#features)
|
||||
|
|
2
main.go
2
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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Reference in New Issue