├── picture ├── info.png ├── list.png ├── download.png └── search.png ├── .gitignore ├── lib ├── debug.js ├── OnsenURL.js ├── bin │ ├── bin.js │ └── command.js ├── help.js ├── api │ ├── OnsenTopics.js │ ├── OnsenSearch.js │ ├── OnsenList.js │ ├── OnsenInfo.js │ └── OnsenRecommends.js └── onsen.js ├── src ├── OnsenURL.coffee ├── bin │ ├── bin.coffee │ └── command.coffee ├── api │ ├── OnsenTopics.coffee │ ├── OnsenSearch.coffee │ ├── OnsenList.coffee │ ├── OnsenInfo.coffee │ └── OnsenRecommends.coffee ├── help.coffee └── onsen.coffee ├── package.json ├── LICENSE └── README.md /picture/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yui540/onsen-node/HEAD/picture/info.png -------------------------------------------------------------------------------- /picture/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yui540/onsen-node/HEAD/picture/list.png -------------------------------------------------------------------------------- /picture/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yui540/onsen-node/HEAD/picture/download.png -------------------------------------------------------------------------------- /picture/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yui540/onsen-node/HEAD/picture/search.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # node_modules 2 | node_modules/ 3 | 4 | # .DS_Store 5 | .DS_Store 6 | 7 | # debug.coffee : デバッグ用ファイル 8 | debug.coffee -------------------------------------------------------------------------------- /lib/debug.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var onsen; 4 | 5 | onsen = require('./onsen'); 6 | 7 | onsen.getTopics(function(data) { 8 | return console.log(data); 9 | }); 10 | 11 | }).call(this); 12 | -------------------------------------------------------------------------------- /src/OnsenURL.coffee: -------------------------------------------------------------------------------- 1 | module.exports = 2 | TOP : 'http://www.onsen.ag/' 3 | DEFAULT : 'http://onsen.ag/data/api/getDefaultInfo' 4 | LIST : 'http://www.onsen.ag/api/shownMovie/shownMovie.json' 5 | GET_INFO : 'http://www.onsen.ag/data/api/getMovieInfo/' 6 | SEARCH : 'http://www.onsen.ag/data/api/searchMovie?word=' 7 | RECOMMENDS : 'http://www.onsen.ag/app/recommends.xml' 8 | TOPICS : 'http://www.onsen.ag/blog/?feed=rss2' -------------------------------------------------------------------------------- /src/bin/bin.coffee: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | command = require './command' 3 | 4 | mode = process.argv[2] 5 | text = process.argv[3] 6 | 7 | if mode is '-h' or mode is '--help' 8 | # ヘルプ 9 | command.help() 10 | else if mode is 'list' 11 | # 番組一覧 12 | command.list text 13 | else if mode is 'search' 14 | # 検索 15 | command.search text 16 | else if mode is 'download' 17 | # ダウンロード 18 | command.download text 19 | else if mode is 'info' 20 | # 番組情報 21 | command.info text 22 | else 23 | command.help() -------------------------------------------------------------------------------- /src/api/OnsenTopics.coffee: -------------------------------------------------------------------------------- 1 | class OnsenTopics 2 | constructor: -> 3 | @url = require('../OnsenURL').TOPICS 4 | @xmljson = require 'xmljson' 5 | @help = require '../help' 6 | 7 | ## 8 | # トピックの取得 9 | # @param fn : コールバック関数 10 | ## 11 | getTopics: (fn) -> 12 | @help.httpRequest @url, (xml) => 13 | if xml isnt null 14 | @xmljson.to_json xml, (err, json) => 15 | json = @help.castArray json.rss.channel.item 16 | fn json 17 | else 18 | fn null 19 | 20 | module.exports = new OnsenTopics() -------------------------------------------------------------------------------- /lib/OnsenURL.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | module.exports = { 4 | TOP: 'http://www.onsen.ag/', 5 | DEFAULT: 'http://onsen.ag/data/api/getDefaultInfo', 6 | LIST: 'http://www.onsen.ag/api/shownMovie/shownMovie.json', 7 | GET_INFO: 'http://www.onsen.ag/data/api/getMovieInfo/', 8 | SEARCH: 'http://www.onsen.ag/data/api/searchMovie?word=', 9 | RECOMMENDS: 'http://www.onsen.ag/app/recommends.xml', 10 | TOPICS: 'http://www.onsen.ag/blog/?feed=rss2' 11 | }; 12 | 13 | }).call(this); 14 | -------------------------------------------------------------------------------- /src/api/OnsenSearch.coffee: -------------------------------------------------------------------------------- 1 | class OnsenSearch 2 | constructor: -> 3 | @url = require('../OnsenURL').SEARCH 4 | @help = require '../help' 5 | 6 | ## 7 | # 番組の検索 8 | # @param keyword : 検索ワード 9 | # @param fn : コールバック関数 10 | ## 11 | search: (keyword, fn) -> 12 | keyword = encodeURIComponent keyword 13 | @help.httpRequest @url + keyword, (jsonp) => 14 | if jsonp isnt null 15 | json = @help.catJSONP jsonp 16 | json = JSON.parse json 17 | json = json.result || [] 18 | fn json 19 | else 20 | fn null 21 | 22 | module.exports = new OnsenSearch() -------------------------------------------------------------------------------- /lib/bin/bin.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | (function() { 3 | var command, mode, text; 4 | 5 | command = require('./command'); 6 | 7 | mode = process.argv[2]; 8 | 9 | text = process.argv[3]; 10 | 11 | if (mode === '-h' || mode === '--help') { 12 | command.help(); 13 | } else if (mode === 'list') { 14 | command.list(text); 15 | } else if (mode === 'search') { 16 | command.search(text); 17 | } else if (mode === 'download') { 18 | command.download(text); 19 | } else if (mode === 'info') { 20 | command.info(text); 21 | } else { 22 | command.help(); 23 | } 24 | 25 | }).call(this); 26 | -------------------------------------------------------------------------------- /src/api/OnsenList.coffee: -------------------------------------------------------------------------------- 1 | class OnsenList 2 | constructor: -> 3 | @url = require('../OnsenURL').TOP 4 | @cheerio = require 'cheerio-httpcli' 5 | 6 | ## 7 | # 番組一覧の取得 8 | # @param fn : コールバック関数 9 | ## 10 | getList: (fn) -> 11 | list = {} 12 | @cheerio.fetch @url, (err, $, res) => 13 | if err 14 | fn null 15 | else 16 | $('.listWrap .clr li').each -> 17 | name = $(this).attr 'id' 18 | week = $(this).attr 'data-week' 19 | 20 | if list[week] is undefined 21 | list[week] = [] 22 | 23 | list[week].push name 24 | 25 | fn list 26 | 27 | module.exports = new OnsenList() -------------------------------------------------------------------------------- /src/help.coffee: -------------------------------------------------------------------------------- 1 | module.exports = 2 | ## 3 | # jsonpをjsonに変換 4 | # @param jsonp : jsonp 5 | # @return json : json 6 | ## 7 | catJSONP : (jsonp) -> 8 | json = jsonp.replace /(callback\(|\);)/g, '' 9 | return json 10 | 11 | ## 12 | # 配列に変換 13 | # @param list : レコメンドリスト 14 | # @return array : 配列 15 | ## 16 | castArray: (list) -> 17 | _list = [] 18 | for key, data of list 19 | _list.push data 20 | 21 | return _list 22 | 23 | ## 24 | # http通信 25 | # @param url : URL 26 | # @param fn : コールバック関数 27 | ## 28 | httpRequest: (url, fn) -> 29 | request = require 'request' 30 | request url, (err, res, body) => 31 | if res.statusCode is 200 and err is null 32 | fn body 33 | else 34 | fn null -------------------------------------------------------------------------------- /src/api/OnsenInfo.coffee: -------------------------------------------------------------------------------- 1 | class OnsenInfo 2 | constructor: -> 3 | @url = require('../OnsenURL').GET_INFO 4 | @help = require '../help' 5 | 6 | ## 7 | # 番組情報の取得 8 | # @param name : 番組名 9 | # @param fn : コールバック関数 10 | ## 11 | getInfo: (name, fn) -> 12 | name = encodeURIComponent name 13 | @help.httpRequest @url + name, (jsonp) => 14 | if jsonp isnt null 15 | json = @help.catJSONP jsonp 16 | json = JSON.parse json 17 | 18 | if json.error isnt undefined 19 | fn null 20 | return 21 | 22 | fn json 23 | else 24 | fn null 25 | 26 | ## 27 | # 音声 or 動画ファイルのリンクを取得 28 | ## 29 | getLink: (name, fn) -> 30 | @getInfo name, (info) => 31 | if info isnt null 32 | link = info.moviePath.pc 33 | fn link 34 | else 35 | fn null 36 | 37 | module.exports = new OnsenInfo() -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "onsen-node", 3 | "version": "1.1.3", 4 | "description": "声優ラジオサイト「音泉」の非公開APIモジュール", 5 | "main": "lib/onsen.js", 6 | "scripts": { 7 | "build": "coffee -o lib/ -c src" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/yuki540net/onsen-node.git" 12 | }, 13 | "keywords": [ 14 | "音泉", 15 | "声優", 16 | "ラジオ", 17 | "onsen-node" 18 | ], 19 | "author": "yuki540", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/yuki540net/onsen-node/issues" 23 | }, 24 | "homepage": "https://github.com/yuki540net/onsen-node#readme", 25 | "dependencies": { 26 | "cheerio-httpcli": "^0.6.11", 27 | "request": "^2.79.0", 28 | "suzu-downloader": "0.0.4", 29 | "xmljson": "^0.2.0" 30 | }, 31 | "bin": { 32 | "onsen": "lib/bin/bin.js" 33 | }, 34 | "private": false 35 | } 36 | -------------------------------------------------------------------------------- /lib/help.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | module.exports = { 4 | catJSONP: function(jsonp) { 5 | var json; 6 | json = jsonp.replace(/(callback\(|\);)/g, ''); 7 | return json; 8 | }, 9 | castArray: function(list) { 10 | var _list, data, key; 11 | _list = []; 12 | for (key in list) { 13 | data = list[key]; 14 | _list.push(data); 15 | } 16 | return _list; 17 | }, 18 | httpRequest: function(url, fn) { 19 | var request; 20 | request = require('request'); 21 | return request(url, (function(_this) { 22 | return function(err, res, body) { 23 | if (res.statusCode === 200 && err === null) { 24 | return fn(body); 25 | } else { 26 | return fn(null); 27 | } 28 | }; 29 | })(this)); 30 | } 31 | }; 32 | 33 | }).call(this); 34 | -------------------------------------------------------------------------------- /lib/api/OnsenTopics.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var OnsenTopics; 4 | 5 | OnsenTopics = (function() { 6 | function OnsenTopics() { 7 | this.url = require('../OnsenURL').TOPICS; 8 | this.xmljson = require('xmljson'); 9 | this.help = require('../help'); 10 | } 11 | 12 | OnsenTopics.prototype.getTopics = function(fn) { 13 | return this.help.httpRequest(this.url, (function(_this) { 14 | return function(xml) { 15 | if (xml !== null) { 16 | return _this.xmljson.to_json(xml, function(err, json) { 17 | json = _this.help.castArray(json.rss.channel.item); 18 | return fn(json); 19 | }); 20 | } else { 21 | return fn(null); 22 | } 23 | }; 24 | })(this)); 25 | }; 26 | 27 | return OnsenTopics; 28 | 29 | })(); 30 | 31 | module.exports = new OnsenTopics(); 32 | 33 | }).call(this); 34 | -------------------------------------------------------------------------------- /lib/api/OnsenSearch.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var OnsenSearch; 4 | 5 | OnsenSearch = (function() { 6 | function OnsenSearch() { 7 | this.url = require('../OnsenURL').SEARCH; 8 | this.help = require('../help'); 9 | } 10 | 11 | OnsenSearch.prototype.search = function(keyword, fn) { 12 | keyword = encodeURIComponent(keyword); 13 | return this.help.httpRequest(this.url + keyword, (function(_this) { 14 | return function(jsonp) { 15 | var json; 16 | if (jsonp !== null) { 17 | json = _this.help.catJSONP(jsonp); 18 | json = JSON.parse(json); 19 | json = json.result || []; 20 | return fn(json); 21 | } else { 22 | return fn(null); 23 | } 24 | }; 25 | })(this)); 26 | }; 27 | 28 | return OnsenSearch; 29 | 30 | })(); 31 | 32 | module.exports = new OnsenSearch(); 33 | 34 | }).call(this); 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 yuki540 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/api/OnsenList.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var OnsenList; 4 | 5 | OnsenList = (function() { 6 | function OnsenList() { 7 | this.url = require('../OnsenURL').TOP; 8 | this.cheerio = require('cheerio-httpcli'); 9 | } 10 | 11 | OnsenList.prototype.getList = function(fn) { 12 | var list; 13 | list = {}; 14 | return this.cheerio.fetch(this.url, (function(_this) { 15 | return function(err, $, res) { 16 | if (err) { 17 | return fn(null); 18 | } else { 19 | $('.listWrap .clr li').each(function() { 20 | var name, week; 21 | name = $(this).attr('id'); 22 | week = $(this).attr('data-week'); 23 | if (list[week] === void 0) { 24 | list[week] = []; 25 | } 26 | return list[week].push(name); 27 | }); 28 | return fn(list); 29 | } 30 | }; 31 | })(this)); 32 | }; 33 | 34 | return OnsenList; 35 | 36 | })(); 37 | 38 | module.exports = new OnsenList(); 39 | 40 | }).call(this); 41 | -------------------------------------------------------------------------------- /src/api/OnsenRecommends.coffee: -------------------------------------------------------------------------------- 1 | class OnsenRecommends 2 | constructor: -> 3 | @url_1 = require('../OnsenURL').RECOMMENDS 4 | @url_2 = require('../OnsenURL').DEFAULT 5 | @xmljson = require 'xmljson' 6 | @help = require '../help' 7 | 8 | ## 9 | # レコメンドの取得 10 | # @param fn : コールバック関数 11 | ## 12 | getRecommends: (fn) -> 13 | @help.httpRequest @url_1, (xml) => 14 | if xml isnt null 15 | @xmljson.to_json xml, (err, data) => 16 | data = @help.castArray data.recommends.recommend 17 | fn data 18 | else 19 | fn null 20 | 21 | ## 22 | # おすすめ番組の取得 23 | # @param fn : コールバック関数 24 | ## 25 | getRecommendMovie: (fn) -> 26 | @help.httpRequest @url_2, (jsonp) => 27 | if jsonp isnt null 28 | json = @help.catJSONP jsonp 29 | json = JSON.parse json 30 | fn json.recommendMovie 31 | else 32 | fn null 33 | 34 | ## 35 | # おすすめ商品の取得 36 | # @param fn : コールバック関数 37 | ## 38 | getRecommendGoods: (fn) -> 39 | @help.httpRequest @url_2, (jsonp) => 40 | if jsonp isnt null 41 | json = @help.catJSONP jsonp 42 | json = JSON.parse json 43 | fn json.recommendGoods 44 | else 45 | fn null 46 | 47 | module.exports = new OnsenRecommends() -------------------------------------------------------------------------------- /lib/onsen.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var OnsenInfo, OnsenList, OnsenRecommends, OnsenSearch, OnsenTopics; 4 | 5 | OnsenList = require('./api/OnsenList'); 6 | 7 | OnsenInfo = require('./api/OnsenInfo'); 8 | 9 | OnsenSearch = require('./api/OnsenSearch'); 10 | 11 | OnsenRecommends = require('./api/OnsenRecommends'); 12 | 13 | OnsenTopics = require('./api/OnsenTopics'); 14 | 15 | module.exports = { 16 | getList: function(fn) { 17 | return OnsenList.getList(fn); 18 | }, 19 | getInfo: function(name, fn) { 20 | return OnsenInfo.getInfo(name, fn); 21 | }, 22 | getLink: function(name, fn) { 23 | return OnsenInfo.getLink(name, fn); 24 | }, 25 | search: function(keyword, fn) { 26 | return OnsenSearch.search(keyword, fn); 27 | }, 28 | getRecommends: function(fn) { 29 | return OnsenRecommends.getRecommends(fn); 30 | }, 31 | getRecommendMovie: function(fn) { 32 | return OnsenRecommends.getRecommendMovie(fn); 33 | }, 34 | getRecommendGoods: function(fn) { 35 | return OnsenRecommends.getRecommendGoods(fn); 36 | }, 37 | getTopics: function(fn) { 38 | return OnsenTopics.getTopics(fn); 39 | } 40 | }; 41 | 42 | }).call(this); 43 | -------------------------------------------------------------------------------- /src/onsen.coffee: -------------------------------------------------------------------------------- 1 | OnsenList = require './api/OnsenList' 2 | OnsenInfo = require './api/OnsenInfo' 3 | OnsenSearch = require './api/OnsenSearch' 4 | OnsenRecommends = require './api/OnsenRecommends' 5 | OnsenTopics = require './api/OnsenTopics' 6 | 7 | module.exports = 8 | ## 9 | # 番組一覧の取得 10 | # @param fn : コールバック関数 11 | ## 12 | getList: (fn) -> 13 | OnsenList.getList fn 14 | 15 | ## 16 | # 番組情報の取得 17 | # @param name : 番組名 18 | # @param fn : コールバック関数 19 | ## 20 | getInfo: (name, fn) -> 21 | OnsenInfo.getInfo name, fn 22 | 23 | ## 24 | # 音声 or 動画リンクの取得 25 | # @param name : 番組名 26 | # @param fn : コールバック関数 27 | ## 28 | getLink: (name, fn) -> 29 | OnsenInfo.getLink name, fn 30 | 31 | ## 32 | # 番組の検索 33 | # @param keyword : 検索ワード 34 | # @param fn : コールバック関数 35 | ## 36 | search: (keyword, fn) -> 37 | OnsenSearch.search keyword, fn 38 | 39 | ## 40 | # レコメンドの取得 41 | # @param fn : コールバック関数 42 | ## 43 | getRecommends: (fn) -> 44 | OnsenRecommends.getRecommends fn 45 | 46 | ## 47 | # おすすめ番組の取得 48 | # @param fn : コールバック関数 49 | ## 50 | getRecommendMovie: (fn) -> 51 | OnsenRecommends.getRecommendMovie fn 52 | 53 | ## 54 | # おすすめ商品の取得 55 | # @param fn : コールバック関数 56 | ## 57 | getRecommendGoods: (fn) -> 58 | OnsenRecommends.getRecommendGoods fn 59 | 60 | ## 61 | # トピックの取得 62 | # @param fn : コールバック関数 63 | ## 64 | getTopics: (fn) -> 65 | OnsenTopics.getTopics fn -------------------------------------------------------------------------------- /lib/api/OnsenInfo.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var OnsenInfo; 4 | 5 | OnsenInfo = (function() { 6 | function OnsenInfo() { 7 | this.url = require('../OnsenURL').GET_INFO; 8 | this.help = require('../help'); 9 | } 10 | 11 | OnsenInfo.prototype.getInfo = function(name, fn) { 12 | name = encodeURIComponent(name); 13 | return this.help.httpRequest(this.url + name, (function(_this) { 14 | return function(jsonp) { 15 | var json; 16 | if (jsonp !== null) { 17 | json = _this.help.catJSONP(jsonp); 18 | json = JSON.parse(json); 19 | if (json.error !== void 0) { 20 | fn(null); 21 | return; 22 | } 23 | return fn(json); 24 | } else { 25 | return fn(null); 26 | } 27 | }; 28 | })(this)); 29 | }; 30 | 31 | OnsenInfo.prototype.getLink = function(name, fn) { 32 | return this.getInfo(name, (function(_this) { 33 | return function(info) { 34 | var link; 35 | if (info !== null) { 36 | link = info.moviePath.pc; 37 | return fn(link); 38 | } else { 39 | return fn(null); 40 | } 41 | }; 42 | })(this)); 43 | }; 44 | 45 | return OnsenInfo; 46 | 47 | })(); 48 | 49 | module.exports = new OnsenInfo(); 50 | 51 | }).call(this); 52 | -------------------------------------------------------------------------------- /lib/api/OnsenRecommends.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var OnsenRecommends; 4 | 5 | OnsenRecommends = (function() { 6 | function OnsenRecommends() { 7 | this.url_1 = require('../OnsenURL').RECOMMENDS; 8 | this.url_2 = require('../OnsenURL').DEFAULT; 9 | this.xmljson = require('xmljson'); 10 | this.help = require('../help'); 11 | } 12 | 13 | OnsenRecommends.prototype.getRecommends = function(fn) { 14 | return this.help.httpRequest(this.url_1, (function(_this) { 15 | return function(xml) { 16 | if (xml !== null) { 17 | return _this.xmljson.to_json(xml, function(err, data) { 18 | data = _this.help.castArray(data.recommends.recommend); 19 | return fn(data); 20 | }); 21 | } else { 22 | return fn(null); 23 | } 24 | }; 25 | })(this)); 26 | }; 27 | 28 | OnsenRecommends.prototype.getRecommendMovie = function(fn) { 29 | return this.help.httpRequest(this.url_2, (function(_this) { 30 | return function(jsonp) { 31 | var json; 32 | if (jsonp !== null) { 33 | json = _this.help.catJSONP(jsonp); 34 | json = JSON.parse(json); 35 | return fn(json.recommendMovie); 36 | } else { 37 | return fn(null); 38 | } 39 | }; 40 | })(this)); 41 | }; 42 | 43 | OnsenRecommends.prototype.getRecommendGoods = function(fn) { 44 | return this.help.httpRequest(this.url_2, (function(_this) { 45 | return function(jsonp) { 46 | var json; 47 | if (jsonp !== null) { 48 | json = _this.help.catJSONP(jsonp); 49 | json = JSON.parse(json); 50 | return fn(json.recommendGoods); 51 | } else { 52 | return fn(null); 53 | } 54 | }; 55 | })(this)); 56 | }; 57 | 58 | return OnsenRecommends; 59 | 60 | })(); 61 | 62 | module.exports = new OnsenRecommends(); 63 | 64 | }).call(this); 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # onsen-node 2 | 声優ラジオサイト「音泉」APIモジュール for Node.js 3 | 4 | - onsen-nodeについての紹介ページ 5 | - [Qiita - 声優ラジオサイト「音泉」APIモジュール](http://qiita.com/yuki540/items/a9bcafc0eafbd61d7bb6) 6 | - 開発者 7 | - yui540 8 | - [Twitter - @yui540](https://twitter.com/yui540) 9 | - [HP - magical-girl.site](https://magical-girl.site/) 10 | 11 | ## Method 12 | - getList 13 | - 番組一覧(曜日ごと)の取得 14 | - getInfo 15 | - 番組情報の取得 16 | - getLink 17 | - 音声・動画リンクの取得 18 | - search 19 | - 番組の検索 20 | - getRecommends 21 | - レコメンドの取得 22 | - getRecommendMovie 23 | - おすすめの番組の取得 24 | - getRecommendGoods 25 | - おすすめの商品の取得 26 | - getTopics 27 | - トピックの取得 28 | 29 | ## Usage 30 | ### npm install 31 | ``` 32 | npm install onsen-node 33 | ``` 34 | 35 | ### example 36 | ```coffeescript 37 | onsen = require 'onsen-node' 38 | 39 | ## 40 | # 番組一覧の取得 41 | ## 42 | onsen.getList (list) -> 43 | if list isnt null 44 | console.log list 45 | 46 | ## 47 | # 番組情報の取得 48 | ## 49 | onsen.getInfo '番組名', (info) -> 50 | if info isnt null 51 | console.log info 52 | 53 | ## 54 | # 音声・動画リンクの取得 55 | ## 56 | onsen.getLink '番組名', (link) -> 57 | if link isnt null 58 | console.log link 59 | 60 | ## 61 | # 番組の検索 62 | ## 63 | onsen.search '検索ワード', (list) -> 64 | if list isnt null 65 | console.log list 66 | 67 | ## 68 | # レコメンドの取得 69 | ## 70 | onsen.getRecommends (list) -> 71 | if list isnt null 72 | console.log list 73 | 74 | ## 75 | # おすすめの番組の取得 76 | ## 77 | onsen.getRecommendMovie (list) -> 78 | if list isnt null 79 | console.log list 80 | 81 | ## 82 | # おすすめの商品の取得 83 | ## 84 | onsen.getRecommendGoods (list) -> 85 | if list isnt null 86 | console.log list 87 | 88 | ## 89 | # おすすめの番組の取得 90 | ## 91 | onsen.getRecommendTopics (list) -> 92 | if list isnt null 93 | console.log list 94 | ``` 95 | 96 | ## CLI 97 | ### npm install 98 | ``` 99 | sudo npm install -g onsen-node 100 | ``` 101 | 102 | ### command 103 | ヘルプ 104 | ``` 105 | onsen -h 106 | ``` 107 | 108 | 番組一覧 109 | ``` 110 | onsen list 111 | onsen list 今日 112 | onsen list 月 113 | ``` 114 | ![list](./picture/list.png) 115 | 116 | 番組の検索 117 | ``` 118 | onsen search 番組名 119 | ``` 120 | ![search](./picture/search.png) 121 | 122 | 音声・動画ファイルのダウンロード 123 | ``` 124 | onsen download 番組名 125 | ``` 126 | ![download](./picture/download.png) 127 | 128 | 番組情報 129 | ``` 130 | onsen info 番組名 131 | ``` 132 | ![info](./picture/info.png) 133 | -------------------------------------------------------------------------------- /src/bin/command.coffee: -------------------------------------------------------------------------------- 1 | onsen = require '../onsen' 2 | path = require 'path' 3 | suzu = require 'suzu-downloader' 4 | download = new suzu() 5 | 6 | module.exports = 7 | ## 8 | # ヘルプ 9 | ## 10 | help: -> 11 | console.log "\n 12 | onsen-node CLI.\n 13 | usage: onsen []\n 14 | \n 15 | -h, --help ヘルプ。\n 16 | list [] 番組一覧\n 17 | search 番組の検索\n 18 | download 音声・動画ダウンロード\n 19 | info 番組の情報\n 20 | " 21 | 22 | ## 23 | # 番組一覧 ルーティング 24 | # @param week : 曜日[option] 25 | ## 26 | list: (week) -> 27 | onsen.getList (list) => 28 | if week is undefined 29 | @listAll list 30 | else 31 | @listWeek list, week, -> 32 | 33 | ## 34 | # 番組一覧 35 | ## 36 | listAll: (list) -> 37 | @showAll list, 0 38 | 39 | ## 40 | # 番組一覧(曜日ごと) 41 | # @param week : 曜日 42 | ## 43 | listWeek: (list, week, fn) -> 44 | week = @castWeek week 45 | _week = @kanaWeek week 46 | _list = list[week] 47 | 48 | console.log _week 49 | @showTitle _list, 0, fn 50 | 51 | ## 52 | # 曜日に変換 53 | # @param week : 曜日 54 | # @return week : 曜日 55 | ## 56 | castWeek: (week) -> 57 | list = ["sat", "mon", "tue", "wed", "thu", "fri", "sat"] 58 | date = new Date() 59 | today = list[date.getDay()] 60 | 61 | if week is '月' or week is 'mon' 62 | return list[1] 63 | else if week is '火' or week is 'tue' 64 | return list[2] 65 | else if week is '水' or week is 'wed' 66 | return list[3] 67 | else if week is '木' or week is 'thu' 68 | return list[4] 69 | else if week is '金' or week is 'fri' 70 | return list[5] 71 | else if week is '土' or week is 'sat' 72 | return list[6] 73 | else if week is '日' or week is 'sun' 74 | return list[0] 75 | else if week is '今日' or week is 'today' 76 | return today 77 | else 78 | return today 79 | 80 | ## 81 | # 日本語の曜日に変換 82 | # @param week : 曜日 83 | # @return week : 曜日 84 | ## 85 | kanaWeek: (week) -> 86 | list = ["土・日", "月", "火", "水", "木", "金", "土・日"] 87 | date = new Date() 88 | today = list[date.getDay()] 89 | 90 | if week is 'mon' 91 | return list[1] 92 | else if week is 'tue' 93 | return list[2] 94 | else if week is 'wed' 95 | return list[3] 96 | else if week is 'thu' 97 | return list[4] 98 | else if week is 'fri' 99 | return list[5] 100 | else if week is 'sat' 101 | return list[6] 102 | else if week is 'sun' 103 | return list[0] 104 | else if week is 'today' 105 | return today 106 | else 107 | return today 108 | 109 | ## 110 | # 番組タイトルの表示 111 | # @param list : 番組一覧 112 | # @param i : カウンタ 113 | # @param fn : コールバック関数 114 | ## 115 | showTitle: (list, i, fn) -> 116 | len = list.length - 1 117 | onsen.getInfo list[i], (info) => 118 | console.log ' [ ' + list[i] + ' ] ' + info.title 119 | 120 | i += 1 121 | if len <= i 122 | fn() 123 | else 124 | @showTitle list, i, fn 125 | 126 | ## 127 | # 番組一覧を全て表示 128 | # @param list : 番組一覧 129 | # @param i : カウンタ 130 | ## 131 | showAll: (list, i) -> 132 | week = ["mon", "tue", "wed", "thu", "fri", "sat"] 133 | _week = @kanaWeek week[i] 134 | len = 5 135 | 136 | console.log _week + '曜日' 137 | @showTitle list[week[i]], 0, => 138 | if len <= i 139 | 140 | else 141 | i += 1 142 | @showAll list, i 143 | 144 | ## 145 | # 番組の検索 146 | # @param keyword : 検索ワード 147 | ## 148 | search: (keyword) -> 149 | onsen.search keyword, (list) -> 150 | if list.length <= 0 151 | console.log "\n番組が見つかりませんでした。\n" 152 | return 153 | 154 | for name in list 155 | onsen.getInfo name, (info) -> 156 | console.log '[ ' + name + ' ] ' + info.title 157 | 158 | ## 159 | # 番組の情報 160 | # @param name : 番組名 161 | ## 162 | info: (name) -> 163 | onsen.getInfo name, (info) -> 164 | if info is null 165 | console.log '\n番組が見つかりませんでした。\n' 166 | return 167 | 168 | console.log "\n 169 | title: #{ info.title }\n 170 | personality: #{ info.personality }\n 171 | guest: #{ info.guest }\n 172 | update: #{ info.update }\n 173 | count: #{ info.count }\n 174 | schedule: #{ info.schedule }\n 175 | mail: #{ info.mail }\n 176 | file: #{ info.moviePath.pc }\n 177 | " 178 | 179 | ## 180 | # 音声・動画のダウンロード 181 | # @param name : 番組名 182 | ## 183 | download: (name) -> 184 | onsen.getInfo name, (info) -> 185 | if info is null 186 | console.log '\n番組が見つかりませんでした。\n' 187 | return 188 | 189 | link = info.moviePath.pc 190 | count = info.count 191 | ext = path.extname link 192 | file_name = name + '_' + count + ext 193 | 194 | download.get { 195 | url: link 196 | path: file_name 197 | } -------------------------------------------------------------------------------- /lib/bin/command.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.12.3 2 | (function() { 3 | var download, onsen, path, suzu; 4 | 5 | onsen = require('../onsen'); 6 | 7 | path = require('path'); 8 | 9 | suzu = require('suzu-downloader'); 10 | 11 | download = new suzu(); 12 | 13 | module.exports = { 14 | help: function() { 15 | return console.log("\n onsen-node CLI.\n usage: onsen []\n \n -h, --help ヘルプ。\n list [] 番組一覧\n search 番組の検索\n download 音声・動画ダウンロード\n info 番組の情報\n"); 16 | }, 17 | list: function(week) { 18 | return onsen.getList((function(_this) { 19 | return function(list) { 20 | if (week === void 0) { 21 | return _this.listAll(list); 22 | } else { 23 | return _this.listWeek(list, week, function() {}); 24 | } 25 | }; 26 | })(this)); 27 | }, 28 | listAll: function(list) { 29 | return this.showAll(list, 0); 30 | }, 31 | listWeek: function(list, week, fn) { 32 | var _list, _week; 33 | week = this.castWeek(week); 34 | _week = this.kanaWeek(week); 35 | _list = list[week]; 36 | console.log(_week); 37 | return this.showTitle(_list, 0, fn); 38 | }, 39 | castWeek: function(week) { 40 | var date, list, today; 41 | list = ["sat", "mon", "tue", "wed", "thu", "fri", "sat"]; 42 | date = new Date(); 43 | today = list[date.getDay()]; 44 | if (week === '月' || week === 'mon') { 45 | return list[1]; 46 | } else if (week === '火' || week === 'tue') { 47 | return list[2]; 48 | } else if (week === '水' || week === 'wed') { 49 | return list[3]; 50 | } else if (week === '木' || week === 'thu') { 51 | return list[4]; 52 | } else if (week === '金' || week === 'fri') { 53 | return list[5]; 54 | } else if (week === '土' || week === 'sat') { 55 | return list[6]; 56 | } else if (week === '日' || week === 'sun') { 57 | return list[0]; 58 | } else if (week === '今日' || week === 'today') { 59 | return today; 60 | } else { 61 | return today; 62 | } 63 | }, 64 | kanaWeek: function(week) { 65 | var date, list, today; 66 | list = ["土・日", "月", "火", "水", "木", "金", "土・日"]; 67 | date = new Date(); 68 | today = list[date.getDay()]; 69 | if (week === 'mon') { 70 | return list[1]; 71 | } else if (week === 'tue') { 72 | return list[2]; 73 | } else if (week === 'wed') { 74 | return list[3]; 75 | } else if (week === 'thu') { 76 | return list[4]; 77 | } else if (week === 'fri') { 78 | return list[5]; 79 | } else if (week === 'sat') { 80 | return list[6]; 81 | } else if (week === 'sun') { 82 | return list[0]; 83 | } else if (week === 'today') { 84 | return today; 85 | } else { 86 | return today; 87 | } 88 | }, 89 | showTitle: function(list, i, fn) { 90 | var len; 91 | len = list.length - 1; 92 | return onsen.getInfo(list[i], (function(_this) { 93 | return function(info) { 94 | console.log(' [ ' + list[i] + ' ] ' + info.title); 95 | i += 1; 96 | if (len <= i) { 97 | return fn(); 98 | } else { 99 | return _this.showTitle(list, i, fn); 100 | } 101 | }; 102 | })(this)); 103 | }, 104 | showAll: function(list, i) { 105 | var _week, len, week; 106 | week = ["mon", "tue", "wed", "thu", "fri", "sat"]; 107 | _week = this.kanaWeek(week[i]); 108 | len = 5; 109 | console.log(_week + '曜日'); 110 | return this.showTitle(list[week[i]], 0, (function(_this) { 111 | return function() { 112 | if (len <= i) { 113 | 114 | } else { 115 | i += 1; 116 | return _this.showAll(list, i); 117 | } 118 | }; 119 | })(this)); 120 | }, 121 | search: function(keyword) { 122 | return onsen.search(keyword, function(list) { 123 | var j, len1, name, results; 124 | if (list.length <= 0) { 125 | console.log("\n番組が見つかりませんでした。\n"); 126 | return; 127 | } 128 | results = []; 129 | for (j = 0, len1 = list.length; j < len1; j++) { 130 | name = list[j]; 131 | results.push(onsen.getInfo(name, function(info) { 132 | return console.log('[ ' + name + ' ] ' + info.title); 133 | })); 134 | } 135 | return results; 136 | }); 137 | }, 138 | info: function(name) { 139 | return onsen.getInfo(name, function(info) { 140 | if (info === null) { 141 | console.log('\n番組が見つかりませんでした。\n'); 142 | return; 143 | } 144 | return console.log("\n title: " + info.title + "\n personality: " + info.personality + "\n guest: " + info.guest + "\n update: " + info.update + "\n count: " + info.count + "\n schedule: " + info.schedule + "\n mail: " + info.mail + "\n file: " + info.moviePath.pc + "\n"); 145 | }); 146 | }, 147 | download: function(name) { 148 | return onsen.getInfo(name, function(info) { 149 | var count, ext, file_name, link; 150 | if (info === null) { 151 | console.log('\n番組が見つかりませんでした。\n'); 152 | return; 153 | } 154 | link = info.moviePath.pc; 155 | count = info.count; 156 | ext = path.extname(link); 157 | file_name = name + '_' + count + ext; 158 | return download.get({ 159 | url: link, 160 | path: file_name 161 | }); 162 | }); 163 | } 164 | }; 165 | 166 | }).call(this); 167 | --------------------------------------------------------------------------------