kintoneでミュージックプレイヤーを作ってみた
kintoneでミュージックプレイヤーを作ってみた:
��こちらは kintone Advent Calendar 2018 23日目 の記事です。
kintone Advent Calendar 2018 オーナーのBBです。
まずは、kintone Advent Calendarに参加してくださったみなさまへ感謝の気持ちを。
参加していただき、ありがとうございます!!
(来年も開催したいと思っているのでぜひご協力を! めざせ Part2!)
このkintone Advent Calendarを立ててすぐに
初日でもなく最終日でもなくこの 23日 を選んだのには理由があります。
それは、、
23日が My Birthday だからです����
え? それだけかって?
はい、それだけです。
では気を取り直して、
「ネタ系で頑張る」と最初から宣言してしまった以上、ネタで攻めさせていただきました。
タイトルからも分かる通り、「え?それkintoneでやる必要あるの?」って内容です 笑
ただ、普通にやるだけではつまらないので
勉強も兼ねて今流行りの 「Vue.js」 を使ってみました。
※ 小さくてすみません m(_ _)m
※ そして僕の趣味丸出しですみません m(_ _)m
GitHubPagesにも同じやつを作ってみました。
https://rybb.github.io/MusicPlayer/
※ 著作フリーなやつに差し替えています。ついでにクリスマスっぽくしています☃
なぜこのカスタマイズをしようと思ったかというと、
一番の理由はやはり 「モバイルカスタマイズビューを使ってみたかった」 ですね!
仕組み自体はとてもシンプルです
kintoneでは添付ファイルはBlob形式で保存されています。
なのでこのBlob URLを作ることで、いわゆる 直リンク が生成できるわけです。
Blob URLの取得方法は cybozu developer network に記事があります!
https://developer.cybozu.io/hc/ja/articles/202166180
では、さっそく作り方のご紹介を。
フィールドはこんな感じです
めっちゃシンプル
GitHub にもあげています。
結構思うがままに書いていたので読みにくいかもです m(_ _)m
結構大変でした。
(Vue使う必要ある?って思うかもですが、、、これは僕の勉強のためです! 汗)
以前、Qiitaに投稿したGoogleの画像検索API連携を使えば、
「歌手」「アルバム名」などを入力するフィールド追加で
自動で画像URLを取得 することもできそうです。
kintoneで画像検索API使ってみた
https://qiita.com/RyBB/items/b87a92815854ed5c74af
実はkintoneモバイル (モバイルアプリ)で再生すれば、
バックグラウンド再生 ができるんです!!
まさに音楽プレイヤー!
Vue.jsの使い方がまだまだイマイチですね。もう少しちゃんと勉強せねば、と思いました
(何度、「もうjQueryで書こうかな」と揺らいだものか)
まぁそれは置いといて、
kintoneは業務で使うだけでなく、こんなお楽しみ?要素としても使えます。
複数人で同じ音楽ファイルを聞けるので、ストリーミング的な使い方もできそうですね
※ kintoneのデータ容量にはご注意ください
それでは!≧(+・` ཀ・´)≦
��こちらは kintone Advent Calendar 2018 23日目 の記事です。
kintone Advent Calendar 2018 オーナーのBBです。
まずは、kintone Advent Calendarに参加してくださったみなさまへ感謝の気持ちを。
参加していただき、ありがとうございます!!
(来年も開催したいと思っているのでぜひご協力を! めざせ Part2!)
はじめにの前に
このkintone Advent Calendarを立ててすぐに初日でもなく最終日でもなくこの 23日 を選んだのには理由があります。
それは、、
23日が My Birthday だからです����
え? それだけかって?
はい、それだけです。
はじめに
では気を取り直して、「ネタ系で頑張る」と最初から宣言してしまった以上、ネタで攻めさせていただきました。
タイトルからも分かる通り、「え?それkintoneでやる必要あるの?」って内容です 笑
ただ、普通にやるだけではつまらないので
勉強も兼ねて今流行りの 「Vue.js」 を使ってみました。
完成イメージ
※ 小さくてすみません m(_ _)m
※ そして僕の趣味丸出しですみません m(_ _)m
GitHubPagesにも同じやつを作ってみました。
https://rybb.github.io/MusicPlayer/
※ 著作フリーなやつに差し替えています。ついでにクリスマスっぽくしています☃
きっかけ
なぜこのカスタマイズをしようと思ったかというと、- 2018年12月版で搭載されたモバイルカスタマイズビューを使ってみたかった
-
業務以外でのkintoneの使い道を模索したかった - 去年あたりにも、実は音楽プレイヤー化に挑戦していた
一番の理由はやはり 「モバイルカスタマイズビューを使ってみたかった」 ですね!
仕組み
仕組み自体はとてもシンプルです- モバイルの一覧表示イベント(mobile.app.record.index.show)で発火��
- レコードを全件取得する (GET,records)
- 画像ファイル、音楽ファイルの Blob URL を取得する
- HTMLタグにそれらを埋め込む
- 下に全件リスト表示させて、クリックしたらTOPと変更する
Blob URL
kintoneでは添付ファイルはBlob形式で保存されています。なのでこのBlob URLを作ることで、いわゆる 直リンク が生成できるわけです。
Blob URLの取得方法は cybozu developer network に記事があります!
https://developer.cybozu.io/hc/ja/articles/202166180
アプリの作り方
では、さっそく作り方のご紹介を。フィールドはこんな感じです
フィールド | フィールドコード | 用途 |
---|---|---|
添付ファイル | image | 画像ファイル用 |
添付ファイル | music | 音楽ファイル用 |
コード
GitHub にもあげています。カスタマイズビュー用HTML
<style> .main { max-width: 500px; margin: auto; text-align:center; } .title { margin: 1em; cursor: pointer; border-bottom:1px solid #555555; } #img { height: 300px; width: auto; } #list { font-size: 1.5em; margin: 0.5em; } audio { width: 100%; } </style> <body> <div class=bg> <div class="main"> <div id="app"> <div class="wrapper"> <div> <img id="img" :src="imglink"> </div> </div> <div> <a><audio :src="musiclink" v-on:ended="nextMusic" autoplay controls></audio></a> </div> </div> <ol id="list"> <li class="title" v-for="item in items" v-on:click="changeMusic(item)"> {{ item.music.value[0].name }} </li> </ol> </div> </div>
app.js
// イベント発火とかメイン処理 (() => { 'use strict'; const mykintone = window.mykintone; const events = [ 'app.record.index.show', 'mobile.app.record.index.show' ]; kintone.events.on(events, async e => { // カスタマイズビュー以外なら終了 if (!e.viewId === 5740139) { return; } // kintoneのレコードを全件取得する const kinData = await mykintone.getRecords(e.appId); const records = kinData.records; // 添付ファイルの直リンク生成 const URL = await mykintone.getImageMusicURL(records[0]); // Vue.js const app = new Vue({ el: '#app', data: { index: URL.index, imglink: URL.img, musiclink: URL.music, }, methods: { nextMusic: async function() { let newURL; const index = records.findIndex(obj => { return obj.$id.value === this.index; }); if (!records[index + 1]) { newURL = await mykintone.getImageMusicURL(records[0]); app.index = newURL.index; app.imglink = newURL.img; app.musiclink = newURL.music; return; } newURL = await mykintone.getImageMusicURL(records[index + 1]); app.index = newURL.index; app.imglink = newURL.img; app.musiclink = newURL.music; } } }); new Vue({ el: '#list', data: { items: records }, methods: { changeMusic: async function(event) { let newURL = await mykintone.getImageMusicURL(event); app.index = newURL.index; app.imglink = newURL.img; app.musiclink = newURL.music; } } }); }); })();
kin.js
// kintone API系の処理 (() => { 'use strict'; // kintoneのフィールドコードとか const common = { image: 'image', music: 'music' }; const xhr = new XMLHttpRequest(); // レコードを全件取得する処理 const getRecords = APPID => { return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {app: APPID}) .then(resp => { return resp; }) .catch(err => { console.log('Error:kintone\n' + err); }); }; // 添付ファイルの直リンクを作る関数 const filedownload = filekey => { return new Promise((resolve, reject) => { const url = '/k/v1/file.json?fileKey=' + filekey; xhr.open('GET', url, true); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.responseType = 'blob'; xhr.onload = () => { // blobからURL生成 let blob = xhr.response; let url = window.URL || window.webkitURL; let file = url.createObjectURL(blob); resolve(file); }; xhr.onerror = () => { reject('Error:XHR'); }; xhr.send(); }); }; // 画像ファイルと音楽ファイルの直リンク生成 const getImageMusicURL = DATA => { return new Promise(async resolve => { const index = DATA.$id.value; let imageURL, musicURL; // 画像ファイルの有無チェック if (!DATA[common.image].value[0]) { imageURL = null; } else { let imageFileKey = DATA[common.image].value[0].fileKey; imageURL = await filedownload(imageFileKey); } // 音楽ファイルの有無チェック if (!DATA[common.music].value[0]) { musicURL = null; } else { let musicFileKey = DATA[common.music].value[0].fileKey; musicURL = await filedownload(musicFileKey); } resolve({ index: index, img: imageURL, music: musicURL }); }); }; window.mykintone = {}; window.mykintone.getRecords = getRecords; window.mykintone.getImageMusicURL = getImageMusicURL; })();
ポイント
結構大変でした。- 画像ファイルは <img>のsrcに埋め込めば表示される
- 音楽ファイルは <audio>タグのsrcに埋め込めば、操作バーとして表示される
- Vue.jsでリスト表示や再生ファイルの入れ替えを実現
- カスタマイズビューに<style>タグ使えば、CSSも書ける
- 音楽が終わったら次の曲を再生させている
(Vue使う必要ある?って思うかもですが、、、これは僕の勉強のためです! 汗)
発展
以前、Qiitaに投稿したGoogleの画像検索API連携を使えば、「歌手」「アルバム名」などを入力するフィールド追加で
自動で画像URLを取得 することもできそうです。
kintoneで画像検索API使ってみた
https://qiita.com/RyBB/items/b87a92815854ed5c74af
小ネタ
実はkintoneモバイル (モバイルアプリ)で再生すれば、バックグラウンド再生 ができるんです!!
まさに音楽プレイヤー!
おわりに
Vue.jsの使い方がまだまだイマイチですね。もう少しちゃんと勉強せねば、と思いました(何度、「もうjQueryで書こうかな」と揺らいだものか)
まぁそれは置いといて、
kintoneは業務で使うだけでなく、こんなお楽しみ?要素としても使えます。
複数人で同じ音楽ファイルを聞けるので、ストリーミング的な使い方もできそうですね
※ kintoneのデータ容量にはご注意ください
それでは!≧(+・` ཀ・´)≦
コメント
コメントを投稿