Go Music Player App Gitter

minio_GO1

本示例将会手把手(限女生)指导你如何用Golang构建一个简单的音乐播放器。在这个app中,我们会向你展示如何从Minio Server上获取你的音频文件。你可以通过这里获取完整的代码,代码是以Apache 2.0 License发布的。

1. 前提条件

2. 依赖

3. 安装media-player

参考下面示例,使用“go get”下载示例代码,“go get”会安装所需要的依赖。

go get -u github.com/minio/minio-go-media-player/media-player

现在media-player已经按耐不住,想唱首歌给你听了。

4. 运行media-player

环境变量bash

设置环境变量Access keySecret key

export AWS_ACCESS_KEY=Q3AM3UQ867SPQQA43P2F
export AWS_SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG

环境变量tcsh

setenv AWS_ACCESS_KEY Q3AM3UQ867SPQQA43P2F
setenv AWS_SECRET_KEY zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG

环境变量Windows command prompt

set AWS_ACCESS_KEY=Q3AM3UQ867SPQQA43P2F
set AWS_SECRET_KEY=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG

设置存储桶

  1. 我们已经创建了一个公开的Minio Server(https://play.minio.io:9000) 供大家进行开发和测试。调用mc mb命令,在play.minio.io:9000上创建一个名叫media-assets的存储桶。
mc mb play/media-assets
  1. 将你心爱的音乐上传到这个存储桶中。我们可以用mc来将本地的mp3文件上传到play上的存储桶中。
mc cp ~/Music/*.mp3 play/media-assets

注意 : 我们已经在play.minio.io上创建了media-assets这个存储桶,并将本示例用到的资源上传到这个存储桶了。

运行音乐播放器

现在已经万事俱备。使用-b命令行参数指定音乐文件所在的存储桶。

cd $GOPATH/bin
./media-player -b media-assets
2016/04/02 17:24:54 Starting media player, please visit your browser at http://localhost:8080

现在如果你访问http://localhost:8080 ,你应该可以看到这个示例程序。

可选参数

  1. Endpoint默认指向的是'https://play.minio.io:9000' ,想换一个的话可以使用-e
cd $GOPATH/bin
./media-player -b <bucket-name> -e https://s3.amazonaws.com
2016/04/02 17:24:54 Starting media player, please visit your browser at http://localhost:8080
  1. 如果想指定本地运行的Minio Server。
media-player -b <bucket-name> -e http://localhost:9000

5. 创建播放列表

这个播放器第一件要做的事情就是通过调用ListObjects方法,获取指定的存储桶中的音频资源,并创建一个播放列表。这些对象将会以JSON格式返回,做为音乐播放器的播放列表的数据。

下面的流程图和示例代码提供了如何实现的概述。

minio_GO2

 for objectInfo := range api.minioClient.ListObjects(*bucketName, "", isRecursive, doneCh) {
  if objectInfo.Err != nil {
        http.Error(w, objectInfo.Err.Error(), http.StatusInternalServerError)
            return
        }
        objectName := objectInfo.Key // object name.
        playListEntry := mediaPlayList{
            Key: objectName,
        }
        playListEntries = append(playListEntries, playListEntry)
    }
    playListEntriesJSON, err := json.Marshal(playListEntries)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    // Successfully wrote play list in json.
    w.Write(playListEntriesJSON)

6. Streaming Media

当你点击浏览器上的播放器时,播放器调用PresignedGetObject ,生成了一个安全的URL。

播放器使用PresignedGetObject生成的安全URL从服务器直接获取流。 以下流程图和示例代码提供了如何实现的概述。

minio_GO3

 // GetPresignedURLHandler - generates presigned access URL for an object.
func (api mediaHandlers) GetPresignedURLHandler(w http.ResponseWriter, r *http.Request) {
    // The object for which the presigned URL has to be generated is sent as a query
    // parameter from the client.
    objectName := r.URL.Query().Get("objName")
    if objectName == "" {
        http.Error(w, "No object name set, invalid request.", http.StatusBadRequest)
        return
    }
    presignedURL, err := api.storageClient.PresignedGetObject(*bucketName, objectName, 1000*time.Second, nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    w.Write([]byte(presignedURL))
}

7. 了解更多