├── .editorconfig ├── .gitignore ├── README.md ├── favicons ├── android-chrome-192x192.png ├── android-chrome-384x384.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── manifest.json ├── mstile-150x150.png └── safari-pinned-tab.svg ├── img ├── check-icon.png ├── check-icon@2x.png ├── left-arrow-icon.png ├── left-arrow-icon@2x.png ├── right-arrow-icon.png ├── right-arrow-icon@2x.png ├── search-icon.png ├── search-icon@2x.png ├── setting-icon.png ├── setting-icon@2x.png ├── shimakaze.png ├── shimakaze@2x.png └── table-bg.png ├── json ├── archive.json ├── bangumi-1310.json ├── bangumi-1401.json ├── bangumi-1404.json ├── bangumi-1407.json ├── bangumi-1410.json ├── bangumi-1501.json ├── bangumi-1504.json ├── bangumi-1507.json ├── bangumi-1510.json ├── bangumi-1601.json ├── bangumi-1604.json ├── bangumi-1607.json └── bangumi-1610.json ├── package-lock.json ├── package.json ├── src ├── js │ ├── _config.js │ ├── action │ │ └── Actions.js │ ├── component │ │ ├── BgmApp.js │ │ ├── BgmHeader.js │ │ ├── BgmItemMain.js │ │ ├── BgmItemSub.js │ │ ├── BgmList.js │ │ ├── BgmPreferences.js │ │ ├── BgmTable.js │ │ ├── BgmTop.js │ │ ├── Dialog.js │ │ ├── ItemSites.js │ │ ├── MainApp.js │ │ ├── Mixins.js │ │ └── TableSelector.js │ ├── dispatcher │ │ └── Dispatcher.js │ ├── main.js │ ├── mod │ │ ├── Utils.js │ │ └── getPinyin.js │ └── store │ │ ├── ArchiveStore.js │ │ ├── BgmConfigStore.js │ │ ├── BgmDataStore.js │ │ └── BgmSitesStore.js └── less │ ├── main.less │ └── reset.less ├── template.html.example ├── test.html ├── tpl └── index0.html └── webpack.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.json] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | index.html 2 | *.log 3 | dist 4 | build 5 | node_modules 6 | .idea 7 | src/js/config.js 8 | .DS_Store 9 | template.html 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [番组放送](http://bgmlist.com/) v2 2 | 3 | 新番放送兼版权引进播放地址聚合站 4 | 5 | 放送时间数据源:http://www.kansou.me 6 | 7 | ## Attention 8 | 9 | 本站点的数据已分离至单独的 Repository 维护,请需要大陆新番放送站点数据的同学们移步至:[bangumi-data](https://github.com/bangumi-data/bangumi-data) 10 | 11 | 从 2017 年 1 月开始,本目录下的 json 数据将不会再更新,视情况而定也可能会删除,谢谢大家的理解。 12 | 13 | ## deploy 14 | 15 | ```sh 16 | npm install 17 | cp src/js/_config.js src/js/config.js 18 | npm run deploy 19 | ``` 20 | 21 | 会在目录下生成 `dist` 文件夹和 `index.html` 文件。 22 | 23 | ## dev 24 | 25 | ### live development 26 | 27 | ```sh 28 | npm run start 29 | ``` 30 | 31 | 然后在浏览器中打开 http://localhost:8090/test.html 即可 32 | 33 | ## special thanks to 34 | 感谢 [@parameciumzhe](https://twitter.com/parameciumzhe) 提供的设计建议和优化方案 35 | -------------------------------------------------------------------------------- /favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /favicons/android-chrome-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/favicons/android-chrome-384x384.png -------------------------------------------------------------------------------- /favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #1abc9c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/favicons/favicon.ico -------------------------------------------------------------------------------- /favicons/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-384x384.png", 11 | "sizes": "384x384", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /favicons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/favicons/mstile-150x150.png -------------------------------------------------------------------------------- /favicons/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 29 | 32 | 36 | 37 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /img/check-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/check-icon.png -------------------------------------------------------------------------------- /img/check-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/check-icon@2x.png -------------------------------------------------------------------------------- /img/left-arrow-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/left-arrow-icon.png -------------------------------------------------------------------------------- /img/left-arrow-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/left-arrow-icon@2x.png -------------------------------------------------------------------------------- /img/right-arrow-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/right-arrow-icon.png -------------------------------------------------------------------------------- /img/right-arrow-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/right-arrow-icon@2x.png -------------------------------------------------------------------------------- /img/search-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/search-icon.png -------------------------------------------------------------------------------- /img/search-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/search-icon@2x.png -------------------------------------------------------------------------------- /img/setting-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/setting-icon.png -------------------------------------------------------------------------------- /img/setting-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/setting-icon@2x.png -------------------------------------------------------------------------------- /img/shimakaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/shimakaze.png -------------------------------------------------------------------------------- /img/shimakaze@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/shimakaze@2x.png -------------------------------------------------------------------------------- /img/table-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxt2005/bangumi-list/957cb03e3e4a9f9cb124e914b5f25d54c4e44c58/img/table-bg.png -------------------------------------------------------------------------------- /json/archive.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "2013": { 4 | "10": { 5 | "path": "json/bangumi-1310.json", 6 | "version": 2016062801 7 | } 8 | }, 9 | "2014": { 10 | "1": { 11 | "path": "json/bangumi-1401.json", 12 | "version": 2016062801 13 | }, 14 | "4": { 15 | "path": "json/bangumi-1404.json", 16 | "version": 2016062801 17 | }, 18 | "7": { 19 | "path": "json/bangumi-1407.json", 20 | "version": 2016062801 21 | }, 22 | "10": { 23 | "path": "json/bangumi-1410.json", 24 | "version": 2016062801 25 | } 26 | }, 27 | "2015": { 28 | "1": { 29 | "path": "json/bangumi-1501.json", 30 | "version": 2016062801 31 | }, 32 | "4": { 33 | "path": "json/bangumi-1504.json", 34 | "version": 2016062801 35 | }, 36 | "7": { 37 | "path": "json/bangumi-1507.json", 38 | "version": 2016070501 39 | }, 40 | "10": { 41 | "path": "json/bangumi-1510.json", 42 | "version": 2016062801 43 | } 44 | }, 45 | "2016": { 46 | "1": { 47 | "path": "json/bangumi-1601.json", 48 | "version": 2016062801 49 | }, 50 | "4": { 51 | "path": "json/bangumi-1604.json", 52 | "version": 2016062801 53 | }, 54 | "7": { 55 | "path": "json/bangumi-1607.json", 56 | "version": 2016071201 57 | }, 58 | "10": { 59 | "path": "json/bangumi-1610.json", 60 | "version": 2016102501 61 | } 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /json/bangumi-1310.json: -------------------------------------------------------------------------------- 1 | { 2 | "1310_0": { 3 | "titleCN": "名侦探柯南", 4 | "titleJP": "名探偵コナン", 5 | "titleEN": "Detective Conan", 6 | "officalSite": "http://www.ytv.co.jp/conan/", 7 | "weekDayJP": 6, 8 | "weekDayCN": 6, 9 | "timeJP": "1800", 10 | "timeCN": "1930", 11 | "onAirSite": [ 12 | "http://www.iqiyi.com/a_19rrhc0gyd.html", 13 | "http://v.qq.com/detail/h/hzgtnf6tbvfekfv.html", 14 | "http://tv.sohu.com/s2012/mztkn/", 15 | "http://www.le.com/comic/5938.html", 16 | "http://v.pptv.com/page/ac24Np4EdLIVkics.html" 17 | ], 18 | "newBgm": false, 19 | "bgmId": 899, 20 | "showDate": "1996-01-08" 21 | }, 22 | "1310_1": { 23 | "titleCN": "海贼王", 24 | "titleJP": "ONE PIECE", 25 | "titleEN": "ONE PIECE", 26 | "officalSite": "http://www.toei-anim.co.jp/tv/onep/", 27 | "weekDayJP": 0, 28 | "weekDayCN": 0, 29 | "timeJP": "0930", 30 | "timeCN": "", 31 | "onAirSite": [ 32 | "http://tv.sohu.com/s2013/onepiece/", 33 | "http://www.iqiyi.com/a_19rrhb3xvl.html", 34 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=海贼王" 35 | ], 36 | "newBgm": false, 37 | "bgmId": 975, 38 | "showDate": "1999-10-20" 39 | }, 40 | "1310_2": { 41 | "titleCN": "火影忍者 疾风传", 42 | "titleJP": "NARUTO -ナルト- 疾風伝", 43 | "titleEN": "Naruto Shippuuden", 44 | "officalSite": "http://www.tv-tokyo.co.jp/anime/naruto/index2.html", 45 | "weekDayJP": 4, 46 | "weekDayCN": 4, 47 | "timeJP": "1830", 48 | "timeCN": "1900", 49 | "onAirSite": [ 50 | "http://www.tudou.com/albumcover/Lqfme5hSolM.html", 51 | "http://www.bilibili.com/bangumi/i/3287/", 52 | "http://www.youku.com/show_page/id_zcc001f06962411de83b1.html", 53 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=火影忍者" 54 | ], 55 | "newBgm": false, 56 | "bgmId": 2782, 57 | "showDate": "2007-02-15" 58 | }, 59 | "1310_3": { 60 | "titleCN": "HUNTER×HUNTER", 61 | "titleJP": "HUNTER×HUNTER", 62 | "officalSite": "http://www.ntv.co.jp/hunterhunter/", 63 | "weekDayJP": 3, 64 | "weekDayCN": 3, 65 | "timeJP": "0029", 66 | "timeCN": "0400", 67 | "onAirSite": [ 68 | "http://tv.sohu.com/s2012/hunter/" 69 | ], 70 | "newBgm": false, 71 | "bgmId": 21032, 72 | "showDate": "2011-10-03" 73 | }, 74 | "1310_4": { 75 | "titleCN": "宇宙兄弟", 76 | "titleJP": "宇宙兄弟", 77 | "officalSite": "http://www.ytv.co.jp/uchukyodai/", 78 | "weekDayJP": 6, 79 | "weekDayCN": 0, 80 | "timeJP": "1630", 81 | "timeCN": "", 82 | "onAirSite": [ 83 | "http://www.bilibili.com/bangumi/i/1657/" 84 | ], 85 | "newBgm": false, 86 | "bgmId": 28533, 87 | "showDate": "2012-04-01" 88 | }, 89 | "1310_5": { 90 | "titleCN": "圣斗士星矢Ω", 91 | "titleJP": "聖闘士星矢Ω", 92 | "officalSite": "http://www.toei-anim.co.jp/tv/seiya/", 93 | "weekDayJP": 0, 94 | "weekDayCN": 1, 95 | "timeJP": "0530", 96 | "timeCN": "", 97 | "onAirSite": [ 98 | "http://www.iqiyi.com/a_19rrhb1ce1.html" 99 | ], 100 | "newBgm": false, 101 | "bgmId": 33446, 102 | "showDate": "2012-04-01" 103 | }, 104 | "1310_6": { 105 | "titleCN": "卡片战斗先导者 LinkJoker篇", 106 | "titleJP": "カードファイト!! ヴァンガード リンクジョーカー編", 107 | "officalSite": "http://www.tv-tokyo.co.jp/anime/cf-vanguard-lj/", 108 | "weekDayJP": 0, 109 | "weekDayCN": 1, 110 | "timeJP": "0900", 111 | "timeCN": "", 112 | "onAirSite": [ 113 | "http://www.le.com/comic/88433.html", 114 | "http://www.tudou.com/albumcover/8pqD3-i9Be4.html", 115 | "http://www.youku.com/show_page/id_z7df70b7a692611e29013.html" 116 | ], 117 | "newBgm": false, 118 | "bgmId": 55783, 119 | "showDate": "2013-01-13" 120 | }, 121 | "1310_7": { 122 | "titleCN": "美妙旋律 Rainbow Live", 123 | "titleJP": "プリティーリズム・レインボーライブ", 124 | "officalSite": "http://www.tv-tokyo.co.jp/anime/prettyrhythm/", 125 | "weekDayJP": 6, 126 | "weekDayCN": 0, 127 | "timeJP": "0900", 128 | "timeCN": "", 129 | "onAirSite": [ 130 | "http://www.youku.com/show_page/id_z033b8b22863111e2b16f.html", 131 | "http://www.tudou.com/albumcover/1RQejV8BX3E.html" 132 | ], 133 | "newBgm": false, 134 | "bgmId": 62285, 135 | "showDate": "2013-04-06" 136 | }, 137 | "1310_8": { 138 | "titleCN": "探险DRILAND 1000年的真宝", 139 | "titleJP": "探検ドリランド -1000年の真宝-", 140 | "officalSite": "http://www.tv-tokyo.co.jp/anime/driland2/", 141 | "weekDayJP": 6, 142 | "weekDayCN": 0, 143 | "timeJP": "0930", 144 | "timeCN": "", 145 | "onAirSite": [ 146 | "http://www.youku.com/show_page/id_zfe815c40309111e3b8b7.html", 147 | "http://www.tudou.com/albumcover/yTcP6SgWAJI.html" 148 | ], 149 | "newBgm": false, 150 | "bgmId": 66409, 151 | "showDate": "2013-04-06" 152 | }, 153 | "1310_9": { 154 | "titleCN": "王者天下2", 155 | "titleJP": "キングダム2", 156 | "officalSite": "http://www9.nhk.or.jp/anime/kingdom2/", 157 | "weekDayJP": 6, 158 | "weekDayCN": 0, 159 | "timeJP": "2300", 160 | "timeCN": "", 161 | "onAirSite": [ 162 | "http://www.iqiyi.com/a_19rrifq03u.html", 163 | "http://www.bilibili.com/bangumi/i/583/" 164 | ], 165 | "newBgm": false, 166 | "bgmId": 62281, 167 | "showDate": "2013-06-08" 168 | }, 169 | "1310_10": { 170 | "titleCN": "物语系列 第二季", 171 | "titleJP": "<物語>シリーズ セカンドシーズン", 172 | "officalSite": "http://www.monogatari-series.com/2ndseason/", 173 | "weekDayJP": 6, 174 | "weekDayCN": 0, 175 | "timeJP": "2300", 176 | "timeCN": "0000", 177 | "onAirSite": [ 178 | "http://comic.le.com/zt/wuyu/index.shtml", 179 | "http://www.bilibili.com/sp/物语系列", 180 | "http://www.acfun.tv/a/aa118" 181 | ], 182 | "newBgm": false, 183 | "bgmId": 68812, 184 | "showDate": "2013-07-06" 185 | }, 186 | "1310_11": { 187 | "titleCN": "黏黏糊糊角质君", 188 | "titleJP": "にゅるにゅる!!KAKUSENくん", 189 | "officalSite": "http://kakusen-kun.com/", 190 | "weekDayJP": 2, 191 | "weekDayCN": 3, 192 | "timeJP": "0059", 193 | "timeCN": "", 194 | "onAirSite": [ 195 | "http://www.le.com/comic/91812.html", 196 | "http://www.youku.com/show_page/id_z3e50f242de5111e2b356.html", 197 | "http://www.tudou.com/albumcover/GJnth25qxqo.html", 198 | "http://www.bilibili.com/bangumi/i/1571/" 199 | ], 200 | "newBgm": false, 201 | "bgmId": 77551, 202 | "showDate": "2013-07-09" 203 | }, 204 | "1310_12": { 205 | "titleCN": "超青春姐弟s", 206 | "titleJP": "Super Seisyun Brothers -超青春姉弟s-", 207 | "officalSite": "http://ssb-love.tv/", 208 | "weekDayJP": 6, 209 | "weekDayCN": 0, 210 | "timeJP": "0053", 211 | "timeCN": "", 212 | "onAirSite": [ 213 | "http://www.youku.com/show_page/id_z50a2ad0a08b311e3b8b7.html", 214 | "http://www.tudou.com/albumcover/o3pTET0Lh68.html", 215 | "http://v.qq.com/detail/v/v3qmzely1mvcn9i.html", 216 | "http://www.le.com/comic/93252.html", 217 | "http://v.pptv.com/page/V9fBP6cNfbsenAQ.html" 218 | ], 219 | "newBgm": false, 220 | "bgmId": 79701, 221 | "showDate": "2013-09-14" 222 | }, 223 | "1310_13": { 224 | "titleCN": "魔鬼恋人", 225 | "titleJP": "DIABOLIK LOVERS", 226 | "officalSite": "http://anime-dialover.com/", 227 | "weekDayJP": 0, 228 | "weekDayCN": 1, 229 | "timeJP": "0030", 230 | "timeCN": "2330", 231 | "onAirSite": [ 232 | "http://v.qq.com/detail/p/p5yfnziow4uwunf.html", 233 | "http://www.bilibili.com/bangumi/i/479/" 234 | ], 235 | "newBgm": false, 236 | "bgmId": 64993, 237 | "showDate": "2013-09-22" 238 | }, 239 | "1310_14": { 240 | "titleCN": "COPPELION 核爆默示录", 241 | "titleJP": "COPPELION(コッペリオン)", 242 | "officalSite": "http://www.starchild.co.jp/special/coppelion/top.html", 243 | "weekDayJP": 3, 244 | "weekDayCN": 3, 245 | "timeJP": "2000", 246 | "timeCN": "2100", 247 | "onAirSite": [ 248 | "http://v.qq.com/cover/o/ox39rizb1w9cbv1.html", 249 | "http://www.bilibili.com/bangumi/i/485/" 250 | ], 251 | "newBgm": true, 252 | "bgmId": 10463, 253 | "showDate": "2013-10-02" 254 | }, 255 | "1310_15": { 256 | "titleCN": "境界的彼方", 257 | "titleJP": "境界の彼方", 258 | "officalSite": "http://anime-kyokai.com/", 259 | "weekDayJP": 3, 260 | "weekDayCN": 4, 261 | "timeJP": "2330", 262 | "timeCN": "0300", 263 | "onAirSite": [ 264 | "http://tv.sohu.com/s2013/jjdbf/", 265 | "http://www.acfun.tv/a/aa78", 266 | "http://bangumi.bilibili.com/anime/3365/" 267 | ], 268 | "newBgm": true, 269 | "bgmId": 49278, 270 | "showDate": "2013-10-02" 271 | }, 272 | "1310_16": { 273 | "titleCN": "圣灵破碎者", 274 | "titleJP": "ガイストクラッシャー", 275 | "officalSite": "http://gaist-anime.com/", 276 | "weekDayJP": 3, 277 | "weekDayCN": 4, 278 | "timeJP": "1700", 279 | "timeCN": "", 280 | "onAirSite": [ 281 | "http://www.youku.com/show_page/id_z5af840e4fe6811e2a705.html", 282 | "http://www.tudou.com/albumcover/F1cq966NDcY.html", 283 | "http://www.le.com/comic/93669.html" 284 | ], 285 | "newBgm": true, 286 | "bgmId": 79873, 287 | "showDate": "2013-10-02" 288 | }, 289 | "1310_17": { 290 | "titleCN": "单色小姐", 291 | "titleJP": "ミス・モノクローム -The Animation-", 292 | "officalSite": "http://www.starchild.co.jp/special/miss_monochrome_anime/", 293 | "weekDayJP": 3, 294 | "weekDayCN": 4, 295 | "timeJP": "0035", 296 | "timeCN": "", 297 | "onAirSite": [ 298 | "http://www.youku.com/show_page/id_z36d97dec03e811e38b3f.html", 299 | "http://www.tudou.com/albumcover/bh7k-qp7cRk.html", 300 | "http://v.pptv.com/page/n45q6FC2JmTHRa0.html", 301 | "http://www.le.com/comic/93561.html", 302 | "http://v.qq.com/detail/v/v3ahv9tmgwosl37.html" 303 | ], 304 | "newBgm": true, 305 | "bgmId": 80778, 306 | "showDate": "2013-10-02" 307 | }, 308 | "1310_18": { 309 | "titleCN": "来自风平浪静的明天", 310 | "titleJP": "凪のあすから", 311 | "officalSite": "http://www.nagiasu.jp/", 312 | "weekDayJP": 4, 313 | "weekDayCN": 5, 314 | "timeJP": "2130", 315 | "timeCN": "0000", 316 | "onAirSite": [ 317 | "http://www.iqiyi.com/a_19rrgjao0x.html", 318 | "http://www.acfun.tv/a/aa95" 319 | ], 320 | "newBgm": true, 321 | "bgmId": 47889, 322 | "showDate": "2013-10-03" 323 | }, 324 | "1310_19": { 325 | "titleCN": "京骚戏画", 326 | "titleJP": "京騒戯画", 327 | "officalSite": "http://www.kyousougiga-tv.com/", 328 | "weekDayJP": 4, 329 | "weekDayCN": 5, 330 | "timeJP": "0030", 331 | "timeCN": "", 332 | "onAirSite": [ 333 | "http://www.le.com/comic/93555.html", 334 | "http://tv.sohu.com/s2013/jsxh/", 335 | "http://www.acfun.tv/a/aa79" 336 | ], 337 | "newBgm": true, 338 | "bgmId": 79114, 339 | "showDate": "2013-10-03" 340 | }, 341 | "1310_20": { 342 | "titleCN": "偶像活动!第二年", 343 | "titleJP": "アイカツ!2年目", 344 | "officalSite": "http://www.aikatsu.net/02/index.html", 345 | "weekDayJP": 4, 346 | "weekDayCN": 5, 347 | "timeJP": "1800", 348 | "timeCN": "", 349 | "onAirSite": [ 350 | "http://www.youku.com/show_page/id_z12b8f2e01c4211e3a705.html", 351 | "http://www.tudou.com/albumcover/B9DlhZTCGd0.html", 352 | "http://www.iqiyi.com/a_19rrhayx3d.html" 353 | ], 354 | "newBgm": true, 355 | "bgmId": 139317, 356 | "showDate": "2013-10-03" 357 | }, 358 | "1310_21": { 359 | "titleCN": "噬血狂袭", 360 | "titleJP": "ストライク・ザ・ブラッド", 361 | "officalSite": "http://www.strike-the-blood.com/", 362 | "weekDayJP": 5, 363 | "weekDayCN": 6, 364 | "timeJP": "2330", 365 | "timeCN": "", 366 | "onAirSite": [], 367 | "newBgm": true, 368 | "bgmId": 67826, 369 | "showDate": "2013-10-04" 370 | }, 371 | "1310_22": { 372 | "titleCN": "IS 2", 373 | "titleJP": "IS<インフィニット・ストラトス>2", 374 | "officalSite": "http://www.tbs.co.jp/anime/is2/", 375 | "weekDayJP": 5, 376 | "weekDayCN": 5, 377 | "timeJP": "0058", 378 | "timeCN": "0430", 379 | "onAirSite": [], 380 | "newBgm": true, 381 | "bgmId": 68022, 382 | "showDate": "2013-10-04" 383 | }, 384 | "1310_23": { 385 | "titleCN": "Golden Time 青春纪行", 386 | "titleJP": "ゴールデンタイム", 387 | "officalSite": "http://golden-time.jp/", 388 | "weekDayJP": 5, 389 | "weekDayCN": 5, 390 | "timeJP": "0135", 391 | "timeCN": "0230", 392 | "onAirSite": [ 393 | "http://v.qq.com/detail/r/rur1k9y16jaqici.html", 394 | "http://www.bilibili.com/bangumi/i/468/" 395 | ], 396 | "newBgm": true, 397 | "bgmId": 68031, 398 | "showDate": "2013-10-04" 399 | }, 400 | "1310_24": { 401 | "titleCN": "Kill la Kill", 402 | "titleJP": "キルラキル", 403 | "officalSite": "http://www.kill-la-kill.jp/", 404 | "weekDayJP": 5, 405 | "weekDayCN": 5, 406 | "timeJP": "0105", 407 | "timeCN": "0110", 408 | "onAirSite": [ 409 | "http://comic.le.com/zt/KLK/index.shtml", 410 | "http://www.bilibili.com/bangumi/i/419/" 411 | ], 412 | "newBgm": true, 413 | "bgmId": 72941, 414 | "showDate": "2013-10-04" 415 | }, 416 | "1310_25": { 417 | "titleCN": "萌萌侵略者", 418 | "titleJP": "アウトブレイク・カンパニー", 419 | "officalSite": "http://www.tbs.co.jp/anime/obc/", 420 | "weekDayJP": 5, 421 | "weekDayCN": 5, 422 | "timeJP": "0028", 423 | "timeCN": "0400", 424 | "onAirSite": [], 425 | "newBgm": true, 426 | "bgmId": 78406, 427 | "showDate": "2013-10-04" 428 | }, 429 | "1310_26": { 430 | "titleCN": "记录的地平线", 431 | "titleJP": "ログ・ホライズン", 432 | "officalSite": "http://www9.nhk.or.jp/anime/loghorizon/", 433 | "weekDayJP": 6, 434 | "weekDayCN": 0, 435 | "timeJP": "1630", 436 | "timeCN": "", 437 | "onAirSite": [ 438 | "http://www.iqiyi.com/a_19rrhc0xgd.html", 439 | "http://www.youku.com/show_page/id_zb9229c08e3cb11e29748.html", 440 | "http://www.bilibili.com/bangumi/i/289/" 441 | ], 442 | "newBgm": true, 443 | "bgmId": 64140, 444 | "showDate": "2013-10-05" 445 | }, 446 | "1310_27": { 447 | "titleCN": "Little Busters! ~Refrain~", 448 | "titleJP": "リトルバスターズ! ~Refrain~", 449 | "officalSite": "http://litbus-anime.com/refrain/", 450 | "weekDayJP": 6, 451 | "weekDayCN": 0, 452 | "timeJP": "2130", 453 | "timeCN": "0100", 454 | "onAirSite": [], 455 | "newBgm": true, 456 | "bgmId": 69484, 457 | "showDate": "2013-10-05" 458 | }, 459 | "1310_28": { 460 | "titleCN": "没能做成勇者的我无可奈何的决定去工作", 461 | "titleJP": "勇者になれなかった俺はしぶしぶ就職を決意しました。", 462 | "officalSite": "http://yu-sibu.com/", 463 | "weekDayJP": 6, 464 | "weekDayCN": 6, 465 | "timeJP": "0030", 466 | "timeCN": "0200", 467 | "onAirSite": [ 468 | "http://comic.le.com/zt/dbcyzdw/index.shtml", 469 | "http://www.bilibili.com/sp/当不成勇者的我,只好认真找工作了。" 470 | ], 471 | "newBgm": true, 472 | "bgmId": 73440, 473 | "showDate": "2013-10-05" 474 | }, 475 | "1310_29": { 476 | "titleCN": "零度战姬Vibration", 477 | "titleJP": "フリージング ヴァイブレーション", 478 | "officalSite": "http://freezing.tv/", 479 | "weekDayJP": 6, 480 | "weekDayCN": 0, 481 | "timeJP": "0000", 482 | "timeCN": "", 483 | "onAirSite": [], 484 | "newBgm": true, 485 | "bgmId": 78404, 486 | "showDate": "2013-10-05" 487 | }, 488 | "1310_30": { 489 | "titleCN": "Phi·Brain 神之谜题第三季", 490 | "titleJP": "ファイ・ブレイン3 神のパズル", 491 | "officalSite": "http://www9.nhk.or.jp/anime/phibrain/index.html", 492 | "weekDayJP": 0, 493 | "weekDayCN": 1, 494 | "timeJP": "1630", 495 | "timeCN": "", 496 | "onAirSite": [ 497 | "http://www.tudou.com/albumcover/0ummBD47jvU.html", 498 | "http://www.youku.com/show_page/id_z0d218d7619ca11e38b3f.html", 499 | "http://v.qq.com/detail/u/u0ae6bix0kt4lag.html", 500 | "http://www.le.com/comic/93552.html", 501 | "http://www.bilibili.com/bangumi/i/489/" 502 | ], 503 | "newBgm": true, 504 | "bgmId": 49693, 505 | "showDate": "2013-10-06" 506 | }, 507 | "1310_31": { 508 | "titleCN": "WHITE ALBUM2", 509 | "titleJP": "WHITE ALBUM2", 510 | "officalSite": "http://whitealbum2.jp/", 511 | "weekDayJP": 0, 512 | "weekDayCN": 0, 513 | "timeJP": "0030", 514 | "timeCN": "0030", 515 | "onAirSite": [ 516 | "http://www.iqiyi.com/a_19rrgjanw9.html" 517 | ], 518 | "newBgm": true, 519 | "bgmId": 69496, 520 | "showDate": "2013-10-06" 521 | }, 522 | "1310_32": { 523 | "titleCN": "夜樱四重奏 ~花之歌~", 524 | "titleJP": "夜桜四重奏~ハナノウタ~", 525 | "officalSite": "http://yozakura-anime.jp/", 526 | "weekDayJP": 0, 527 | "weekDayCN": 1, 528 | "timeJP": "2230", 529 | "timeCN": "", 530 | "onAirSite": [ 531 | "http://www.tudou.com/albumcover/XhGkrzdXGf8.html", 532 | "http://www.youku.com/show_page/id_ze9c14c84e22611e29748.html", 533 | "http://v.qq.com/detail/j/jye92pufaaq3fvr.html", 534 | "http://www.bilibili.com/bangumi/i/473/" 535 | ], 536 | "newBgm": true, 537 | "bgmId": 71955, 538 | "showDate": "2013-10-06" 539 | }, 540 | "1310_33": { 541 | "titleCN": "钻石王牌", 542 | "titleJP": "ダイヤのA", 543 | "officalSite": "http://diaace.com/", 544 | "weekDayJP": 0, 545 | "weekDayCN": 0, 546 | "timeJP": "0730", 547 | "timeCN": "1030", 548 | "onAirSite": [ 549 | "http://www.iqiyi.com/a_19rrgjao65.html", 550 | "http://www.acfun.tv/v/ab103" 551 | ], 552 | "newBgm": true, 553 | "bgmId": 73083, 554 | "showDate": "2013-10-06" 555 | }, 556 | "1310_34": { 557 | "titleCN": "少女骑士物语", 558 | "titleJP": "ワルキューレ ロマンツェ", 559 | "officalSite": "http://walroma.com/", 560 | "weekDayJP": 0, 561 | "weekDayCN": 0, 562 | "timeJP": "2330", 563 | "timeCN": "2330", 564 | "onAirSite": [ 565 | "http://comic.le.com/zt/snqswy/index.shtml", 566 | "http://www.bilibili.com/bangumi/i/480/" 567 | ], 568 | "newBgm": true, 569 | "bgmId": 76210, 570 | "showDate": "2013-10-06" 571 | }, 572 | "1310_35": { 573 | "titleCN": "眼镜部", 574 | "titleJP": "メガネブ!", 575 | "officalSite": "http://mgnb.tv/", 576 | "weekDayJP": 0, 577 | "weekDayCN": 1, 578 | "timeJP": "2300", 579 | "timeCN": "0000", 580 | "onAirSite": [ 581 | "http://www.iqiyi.com/a_19rrgjanth.html", 582 | "http://www.acfun.tv/a/aa91" 583 | ], 584 | "newBgm": true, 585 | "bgmId": 77479, 586 | "showDate": "2013-10-06" 587 | }, 588 | "1310_36": { 589 | "titleCN": "魔笛MAGI 2期", 590 | "titleJP": "マギ 第2期", 591 | "officalSite": "http://www.project-magi.com/", 592 | "weekDayJP": 0, 593 | "weekDayCN": 0, 594 | "timeJP": "1600", 595 | "timeCN": "1605", 596 | "onAirSite": [ 597 | "http://comic.le.com/zt/magi2/index.shtml", 598 | "http://bangumi.bilibili.com/anime/471", 599 | "http://www.acfun.tv/a/aa107" 600 | ], 601 | "newBgm": true, 602 | "bgmId": 77646, 603 | "showDate": "2013-10-06" 604 | }, 605 | "1310_37": { 606 | "titleCN": "黑子的篮球 2期", 607 | "titleJP": "黒子のバスケ 第2期", 608 | "officalSite": "http://www.kurobas.com/", 609 | "weekDayJP": 0, 610 | "weekDayCN": 1, 611 | "timeJP": "0058", 612 | "timeCN": "", 613 | "onAirSite": [ 614 | "http://www.youku.com/show_page/id_ze5894f40e3ca11e29748.html", 615 | "http://v.qq.com/detail/5/53x6bbyb07ebl3s.html", 616 | "http://www.tudou.com/albumcover/_nJJMEa6O6I.html", 617 | "http://www.iqiyi.com/a_19rrgjann1.html", 618 | "http://www.le.com/comic/93033.html", 619 | "http://www.bilibili.com/bangumi/i/1625/" 620 | ], 621 | "newBgm": true, 622 | "bgmId": 77706, 623 | "showDate": "2013-10-06" 624 | }, 625 | "1310_38": { 626 | "titleCN": "我要成为世界最强偶像", 627 | "titleJP": "世界でいちばん強くなりたい!", 628 | "officalSite": "http://www.sekatsuyo.com/", 629 | "weekDayJP": 0, 630 | "weekDayCN": 0, 631 | "timeJP": "2100", 632 | "timeCN": "2200", 633 | "onAirSite": [ 634 | "http://data.movie.kankan.com/movie/74027", 635 | "http://www.youku.com/show_page/id_z0995377e0da211e1a046.html", 636 | "http://www.tudou.com/albumcover/I8kEXNTYFeA.html", 637 | "http://www.bilibili.com/bangumi/i/486/" 638 | ], 639 | "newBgm": true, 640 | "bgmId": 78408, 641 | "showDate": "2013-10-06" 642 | }, 643 | "1310_39": { 644 | "titleCN": "第一神拳 Rising", 645 | "titleJP": "はじめの一歩 Rising", 646 | "officalSite": "http://www.ntv.co.jp/ippo/", 647 | "weekDayJP": 0, 648 | "weekDayCN": 1, 649 | "timeJP": "0035", 650 | "timeCN": "", 651 | "onAirSite": [ 652 | "http://bangumi.bilibili.com/anime/502/" 653 | ], 654 | "newBgm": true, 655 | "bgmId": 78798, 656 | "showDate": "2013-10-06" 657 | }, 658 | "1310_40": { 659 | "titleCN": "声优战队 Voice Storm 7", 660 | "titleJP": "声優戦隊ボイストーム7", 661 | "officalSite": "http://www.ntv.co.jp/voicetorm7/", 662 | "weekDayJP": 0, 663 | "weekDayCN": 1, 664 | "timeJP": "0105", 665 | "timeCN": "", 666 | "onAirSite": [ 667 | "http://www.youku.com/show_page/id_z8fd33520055d11e3a705.html", 668 | "http://www.tudou.com/albumcover/mE4mtF0Jtxk.html", 669 | "http://v.qq.com/detail/n/nvaj06cswye3rv0.html", 670 | "http://www.bilibili.com/bangumi/i/460/", 671 | "http://www.acfun.tv/a/aa61" 672 | ], 673 | "newBgm": true, 674 | "bgmId": 79467, 675 | "showDate": "2013-10-06" 676 | }, 677 | "1310_41": { 678 | "titleCN": "摸索吧!部活剧", 679 | "titleJP": "てさぐれ!部活もの", 680 | "officalSite": "http://www.ntv.co.jp/tesabu/", 681 | "weekDayJP": 0, 682 | "weekDayCN": 1, 683 | "timeJP": "2330", 684 | "timeCN": "", 685 | "onAirSite": [ 686 | "http://www.youku.com/show_page/id_z6236bbae032911e38b3f.html", 687 | "http://www.tudou.com/albumcover/T5nFEQ19Yjo.html", 688 | "http://www.bilibili.com/bangumi/i/1578/" 689 | ], 690 | "newBgm": true, 691 | "bgmId": 80442, 692 | "showDate": "2013-10-06" 693 | }, 694 | "1310_42": { 695 | "titleCN": "网球并不可笑嘛 3期", 696 | "titleJP": "てーきゅう 第3期", 697 | "officalSite": "http://te-kyu.com/", 698 | "weekDayJP": 0, 699 | "weekDayCN": 1, 700 | "timeJP": "2125", 701 | "timeCN": "", 702 | "onAirSite": [ 703 | "http://www.le.com/comic/93675.html", 704 | "http://www.bilibili.com/bangumi/i/19/" 705 | ], 706 | "newBgm": true, 707 | "bgmId": 82079, 708 | "showDate": "2013-10-06" 709 | }, 710 | "1310_43": { 711 | "titleCN": "机巧少女不会受伤", 712 | "titleJP": "機巧少女は傷つかない", 713 | "officalSite": "http://www.machine-doll.com/", 714 | "weekDayJP": 1, 715 | "weekDayCN": 1, 716 | "timeJP": "2330", 717 | "timeCN": "2330", 718 | "onAirSite": [ 719 | "http://www.iqiyi.com/a_19rrgjanhh.html", 720 | "http://www.acfun.tv/a/aa89" 721 | ], 722 | "newBgm": true, 723 | "bgmId": 61962, 724 | "showDate": "2013-10-07" 725 | }, 726 | "1310_44": { 727 | "titleCN": "银狐", 728 | "titleJP": "ぎんぎつね", 729 | "officalSite": "http://gingitsune.net/", 730 | "weekDayJP": 1, 731 | "weekDayCN": 1, 732 | "timeJP": "0005", 733 | "timeCN": "0035", 734 | "onAirSite": [ 735 | "http://www.youku.com/show_page/id_z0d2fcdb00a1f11e3a705.html", 736 | "http://www.tudou.com/albumcover/ZA5Yw-VdK2s.html" 737 | ], 738 | "newBgm": true, 739 | "bgmId": 70960, 740 | "showDate": "2013-10-07" 741 | }, 742 | "1310_45": { 743 | "titleCN": "高达Build Fighters", 744 | "titleJP": "ガンダムビルドファイターズ", 745 | "officalSite": "http://gundam-bf.net/", 746 | "weekDayJP": 1, 747 | "weekDayCN": 1, 748 | "timeJP": "1700", 749 | "timeCN": "1900", 750 | "onAirSite": [], 751 | "newBgm": true, 752 | "bgmId": 77171, 753 | "showDate": "2013-10-07" 754 | }, 755 | "1310_46": { 756 | "titleCN": "飚速宅男", 757 | "titleJP": "弱虫ペダル", 758 | "officalSite": "http://yowapeda.com/", 759 | "weekDayJP": 2, 760 | "weekDayCN": 2, 761 | "timeJP": "0035", 762 | "timeCN": "0105", 763 | "onAirSite": [ 764 | "http://www.youku.com/show_page/id_z88da380a055711e3b8b7.html", 765 | "http://www.tudou.com/albumcover/iXeFPRjW9ZM.html" 766 | ], 767 | "newBgm": true, 768 | "bgmId": 59583, 769 | "showDate": "2013-10-08" 770 | }, 771 | "1310_47": { 772 | "titleCN": "苍蓝钢铁的琶音", 773 | "titleJP": "蒼き鋼のアルペジオ ‐アルス・ノヴァ‐", 774 | "officalSite": "http://www.aokihagane.com/", 775 | "weekDayJP": 2, 776 | "weekDayCN": 3, 777 | "timeJP": "0155", 778 | "timeCN": "", 779 | "onAirSite": [ 780 | "http://www.youku.com/show_page/id_z3dfc462efe6911e2a705.html", 781 | "http://www.tudou.com/albumcover/y7w-zWgB64Q.html", 782 | "http://www.le.com/comic/93453.html", 783 | "http://www.bilibili.com/bangumi/i/483/", 784 | "http://www.acfun.tv/a/aa75" 785 | ], 786 | "newBgm": true, 787 | "bgmId": 74663, 788 | "showDate": "2013-10-08" 789 | }, 790 | "1310_48": { 791 | "titleCN": "悠哉日常大王", 792 | "titleJP": "のんのんびより", 793 | "officalSite": "http://www.nonnontv.com/", 794 | "weekDayJP": 2, 795 | "weekDayCN": 2, 796 | "timeJP": "0105", 797 | "timeCN": "0135", 798 | "onAirSite": [ 799 | "http://www.youku.com/show_page/id_z838fc1c8030211e3b8b7.html", 800 | "http://www.tudou.com/albumcover/ulKOjCIyn9g.html" 801 | ], 802 | "newBgm": true, 803 | "bgmId": 78405, 804 | "showDate": "2013-10-08" 805 | }, 806 | "1310_49": { 807 | "titleCN": "东京暗鸦", 808 | "titleJP": "東京レイヴンズ", 809 | "officalSite": "http://www.tokyo-ravens.com/", 810 | "weekDayJP": 2, 811 | "weekDayCN": 2, 812 | "timeJP": "2330", 813 | "timeCN": "2330", 814 | "onAirSite": [], 815 | "newBgm": true, 816 | "bgmId": 78542, 817 | "showDate": "2013-10-08" 818 | }, 819 | "1310_50": { 820 | "titleCN": "苍翼默示录 Alter Memory", 821 | "titleJP": "BLAZBLUE Alter Memory", 822 | "officalSite": "http://blazblue-am.jp/", 823 | "weekDayJP": 3, 824 | "weekDayCN": 3, 825 | "timeJP": "0030", 826 | "timeCN": "0400", 827 | "onAirSite": [ 828 | "http://tv.sohu.com/s2013/blazblue1/", 829 | "http://www.youku.com/show_page/id_z229398e2e3d911e29748.html" 830 | ], 831 | "newBgm": true, 832 | "bgmId": 73825, 833 | "showDate": "2013-10-09" 834 | }, 835 | "1310_51": { 836 | "titleCN": "伽利略少女", 837 | "titleJP": "ガリレイドンナ", 838 | "officalSite": "http://www.galileidonna.tv/", 839 | "weekDayJP": 4, 840 | "weekDayCN": 5, 841 | "timeJP": "2350", 842 | "timeCN": "0050", 843 | "onAirSite": [ 844 | "http://comic.le.com/zt/jllsn/index.shtml", 845 | "http://www.bilibili.com/bangumi/i/475/" 846 | ], 847 | "newBgm": true, 848 | "bgmId": 77471, 849 | "showDate": "2013-10-10" 850 | }, 851 | "1310_52": { 852 | "titleCN": "我的脑内恋碍选项", 853 | "titleJP": "俺の脳内選択肢が、学園ラブコメを全力で邪魔している", 854 | "officalSite": "http://noucome.jp/", 855 | "weekDayJP": 4, 856 | "weekDayCN": 4, 857 | "timeJP": "0000", 858 | "timeCN": "0130", 859 | "onAirSite": [ 860 | "http://comic.le.com/zt/noucome/index.shtml", 861 | "http://www.bilibili.com/bangumi/i/2673/" 862 | ], 863 | "newBgm": true, 864 | "bgmId": 77570, 865 | "showDate": "2013-10-10" 866 | }, 867 | "1310_53": { 868 | "titleCN": "革命机Valvrave 2期", 869 | "titleJP": "革命機ヴァルヴレイヴ 2ndシーズン", 870 | "officalSite": "http://www.valvrave.com/", 871 | "weekDayJP": 5, 872 | "weekDayCN": 5, 873 | "timeJP": "0035", 874 | "timeCN": "0435", 875 | "onAirSite": [ 876 | "http://www.iqiyi.com/a_19rrgjanrd.html", 877 | "http://www.acfun.tv/a/aa2453" 878 | ], 879 | "newBgm": true, 880 | "bgmId": 70131, 881 | "showDate": "2013-10-11" 882 | }, 883 | "1310_54": { 884 | "titleCN": "武士弗拉明戈", 885 | "titleJP": "サムライフラメンコ", 886 | "officalSite": "http://www.samumenco.com/", 887 | "weekDayJP": 5, 888 | "weekDayCN": 5, 889 | "timeJP": "0020", 890 | "timeCN": "0025", 891 | "onAirSite": [ 892 | "http://comic.le.com/zt/wsflmg/index.shtml", 893 | "http://www.bilibili.com/bangumi/i/476/" 894 | ], 895 | "newBgm": true, 896 | "bgmId": 77473, 897 | "showDate": "2013-10-11" 898 | }, 899 | "1310_55": { 900 | "titleCN": "限制级杀手", 901 | "titleJP": "殺し屋さん", 902 | "officalSite": "http://www.5648.jp/", 903 | "weekDayJP": 5, 904 | "weekDayCN": 6, 905 | "timeJP": "0000", 906 | "timeCN": "", 907 | "onAirSite": [ 908 | "http://v.qq.com/detail/s/sil8p038h3hthpd.html", 909 | "http://www.tudou.com/albumcover/27kPM1IBmTA.html", 910 | "http://www.youku.com/show_page/id_z8ef6f2500a2011e38b3f.html", 911 | "http://www.bilibili.com/bangumi/i/495/" 912 | ], 913 | "newBgm": true, 914 | "bgmId": 78398, 915 | "showDate": "2013-10-11" 916 | }, 917 | "1310_56": { 918 | "titleCN": "口袋妖怪 XY", 919 | "titleJP": "ポケットモンスター XY", 920 | "titleEN": "Pokemon XY", 921 | "officalSite": "http://www.tv-tokyo.co.jp/anime/pokemon_xy/", 922 | "weekDayJP": 4, 923 | "weekDayCN": 5, 924 | "timeJP": "1800", 925 | "timeCN": "", 926 | "onAirSite": [ 927 | "http://www.iqiyi.com/a_19rrhab3gh.html", 928 | "http://v.pptv.com/page/VicbiaYMguntwicvSU.html", 929 | "http://v.qq.com/detail/o/o6ftuwm1j0xfa62.html", 930 | "http://www.tudou.com/albumcover/CIK0mT03n_M.html", 931 | "http://www.youku.com/show_page/id_zca5b9dc41c3f11e3b8b7.html", 932 | "http://www.le.com/comic/93548.html", 933 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=%E5%AE%A0%E7%89%A9%E5%B0%8F%E7%B2%BE%E7%81%B5XY" 934 | ], 935 | "newBgm": true, 936 | "bgmId": 78799, 937 | "showDate": "2013-10-17" 938 | }, 939 | "1310_57": { 940 | "titleCN": "噗哔啵~来自未来~", 941 | "titleJP": "プピポー!", 942 | "officalSite": "http://pupipo.tv/", 943 | "weekDayJP": 6, 944 | "weekDayCN": 0, 945 | "timeJP": "0053", 946 | "timeCN": "", 947 | "onAirSite": [ 948 | "http://www.tudou.com/albumcover/NBUkfZHMX0g.html", 949 | "http://www.youku.com/show_page/id_z0546d626525811e3a705.html", 950 | "http://v.qq.com/detail/1/1nx4dcrhqgqjibp.html", 951 | "http://www.le.com/comic/95038.html" 952 | ], 953 | "newBgm": true, 954 | "bgmId": 88441, 955 | "showDate": "2013-12-21" 956 | } 957 | } -------------------------------------------------------------------------------- /json/bangumi-1410.json: -------------------------------------------------------------------------------- 1 | { 2 | "1310_0": { 3 | "titleCN": "名侦探柯南", 4 | "titleJP": "名探偵コナン", 5 | "titleEN": "Detective Conan", 6 | "officalSite": "http://www.ytv.co.jp/conan/", 7 | "weekDayJP": 6, 8 | "weekDayCN": 6, 9 | "timeJP": "1800", 10 | "timeCN": "1930", 11 | "onAirSite": [ 12 | "http://www.iqiyi.com/a_19rrhc0gyd.html", 13 | "http://v.qq.com/detail/h/hzgtnf6tbvfekfv.html", 14 | "http://tv.sohu.com/s2012/mztkn/", 15 | "http://www.le.com/comic/5938.html", 16 | "http://v.pptv.com/page/ac24Np4EdLIVkics.html" 17 | ], 18 | "newBgm": false, 19 | "bgmId": 899, 20 | "showDate": "1996-01-08" 21 | }, 22 | "1310_1": { 23 | "titleCN": "海贼王", 24 | "titleJP": "ONE PIECE", 25 | "titleEN": "ONE PIECE", 26 | "officalSite": "http://www.toei-anim.co.jp/tv/onep/", 27 | "weekDayJP": 0, 28 | "weekDayCN": 0, 29 | "timeJP": "0930", 30 | "timeCN": "", 31 | "onAirSite": [ 32 | "http://tv.sohu.com/s2013/onepiece/", 33 | "http://www.iqiyi.com/a_19rrhb3xvl.html", 34 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=海贼王" 35 | ], 36 | "newBgm": false, 37 | "bgmId": 975, 38 | "showDate": "1999-10-20" 39 | }, 40 | "1310_2": { 41 | "titleCN": "火影忍者 疾风传", 42 | "titleJP": "NARUTO -ナルト- 疾風伝", 43 | "titleEN": "Naruto Shippuuden", 44 | "officalSite": "http://www.tv-tokyo.co.jp/anime/naruto/index2.html", 45 | "weekDayJP": 4, 46 | "weekDayCN": 4, 47 | "timeJP": "1830", 48 | "timeCN": "1900", 49 | "onAirSite": [ 50 | "http://www.tudou.com/albumcover/Lqfme5hSolM.html", 51 | "http://www.bilibili.com/bangumi/i/3287/", 52 | "http://www.youku.com/show_page/id_zcc001f06962411de83b1.html", 53 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=火影忍者" 54 | ], 55 | "newBgm": false, 56 | "bgmId": 2782, 57 | "showDate": "2007-02-15" 58 | }, 59 | "1310_33": { 60 | "titleCN": "钻石王牌", 61 | "titleJP": "ダイヤのA", 62 | "officalSite": "http://diaace.com/", 63 | "weekDayJP": 0, 64 | "weekDayCN": 0, 65 | "timeJP": "0730", 66 | "timeCN": "1030", 67 | "onAirSite": [ 68 | "http://www.iqiyi.com/a_19rrgjao65.html", 69 | "http://www.acfun.tv/v/ab103" 70 | ], 71 | "newBgm": false, 72 | "bgmId": 73083, 73 | "showDate": "2013-10-06" 74 | }, 75 | "1310_56": { 76 | "titleCN": "口袋妖怪 XY", 77 | "titleJP": "ポケットモンスター XY", 78 | "titleEN": "Pokemon XY", 79 | "officalSite": "http://www.tv-tokyo.co.jp/anime/pokemon_xy/", 80 | "weekDayJP": 4, 81 | "weekDayCN": 5, 82 | "timeJP": "1800", 83 | "timeCN": "", 84 | "onAirSite": [ 85 | "http://www.iqiyi.com/a_19rrhab3gh.html", 86 | "http://v.pptv.com/page/VicbiaYMguntwicvSU.html", 87 | "http://v.qq.com/detail/o/o6ftuwm1j0xfa62.html", 88 | "http://www.tudou.com/albumcover/CIK0mT03n_M.html", 89 | "http://www.youku.com/show_page/id_zca5b9dc41c3f11e3b8b7.html", 90 | "http://www.le.com/comic/93548.html", 91 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=%E5%AE%A0%E7%89%A9%E5%B0%8F%E7%B2%BE%E7%81%B5XY" 92 | ], 93 | "newBgm": false, 94 | "bgmId": 78799, 95 | "showDate": "2013-10-17" 96 | }, 97 | "1401_17": { 98 | "titleCN": "妖怪手表", 99 | "titleJP": "妖怪ウォッチ", 100 | "officalSite": "http://www.tv-tokyo.co.jp/anime/youkai-watch/", 101 | "weekDayJP": 5, 102 | "weekDayCN": 6, 103 | "timeJP": "1730", 104 | "timeCN": "", 105 | "onAirSite": [ 106 | "http://v.qq.com/detail/h/hbccdwvo9t21w4i.html" 107 | ], 108 | "newBgm": false, 109 | "bgmId": 83124, 110 | "showDate": "2014-01-08" 111 | }, 112 | "1401_37": { 113 | "titleCN": "卡片战斗先导者 双斗盟友篇", 114 | "titleJP": "カードファイト!! ヴァンガード レギオンメイト編", 115 | "officalSite": "http://www.tv-tokyo.co.jp/anime/cf-vanguard-lm/", 116 | "weekDayJP": 0, 117 | "weekDayCN": 1, 118 | "timeJP": "0900", 119 | "timeCN": "", 120 | "onAirSite": [ 121 | "http://www.youku.com/show_page/id_zdecc9d30adb711e38b3f.html", 122 | "http://www.tudou.com/albumcover/idxgUQ7qnCA.html" 123 | ], 124 | "newBgm": false, 125 | "bgmId": 90632, 126 | "showDate": "2014-03-09" 127 | }, 128 | "1404_0": { 129 | "titleCN": "Happiness Charge Precure", 130 | "titleJP": "ハピネスチャージプリキュア!", 131 | "officalSite": "http://www.toei-anim.co.jp/tv/happinesscharge_precure/", 132 | "weekDayJP": 0, 133 | "weekDayCN": 0, 134 | "timeJP": "0730", 135 | "timeCN": "", 136 | "onAirSite": [ 137 | "http://www.le.com/comic/95301.html", 138 | "http://bangumi.bilibili.com/anime/1711" 139 | ], 140 | "newBgm": false, 141 | "bgmId": 88348, 142 | "showDate": "2014-02-02" 143 | }, 144 | "1404_1": { 145 | "titleCN": "魔神之骨", 146 | "titleJP": "マジンボーン", 147 | "officalSite": "http://www.toei-anim.co.jp/tv/majinbone/", 148 | "weekDayJP": 2, 149 | "weekDayCN": 3, 150 | "timeJP": "1730", 151 | "timeCN": "", 152 | "onAirSite": [], 153 | "newBgm": false, 154 | "bgmId": 91135, 155 | "showDate": "2014-04-01" 156 | }, 157 | "1404_2": { 158 | "titleCN": "复仇者联盟:光盘战争", 159 | "titleJP": "ディスク・ウォーズ:アベンジャーズ", 160 | "officalSite": "http://www.tv-tokyo.co.jp/anime/dw_avengers/", 161 | "weekDayJP": 3, 162 | "weekDayCN": 3, 163 | "timeJP": "1730", 164 | "timeCN": "2300", 165 | "onAirSite": [ 166 | "http://www.iqiyi.com/a_19rrhc2yph.html", 167 | "http://www.youku.com/show_page/id_zdaf240e092e911e38b3f.html", 168 | "http://www.tudou.com/albumcover/8O6LrFIHhfc.html", 169 | "http://www.acfun.tv/a/aa1241" 170 | ], 171 | "newBgm": false, 172 | "bgmId": 86414, 173 | "showDate": "2014-04-02" 174 | }, 175 | "1404_12": { 176 | "titleCN": "展开骑士", 177 | "titleJP": "テンカイナイト", 178 | "officalSite": "http://www.tv-tokyo.co.jp/anime/tenkaiknight/", 179 | "weekDayJP": 6, 180 | "weekDayCN": 0, 181 | "timeJP": "0800", 182 | "timeCN": "", 183 | "onAirSite": [ 184 | "http://www.iqiyi.com/a_19rrhbz3g5.html" 185 | ], 186 | "newBgm": false, 187 | "bgmId": 80736, 188 | "showDate": "2014-04-05" 189 | }, 190 | "1404_16": { 191 | "titleCN": "妖精的尾巴 2期", 192 | "titleJP": "FAIRY TAIL 新シリーズ", 193 | "titleEN": "FAIRY TAIL", 194 | "officalSite": "http://www.fairytail-tv.com/", 195 | "weekDayJP": 6, 196 | "weekDayCN": 6, 197 | "timeJP": "0930", 198 | "timeCN": "1400", 199 | "onAirSite": [ 200 | "http://tv.sohu.com/s2011/yjdwb/" 201 | ], 202 | "newBgm": false, 203 | "bgmId": 91946, 204 | "showDate": "2014-04-05" 205 | }, 206 | "1404_18": { 207 | "titleCN": "Lady 宝石宠物", 208 | "titleJP": "レディ ジュエルペット", 209 | "officalSite": "http://www.tv-tokyo.co.jp/anime/jewelpet6/", 210 | "weekDayJP": 6, 211 | "weekDayCN": 6, 212 | "timeJP": "0730", 213 | "timeCN": "", 214 | "onAirSite": [ 215 | "http://www.tudou.com/albumcover/95FqH0R7tO8.html", 216 | "http://www.youku.com/show_page/id_z61658ec6aa6311e3a705.html", 217 | "http://www.le.com/comic/10000910.html", 218 | "http://v.pptv.com/page/VCWSEXnfT43wbtY.html", 219 | "http://www.acfun.tv/a/aa1263" 220 | ], 221 | "newBgm": false, 222 | "bgmId": 96775, 223 | "showDate": "2014-04-05" 224 | }, 225 | "1404_30": { 226 | "titleCN": "游戏王ARC-V", 227 | "titleJP": "遊☆戯☆王ARC-V ", 228 | "titleEN": "Yu-Gi-Oh Arc-V", 229 | "officalSite": "http://www.tv-tokyo.co.jp/anime/yugioh-arcv/", 230 | "weekDayJP": 0, 231 | "weekDayCN": 1, 232 | "timeJP": "1630", 233 | "timeCN": "", 234 | "onAirSite": [ 235 | "http://www.le.com/comic/10000913.html", 236 | "http://v.pptv.com/page/afDcWsIomNY5tx8.html", 237 | "http://www.youku.com/show_page/id_z40c8abaa99e511e3b8b7.html", 238 | "http://www.tudou.com/albumcover/j6bLOojGi-I.html", 239 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=游戏王ARC-V" 240 | ], 241 | "newBgm": false, 242 | "bgmId": 92161, 243 | "showDate": "2014-04-06" 244 | }, 245 | "1404_33": { 246 | "titleCN": "龙珠改 魔人布欧篇", 247 | "titleJP": "ドラゴンボール改(魔人ブウ編)", 248 | "officalSite": "http://www.toei-anim.co.jp/tv/dragon_kai/", 249 | "weekDayJP": 0, 250 | "weekDayCN": 0, 251 | "timeJP": "0800", 252 | "timeCN": "", 253 | "onAirSite": [ 254 | "http://tv.sohu.com/s2014/lzg2", 255 | "http://www.iqiyi.com/a_19rrhb1cr1.html", 256 | "http://www.acfun.tv/a/aa1243" 257 | ], 258 | "newBgm": false, 259 | "bgmId": 97045, 260 | "showDate": "2014-04-06" 261 | }, 262 | "1407_5": { 263 | "titleCN": "白银的意志 安格弗伦", 264 | "titleJP": "白銀の意思 アルジェヴォルン", 265 | "officalSite": "http://www.argevollen.com/", 266 | "weekDayJP": 4, 267 | "weekDayCN": 4, 268 | "timeJP": "2200", 269 | "timeCN": "2300", 270 | "onAirSite": [ 271 | "http://www.iqiyi.com/a_19rrgif3l1.html", 272 | "http://www.acfun.tv/a/aa2649" 273 | ], 274 | "newBgm": false, 275 | "bgmId": 100498, 276 | "showDate": "2014-07-03" 277 | }, 278 | "1407_8": { 279 | "titleCN": "美少女战士 Crystal", 280 | "titleJP": "美少女戦士セーラームーンCrystal", 281 | "officalSite": "http://sailormoon-official.com/animation/", 282 | "weekDayJP": 6, 283 | "weekDayCN": 6, 284 | "timeJP": "1800", 285 | "timeCN": "2000", 286 | "onAirSite": [ 287 | "http://tv.sohu.com/s2014/msnzsc/" 288 | ], 289 | "newBgm": false, 290 | "comment": "两周一话", 291 | "bgmId": 43523, 292 | "showDate": "2014-07-05" 293 | }, 294 | "1407_9": { 295 | "titleCN": "Sword Art Online Ⅱ", 296 | "titleJP": "ソードアート・オンラインⅡ", 297 | "officalSite": "http://www.swordart-online.net/", 298 | "weekDayJP": 6, 299 | "weekDayCN": 6, 300 | "timeJP": "2230", 301 | "timeCN": "2235", 302 | "onAirSite": [ 303 | "http://www.le.com/comic/10001115.html" 304 | ], 305 | "newBgm": false, 306 | "bgmId": 92382, 307 | "showDate": "2014-07-05" 308 | }, 309 | "1407_11": { 310 | "titleCN": "PriPara 美妙旋律", 311 | "titleJP": "プリパラ", 312 | "officalSite": "http://www.tv-tokyo.co.jp/anime/pripara/index2.html", 313 | "weekDayJP": 6, 314 | "weekDayCN": 6, 315 | "timeJP": "0900", 316 | "timeCN": "", 317 | "onAirSite": [ 318 | "http://www.le.com/comic/10003003.html", 319 | "http://www.youku.com/show_page/id_z94b79a0af68811e3b8b7.html", 320 | "http://www.tudou.com/albumcover/CDmJERssqrQ.html" 321 | ], 322 | "newBgm": false, 323 | "bgmId": 99748, 324 | "showDate": "2014-07-05" 325 | }, 326 | "1407_16": { 327 | "titleCN": "斩·赤红之瞳", 328 | "titleJP": "アカメが斬る!", 329 | "officalSite": "http://akame.tv/", 330 | "weekDayJP": 0, 331 | "weekDayCN": 1, 332 | "timeJP": "2300", 333 | "timeCN": "0000", 334 | "onAirSite": [ 335 | "http://www.iqiyi.com/a_19rrgif6md.html", 336 | "http://tv.sohu.com/s2014/zchzt/", 337 | "http://bangumi.bilibili.com/anime/52", 338 | "http://www.acfun.tv/a/aa2667" 339 | ], 340 | "newBgm": false, 341 | "bgmId": 94244, 342 | "showDate": "2014-07-06" 343 | }, 344 | "1407_30": { 345 | "titleCN": "前进吧!登山少女 2期", 346 | "titleJP": "ヤマノススメ セカンドシーズン", 347 | "officalSite": "http://www.yamanosusume.com/", 348 | "weekDayJP": 3, 349 | "weekDayCN": 4, 350 | "timeJP": "2100", 351 | "timeCN": "0030", 352 | "onAirSite": [ 353 | "http://tv.sohu.com/s2014/qjbdssn2/" 354 | ], 355 | "newBgm": false, 356 | "bgmId": 86670, 357 | "showDate": "2014-07-09" 358 | }, 359 | "1407_47": { 360 | "titleCN": "火星异种", 361 | "titleJP": "TERRAFORMARS(テラフォーマーズ)", 362 | "officalSite": "http://www.terraformars.tv/", 363 | "weekDayJP": 5, 364 | "weekDayCN": 6, 365 | "timeJP": "2330", 366 | "timeCN": "0030", 367 | "onAirSite": [ 368 | "http://www.tudou.com/albumcover/jGaFpdJqObQ.html", 369 | "http://www.youku.com/show_page/id_zff86b776cf5f11e3b8b7.html", 370 | "http://www.iqiyi.com/a_19rrhc139h.html" 371 | ], 372 | "newBgm": true, 373 | "bgmId": 96787, 374 | "showDate": "2014-09-26" 375 | }, 376 | "1410_0": { 377 | "titleCN": "舞力四射", 378 | "titleJP": "トライブクルクル", 379 | "officalSite": "http://www.tribecoolcrew.net/", 380 | "weekDayJP": 0, 381 | "weekDayCN": 2, 382 | "timeJP": "0600", 383 | "timeCN": "1435", 384 | "onAirSite": [ 385 | "http://www.iqiyi.com/a_19rrhc0yh5.html" 386 | ], 387 | "newBgm": true, 388 | "bgmId": 109775, 389 | "showDate": "2014-09-28" 390 | }, 391 | "1410_1": { 392 | "titleCN": "Buddy Complex 完结篇", 393 | "titleJP": "バディ・コンプレックス 完結編 -あの空に還る未来で-", 394 | "officalSite": "http://buddy-complex.jp/", 395 | "weekDayJP": 1, 396 | "weekDayCN": 3, 397 | "timeJP": "2300", 398 | "timeCN": "0000", 399 | "onAirSite": [ 400 | "http://www.iqiyi.com/a_19rrhc1759.html", 401 | "http://tv.sohu.com/s2014/buddycomplex/", 402 | "http://data.movie.kankan.com/movie/75159" 403 | ], 404 | "newBgm": true, 405 | "comment": "完结篇 共两话
前后篇即14-15话", 406 | "bgmId": 105214, 407 | "showDate": "2014-09-29" 408 | }, 409 | "1410_2": { 410 | "titleCN": "电器街的漫画店", 411 | "titleJP": "デンキ街の本屋さん", 412 | "officalSite": "http://umanohone.jp/", 413 | "weekDayJP": 4, 414 | "weekDayCN": 4, 415 | "timeJP": "2130", 416 | "timeCN": "2330", 417 | "onAirSite": [ 418 | "http://bangumi.bilibili.com/anime/282" 419 | ], 420 | "newBgm": true, 421 | "bgmId": 103127, 422 | "showDate": "2014-10-02" 423 | }, 424 | "1410_3": { 425 | "titleCN": "偶像活动!第三年", 426 | "titleJP": "アイカツ!3年目", 427 | "titleEN": "Aikatsu", 428 | "officalSite": "http://www.aikatsu.net/03/index.html", 429 | "weekDayJP": 4, 430 | "weekDayCN": 4, 431 | "timeJP": "1700", 432 | "timeCN": "1900", 433 | "onAirSite": [ 434 | "http://www.iqiyi.com/a_19rrhc0yjx.html" 435 | ], 436 | "newBgm": true, 437 | "bgmId": 139318, 438 | "showDate": "2014-10-02" 439 | }, 440 | "1410_4": { 441 | "titleCN": "高达G之复国运动", 442 | "titleJP": "ガンダム Gのレコンギスタ", 443 | "officalSite": "http://www.g-reco.net/", 444 | "weekDayJP": 5, 445 | "weekDayCN": 5, 446 | "timeJP": "0000", 447 | "timeCN": "0349", 448 | "onAirSite": [ 449 | "http://www.tudou.com/albumcover/iU6KdfiaSxo.html", 450 | "http://www.youku.com/show_page/id_z21e664b6b01011e3a705.html" 451 | ], 452 | "newBgm": true, 453 | "bgmId": 54551, 454 | "showDate": "2014-10-03" 455 | }, 456 | "1410_5": { 457 | "titleCN": "甘城光辉游乐园", 458 | "titleJP": "甘城ブリリアントパーク", 459 | "officalSite": "http://www.tbs.co.jp/anime/amaburi/", 460 | "weekDayJP": 5, 461 | "weekDayCN": 5, 462 | "timeJP": "0116", 463 | "timeCN": "", 464 | "onAirSite": [ 465 | "http://www.le.com/comic/10005260.html", 466 | "http://v.qq.com/detail/w/wt2ko9mlf02fryc.html", 467 | "http://v.pptv.com/page/gKKODHTaSojradE.html", 468 | "http://www.youku.com/show_page/id_z8c74cc8ace7611e3a705.html", 469 | "http://www.tudou.com/albumcover/7CNapiWZqVk.html", 470 | "http://bangumi.bilibili.com/anime/281" 471 | ], 472 | "newBgm": true, 473 | "bgmId": 93545, 474 | "showDate": "2014-10-03" 475 | }, 476 | "1410_6": { 477 | "titleCN": "关于完全听不懂老公在说什么的事", 478 | "titleJP": "旦那が何を言っているかわからない件", 479 | "officalSite": "http://www.dreamcreation.co.jp/danna/", 480 | "weekDayJP": 5, 481 | "weekDayCN": 5, 482 | "timeJP": "0000", 483 | "timeCN": "", 484 | "onAirSite": [ 485 | "http://bangumi.bilibili.com/anime/1530", 486 | "http://www.le.com/comic/10005221.html", 487 | "http://www.youku.com/show_page/id_zd3a9f5563d6d11e4b522.html", 488 | "http://www.tudou.com/albumcover/G4w3mr-huo0.html", 489 | "http://v.qq.com/detail/4/432204o0d8j3rnu.html" 490 | ], 491 | "newBgm": true, 492 | "bgmId": 105426, 493 | "showDate": "2014-10-03" 494 | }, 495 | "1410_7": { 496 | "titleCN": "魔弹之王与战姬", 497 | "titleJP": "魔弾の王と戦姫", 498 | "officalSite": "http://www.madan-anime.jp/", 499 | "weekDayJP": 6, 500 | "weekDayCN": 6, 501 | "timeJP": "1900", 502 | "timeCN": "2230", 503 | "onAirSite": [ 504 | "http://www.iqiyi.com/a_19rrhc0xbh.html", 505 | "http://bangumi.bilibili.com/anime/291", 506 | "http://v.pptv.com/page/srmTEXnfT43wbtY.html", 507 | "http://www.youku.com/show_page/id_z17369f303d6511e4b2ad.html", 508 | "http://www.tudou.com/albumcover/66Gn16iu3K4.html" 509 | ], 510 | "newBgm": true, 511 | "bgmId": 79229, 512 | "showDate": "2014-10-04" 513 | }, 514 | "1410_8": { 515 | "titleCN": "笑对阴天", 516 | "titleJP": "曇天に笑う", 517 | "officalSite": "http://www.dontenniwarau.com/", 518 | "weekDayJP": 6, 519 | "weekDayCN": 6, 520 | "timeJP": "0058", 521 | "timeCN": "0430", 522 | "onAirSite": [ 523 | "http://www.iqiyi.com/a_19rrhc0xl1.html" 524 | ], 525 | "newBgm": true, 526 | "bgmId": 80837, 527 | "showDate": "2014-10-04" 528 | }, 529 | "1410_9": { 530 | "titleCN": "牙狼〈GARO〉-炎之刻印-", 531 | "titleJP": "牙狼〈GARO〉-炎の刻印-", 532 | "officalSite": "http://garo-project.jp/ANIME/", 533 | "weekDayJP": 6, 534 | "weekDayCN": 6, 535 | "timeJP": "0023", 536 | "timeCN": "0130", 537 | "onAirSite": [ 538 | "http://www.iqiyi.com/a_19rrhc0xnt.html", 539 | "http://www.tudou.com/albumcover/gdZUtuYLZdw.html", 540 | "http://bangumi.bilibili.com/anime/3209", 541 | "http://www.youku.com/show_page/id_z7d04ee48fa7b11e3b8b7.html" 542 | ], 543 | "newBgm": true, 544 | "bgmId": 88741, 545 | "showDate": "2014-10-04" 546 | }, 547 | "1410_10": { 548 | "titleCN": "寻找失去的未来", 549 | "titleJP": "失われた未来を求めて", 550 | "officalSite": "http://ushinawareta-mirai.com/", 551 | "weekDayJP": 6, 552 | "weekDayCN": 0, 553 | "timeJP": "1930", 554 | "timeCN": "0130", 555 | "onAirSite": [ 556 | "http://www.iqiyi.com/a_19rrhc108x.html" 557 | ], 558 | "newBgm": true, 559 | "bgmId": 91985, 560 | "showDate": "2014-10-04" 561 | }, 562 | "1410_11": { 563 | "titleCN": "Fate/stay night [Unlimited Blade Works]", 564 | "titleJP": "Fate/stay night [Unlimited Blade Works]", 565 | "officalSite": "http://www.fate-sn.com/ubw/", 566 | "weekDayJP": 6, 567 | "weekDayCN": 0, 568 | "timeJP": "2300", 569 | "timeCN": "0030", 570 | "onAirSite": [ 571 | "http://www.iqiyi.com/a_19rrhc107d.html", 572 | "http://www.tudou.com/albumcover/RsfQldH8q6s.html", 573 | "http://v.qq.com/detail/5/54v59r074ncc1kq.html", 574 | "http://www.youku.com/show_page/id_z46465a1c711f11e38b3f.html", 575 | "http://www.le.com/comic/10005152.html", 576 | "http://bangumi.bilibili.com/anime/1586", 577 | "http://www.acfun.tv/v/ab1464802" 578 | ], 579 | "newBgm": true, 580 | "bgmId": 95225, 581 | "showDate": "2014-10-04" 582 | }, 583 | "1410_12": { 584 | "titleCN": "记录的地平线 2期", 585 | "titleJP": "ログ・ホライズン 第2シリーズ", 586 | "officalSite": "http://www9.nhk.or.jp/anime/loghorizon/", 587 | "weekDayJP": 6, 588 | "weekDayCN": 0, 589 | "timeJP": "1630", 590 | "timeCN": "0100", 591 | "onAirSite": [ 592 | "http://bangumi.bilibili.com/anime/290", 593 | "http://v.pptv.com/page/ibVs1sxuB8SibSEHg.html", 594 | "http://www.iqiyi.com/a_19rrhc10bp.html", 595 | "http://www.youku.com/show_page/id_z78f9354e3d6411e4a080.html", 596 | "http://www.tudou.com/albumcover/v7h-gGVVx6U.html" 597 | ], 598 | "newBgm": true, 599 | "bgmId": 100517, 600 | "showDate": "2014-10-04" 601 | }, 602 | "1410_13": { 603 | "titleCN": "选择感染者 2期", 604 | "titleJP": "selector spread WIXOSS", 605 | "officalSite": "http://selector-wixoss.com/", 606 | "weekDayJP": 6, 607 | "weekDayCN": 6, 608 | "timeJP": "0005", 609 | "timeCN": "0205", 610 | "onAirSite": [ 611 | "http://www.iqiyi.com/a_19rrhc0xpd.html" 612 | ], 613 | "newBgm": true, 614 | "bgmId": 106314, 615 | "showDate": "2014-10-04" 616 | }, 617 | "1410_14": { 618 | "titleCN": "魔术快斗1412", 619 | "titleJP": "まじっく快斗1412", 620 | "officalSite": "http://www.ytv.co.jp/magickaito/", 621 | "weekDayJP": 6, 622 | "weekDayCN": 6, 623 | "timeJP": "1630", 624 | "timeCN": "1900", 625 | "onAirSite": [ 626 | "http://v.qq.com/detail/f/fm95ukbvs36ejzw.html", 627 | "http://www.youku.com/show_page/id_zeebadce421c911e4a705.html", 628 | "http://www.tudou.com/albumcover/2TdJoRW10F8.html", 629 | "http://www.iqiyi.com/a_19rrhc0x81.html", 630 | "http://tv.sohu.com/s2014/gdjd1412/" 631 | ], 632 | "newBgm": true, 633 | "bgmId": 109203, 634 | "showDate": "2014-10-04" 635 | }, 636 | "1410_15": { 637 | "titleCN": "灰色的果实", 638 | "titleJP": "グリザイアの果実", 639 | "officalSite": "http://www.grisaia-anime.com/", 640 | "weekDayJP": 0, 641 | "weekDayCN": 1, 642 | "timeJP": "1930", 643 | "timeCN": "0000", 644 | "onAirSite": [ 645 | "http://www.iqiyi.com/a_19rrhc0zfl.html" 646 | ], 647 | "newBgm": true, 648 | "bgmId": 67376, 649 | "showDate": "2014-10-05" 650 | }, 651 | "1410_16": { 652 | "titleCN": "天体的秩序", 653 | "titleJP": "天体のメソッド", 654 | "officalSite": "http://sora-no-method.jp/", 655 | "weekDayJP": 0, 656 | "weekDayCN": 0, 657 | "timeJP": "2130", 658 | "timeCN": "2230", 659 | "onAirSite": [ 660 | "http://bangumi.bilibili.com/anime/296" 661 | ], 662 | "newBgm": true, 663 | "bgmId": 100040, 664 | "showDate": "2014-10-05" 665 | }, 666 | "1410_17": { 667 | "titleCN": "狼少女与黑王子", 668 | "titleJP": "オオカミ少女と黒王子", 669 | "officalSite": "http://www.ookamishojo-anime.jp/", 670 | "weekDayJP": 0, 671 | "weekDayCN": 0, 672 | "timeJP": "2100", 673 | "timeCN": "2330", 674 | "onAirSite": [ 675 | "http://www.iqiyi.com/a_19rrhc0zph.html" 676 | ], 677 | "newBgm": true, 678 | "bgmId": 101518, 679 | "showDate": "2014-10-05" 680 | }, 681 | "1410_18": { 682 | "titleCN": "七大罪", 683 | "titleJP": "七つの大罪", 684 | "officalSite": "http://www.7-taizai.net/", 685 | "weekDayJP": 0, 686 | "weekDayCN": 0, 687 | "timeJP": "1600", 688 | "timeCN": "2100", 689 | "onAirSite": [ 690 | "http://www.bilibili.com/sp/七大罪" 691 | ], 692 | "newBgm": true, 693 | "bgmId": 101820, 694 | "showDate": "2014-10-05" 695 | }, 696 | "1410_19": { 697 | "titleCN": "境界触发者", 698 | "titleJP": "ワールドトリガー", 699 | "titleEN": "World Trigger", 700 | "officalSite": "http://www.toei-anim.co.jp/tv/wt/", 701 | "weekDayJP": 0, 702 | "weekDayCN": 0, 703 | "timeJP": "0530", 704 | "timeCN": "1100", 705 | "onAirSite": [ 706 | "http://www.iqiyi.com/a_19rrhc0zzx.html", 707 | "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=境界触发者" 708 | ], 709 | "newBgm": true, 710 | "bgmId": 104906, 711 | "showDate": "2014-10-05" 712 | }, 713 | "1410_20": { 714 | "titleCN": "Cross Ange 天使与龙的轮舞", 715 | "titleJP": "クロスアンジュ 天使と竜の輪舞", 716 | "officalSite": "http://crossange.com/", 717 | "weekDayJP": 0, 718 | "weekDayCN": 0, 719 | "timeJP": "0030", 720 | "timeCN": "1700", 721 | "onAirSite": [ 722 | "http://www.iqiyi.com/a_19rrhc0zv1.html", 723 | "http://bangumi.bilibili.com/anime/3048" 724 | ], 725 | "newBgm": true, 726 | "bgmId": 109948, 727 | "showDate": "2014-10-05" 728 | }, 729 | "1410_21": { 730 | "titleCN": "巴哈姆特之怒", 731 | "titleJP": "神撃のバハムート GENESIS", 732 | "officalSite": "http://shingekinobahamut-genesis.jp/", 733 | "weekDayJP": 1, 734 | "weekDayCN": 2, 735 | "timeJP": "2230", 736 | "timeCN": "0200", 737 | "onAirSite": [ 738 | "http://www.iqiyi.com/a_19rrhc0z39.html" 739 | ], 740 | "newBgm": true, 741 | "bgmId": 91986, 742 | "showDate": "2014-10-06" 743 | }, 744 | "1410_22": { 745 | "titleCN": "银仙", 746 | "titleJP": "繰繰れ!コックリさん", 747 | "officalSite": "http://www.gugukoku.com/", 748 | "weekDayJP": 1, 749 | "weekDayCN": 1, 750 | "timeJP": "0005", 751 | "timeCN": "0105", 752 | "onAirSite": [ 753 | "http://www.iqiyi.com/a_19rrhc0zdp.html", 754 | "http://v.pptv.com/page/FTUfnQVr2xl8ibmI.html", 755 | "http://www.youku.com/show_page/id_ze31f4ef6c92211e3a705.html", 756 | "http://www.tudou.com/albumcover/pPuLbZdMqTY.html", 757 | "http://bangumi.bilibili.com/anime/297" 758 | ], 759 | "newBgm": true, 760 | "bgmId": 100227, 761 | "showDate": "2014-10-06" 762 | }, 763 | "1410_23": { 764 | "titleCN": "我家浴缸的二三事", 765 | "titleJP": "オレん家のフロ事情", 766 | "officalSite": "http://www.orefuro.jp/", 767 | "weekDayJP": 1, 768 | "weekDayCN": 1, 769 | "timeJP": "2254", 770 | "timeCN": "2301", 771 | "onAirSite": [ 772 | "http://bangumi.bilibili.com/anime/311", 773 | "http://www.iqiyi.com/a_19rrhc0z1p.html", 774 | "http://v.qq.com/detail/v/vkvksohhix5upx7.html", 775 | "http://www.youku.com/show_page/id_z49e9085a3d6a11e4b522.html", 776 | "http://www.tudou.com/albumcover/Nb_J8BL62Pc.html" 777 | ], 778 | "newBgm": true, 779 | "bgmId": 104138, 780 | "showDate": "2014-10-06" 781 | }, 782 | "1410_24": { 783 | "titleCN": "爱・天地无用", 784 | "titleJP": "愛・天地無用!", 785 | "officalSite": "http://www.ai-tenchi.jp/", 786 | "weekDayJP": 1, 787 | "weekDayCN": 2, 788 | "timeJP": "2055", 789 | "timeCN": "", 790 | "onAirSite": [ 791 | "http://v.pptv.com/page/Jf7aWMAmltQ3tR0.html", 792 | "http://www.youku.com/show_page/id_zcb776f203d6911e4b432.html", 793 | "http://www.tudou.com/albumcover/CYo3K-hgmOs.html", 794 | "http://v.qq.com/detail/1/1b4rfk13s84xu48.html", 795 | "http://bangumi.bilibili.com/anime/1617" 796 | ], 797 | "newBgm": true, 798 | "bgmId": 104878, 799 | "showDate": "2014-10-06" 800 | }, 801 | "1410_25": { 802 | "titleCN": "怪盗Joker", 803 | "titleJP": "怪盗ジョーカー", 804 | "officalSite": "http://s.mxtv.jp/joker/", 805 | "weekDayJP": 1, 806 | "weekDayCN": 1, 807 | "timeJP": "1800", 808 | "timeCN": "1830", 809 | "onAirSite": [ 810 | "http://bangumi.bilibili.com/anime/1569", 811 | "http://www.iqiyi.com/a_19rrhc0zch.html", 812 | "http://www.youku.com/show_page/id_z3da69dee21c911e4a705.html", 813 | "http://www.acfun.tv/a/aa1464855" 814 | ], 815 | "newBgm": true, 816 | "bgmId": 107186, 817 | "showDate": "2014-10-06" 818 | }, 819 | "1410_26": { 820 | "titleCN": "日常系的异能战斗", 821 | "titleJP": "異能バトルは日常系のなかで", 822 | "officalSite": "http://inou-anime.com/", 823 | "weekDayJP": 2, 824 | "weekDayCN": 2, 825 | "timeJP": "0105", 826 | "timeCN": "0205", 827 | "onAirSite": [ 828 | "http://www.tudou.com/albumcover/G_nSPK6V5b0.html", 829 | "http://www.youku.com/show_page/id_z358dbc7007e611e4a705.html", 830 | "http://www.iqiyi.com/a_19rrhc0yyx.html", 831 | "http://v.pptv.com/page/ZL6aGIDmVpT3dd0.html", 832 | "http://www.le.com/comic/10005151.html", 833 | "http://bangumi.bilibili.com/anime/313", 834 | "http://www.acfun.tv/a/aa1464815" 835 | ], 836 | "newBgm": true, 837 | "bgmId": 99538, 838 | "showDate": "2014-10-07" 839 | }, 840 | "1410_27": { 841 | "titleCN": "飙速宅男 2期", 842 | "titleJP": "弱虫ペダル GRANDE ROAD", 843 | "officalSite": "http://yowapeda.com/", 844 | "weekDayJP": 2, 845 | "weekDayCN": 2, 846 | "timeJP": "0035", 847 | "timeCN": "0135", 848 | "onAirSite": [ 849 | "http://www.tudou.com/albumcover/0-8oH78hMeI.html", 850 | "http://www.youku.com/show_page/id_za2826926df3611e3b8b7.html" 851 | ], 852 | "newBgm": true, 853 | "bgmId": 104468, 854 | "showDate": "2014-10-07" 855 | }, 856 | "1410_28": { 857 | "titleCN": "晨曦公主", 858 | "titleJP": "暁のヨナ", 859 | "officalSite": "http://www.marv.jp/special/yona/", 860 | "weekDayJP": 2, 861 | "weekDayCN": 2, 862 | "timeJP": "2200", 863 | "timeCN": "2300", 864 | "onAirSite": [ 865 | "http://www.tudou.com/albumcover/3sgyRBy1t1M.html", 866 | "http://www.youku.com/show_page/id_zd6c247ae3d6b11e4a080.html", 867 | "http://www.iqiyi.com/a_19rrhc0ytd.html", 868 | "http://v.pptv.com/page/e923NZ0Dc7EUkvo.html", 869 | "http://www.acfun.tv/v/ab1464837" 870 | ], 871 | "newBgm": true, 872 | "bgmId": 107474, 873 | "showDate": "2014-10-07" 874 | }, 875 | "1410_29": { 876 | "titleCN": "大图书馆的牧羊人", 877 | "titleJP": "大図書館の羊飼い", 878 | "officalSite": "http://www.daito-anime.com/", 879 | "weekDayJP": 3, 880 | "weekDayCN": 4, 881 | "timeJP": "2330", 882 | "timeCN": "0030", 883 | "onAirSite": [ 884 | "http://bangumi.bilibili.com/anime/323", 885 | "http://www.tudou.com/albumcover/tQz-M8MDLYc.html", 886 | "http://www.youku.com/show_page/id_z8ea489d03d8611e4a080.html", 887 | "http://v.qq.com/detail/w/w9galx5d4dm0udo.html", 888 | "http://www.iqiyi.com/a_19rrhbzby1.html" 889 | ], 890 | "newBgm": true, 891 | "bgmId": 67373, 892 | "showDate": "2014-10-08" 893 | }, 894 | "1410_30": { 895 | "titleCN": "七人魔法使", 896 | "titleJP": "トリニティセブン", 897 | "officalSite": "http://trinity-7.com/", 898 | "weekDayJP": 3, 899 | "weekDayCN": 3, 900 | "timeJP": "0040", 901 | "timeCN": "0140", 902 | "onAirSite": [ 903 | "http://bangumi.bilibili.com/anime/317", 904 | "http://www.tudou.com/albumcover/8kRmJfnSOqg.html", 905 | "http://www.youku.com/show_page/id_zdb2ab4f4066e11e4a705.html", 906 | "http://www.iqiyi.com/a_19rrhc0yyl.html", 907 | "http://v.pptv.com/page/wl46uCCG9jSXFX0.html" 908 | ], 909 | "newBgm": true, 910 | "bgmId": 96977, 911 | "showDate": "2014-10-08" 912 | }, 913 | "1410_31": { 914 | "titleCN": "Hi★sCoool! 世嘉硬件女孩", 915 | "titleJP": "Hi★sCoool! セハガール", 916 | "officalSite": "http://shg.sega.jp/anime.html", 917 | "weekDayJP": 3, 918 | "weekDayCN": 3, 919 | "timeJP": "2100", 920 | "timeCN": "2200", 921 | "onAirSite": [ 922 | "http://bangumi.bilibili.com/anime/321/" 923 | ], 924 | "newBgm": true, 925 | "bgmId": 101784, 926 | "showDate": "2014-10-08" 927 | }, 928 | "1410_32": { 929 | "titleCN": "高达创战者 Try", 930 | "titleJP": "ガンダムビルドファイターズ トライ", 931 | "officalSite": "http://gundam-bf.net/", 932 | "weekDayJP": 3, 933 | "weekDayCN": 3, 934 | "timeJP": "1700", 935 | "timeCN": "", 936 | "onAirSite": [], 937 | "newBgm": true, 938 | "bgmId": 105875, 939 | "showDate": "2014-10-08" 940 | }, 941 | "1410_33": { 942 | "titleCN": "PSYCHO-PASS 2期", 943 | "titleJP": "PSYCHO-PASS サイコパス 2", 944 | "officalSite": "http://www.psycho-pass.com/", 945 | "weekDayJP": 4, 946 | "weekDayCN": 5, 947 | "timeJP": "2350", 948 | "timeCN": "0030", 949 | "onAirSite": [], 950 | "newBgm": true, 951 | "bgmId": 77625, 952 | "showDate": "2014-10-09" 953 | }, 954 | "1410_34": { 955 | "titleCN": "寄生兽 生命的准则", 956 | "titleJP": "寄生獣 セイの格率", 957 | "officalSite": "http://www.kiseiju.jp/", 958 | "weekDayJP": 4, 959 | "weekDayCN": 4, 960 | "timeJP": "0029", 961 | "timeCN": "0330", 962 | "onAirSite": [], 963 | "newBgm": true, 964 | "bgmId": 88433, 965 | "showDate": "2014-10-09" 966 | }, 967 | "1410_35": { 968 | "titleCN": "棺姬嘉依卡 2期", 969 | "titleJP": "棺姫のチャイカ AVENGING BATTLE", 970 | "officalSite": "http://chaika-anime.jp/", 971 | "weekDayJP": 4, 972 | "weekDayCN": 4, 973 | "timeJP": "0005", 974 | "timeCN": "0135", 975 | "onAirSite": [ 976 | "http://v.qq.com/detail/c/crrtngniol48xnn.html", 977 | "http://bangumi.bilibili.com/anime/188" 978 | ], 979 | "newBgm": true, 980 | "bgmId": 104219, 981 | "showDate": "2014-10-09" 982 | }, 983 | "1410_36": { 984 | "titleCN": "白箱", 985 | "titleJP": "SHIROBAKO", 986 | "officalSite": "http://www.shirobako-anime.com/", 987 | "weekDayJP": 4, 988 | "weekDayCN": 4, 989 | "timeJP": "2230", 990 | "timeCN": "2330", 991 | "onAirSite": [ 992 | "http://www.iqiyi.com/a_19rrhbzeox.html", 993 | "http://www.acfun.tv/v/ab1464814" 994 | ], 995 | "newBgm": true, 996 | "bgmId": 110467, 997 | "showDate": "2014-10-09" 998 | }, 999 | "1410_37": { 1000 | "titleCN": "老子要成为双马尾", 1001 | "titleJP": "俺、ツインテールになります。", 1002 | "officalSite": "http://www.tbs.co.jp/anime/ore_twi/", 1003 | "weekDayJP": 5, 1004 | "weekDayCN": 5, 1005 | "timeJP": "0046", 1006 | "timeCN": "0246", 1007 | "onAirSite": [ 1008 | "http://www.le.com/comic/10005167.html", 1009 | "http://www.iqiyi.com/a_19rrhbzehh.html", 1010 | "http://bangumi.bilibili.com/anime/324" 1011 | ], 1012 | "newBgm": true, 1013 | "bgmId": 92429, 1014 | "showDate": "2014-10-10" 1015 | }, 1016 | "1410_38": { 1017 | "titleCN": "四月是你的谎言", 1018 | "titleJP": "四月は君の嘘", 1019 | "officalSite": "http://www.kimiuso.jp/", 1020 | "weekDayJP": 5, 1021 | "weekDayCN": 5, 1022 | "timeJP": "0020", 1023 | "timeCN": "0150", 1024 | "onAirSite": [ 1025 | "http://www.tudou.com/albumcover/vVolwaPqgHI.html", 1026 | "http://www.youku.com/show_page/id_z75eea0d2b24a11e38b3f.html", 1027 | "http://bangumi.bilibili.com/anime/1699", 1028 | "http://www.iqiyi.com/a_19rrhbzeu5.html", 1029 | "http://www.acfun.tv/v/ab1464808" 1030 | ], 1031 | "newBgm": true, 1032 | "bgmId": 100444, 1033 | "showDate": "2014-10-10" 1034 | }, 1035 | "1410_39": { 1036 | "titleCN": "BONJOUR♪恋味甜点坊", 1037 | "titleJP": "Bonjour♪恋味パティスリー", 1038 | "officalSite": "http://www.bonkoi.com/", 1039 | "weekDayJP": 5, 1040 | "weekDayCN": 6, 1041 | "timeJP": "2100", 1042 | "timeCN": "", 1043 | "onAirSite": [ 1044 | "http://www.iqiyi.com/a_19rrhbz0ah.html", 1045 | "http://bangumi.bilibili.com/anime/3070/" 1046 | ], 1047 | "newBgm": true, 1048 | "bgmId": 110485, 1049 | "showDate": "2014-10-10" 1050 | }, 1051 | "1410_40": { 1052 | "titleCN": "山贼女孩罗尼雅", 1053 | "titleJP": "山賊の娘ローニャ", 1054 | "officalSite": "http://www9.nhk.or.jp/anime/ronja/", 1055 | "weekDayJP": 6, 1056 | "weekDayCN": 6, 1057 | "timeJP": "1800", 1058 | "timeCN": "2148", 1059 | "onAirSite": [ 1060 | "http://bangumi.bilibili.com/anime/328" 1061 | ], 1062 | "newBgm": true, 1063 | "bgmId": 96113, 1064 | "showDate": "2014-10-11" 1065 | }, 1066 | "1410_41": { 1067 | "titleCN": "女朋友(仮)", 1068 | "titleJP": "ガールフレンド(仮)", 1069 | "officalSite": "http://girlfriend-kari-anime.jp/", 1070 | "weekDayJP": 1, 1071 | "weekDayCN": 1, 1072 | "timeJP": "0035", 1073 | "timeCN": "0135", 1074 | "onAirSite": [ 1075 | "http://www.tudou.com/albumcover/fPpEVMRCTFc.html", 1076 | "http://www.youku.com/show_page/id_z5d9421503e5011e4b2ad.html", 1077 | "http://bangumi.bilibili.com/anime/301", 1078 | "http://www.le.com/comic/10005271.html", 1079 | "http://www.iqiyi.com/a_19rrhbz5w5.html", 1080 | "http://v.pptv.com/page/j6mDAWnPP33gXsY.html", 1081 | "http://www.acfun.tv/a/aa1464823" 1082 | ], 1083 | "newBgm": true, 1084 | "bgmId": 106879, 1085 | "showDate": "2014-10-13" 1086 | }, 1087 | "1410_42": { 1088 | "titleCN": "结城友奈是勇者", 1089 | "titleJP": "結城友奈は勇者である", 1090 | "officalSite": "http://yuyuyu.tv/", 1091 | "weekDayJP": 5, 1092 | "weekDayCN": 5, 1093 | "timeJP": "0119", 1094 | "timeCN": "0350", 1095 | "onAirSite": [ 1096 | "http://www.iqiyi.com/a_19rrhbyz99.html" 1097 | ], 1098 | "newBgm": true, 1099 | "bgmId": 109328, 1100 | "showDate": "2014-10-17" 1101 | }, 1102 | "1410_43": { 1103 | "titleCN": "虫师 续章 2期", 1104 | "titleJP": "蟲師 続章 第2期", 1105 | "officalSite": "http://www.mushishi-anime.com/", 1106 | "weekDayJP": 6, 1107 | "weekDayCN": 0, 1108 | "timeJP": "2330", 1109 | "timeCN": "0400", 1110 | "onAirSite": [ 1111 | "http://tv.sohu.com/s2014/csxz/", 1112 | "http://bangumi.bilibili.com/anime/1715" 1113 | ], 1114 | "newBgm": true, 1115 | "bgmId": 106207, 1116 | "showDate": "2014-10-18" 1117 | }, 1118 | "1410_44": { 1119 | "titleCN": "凭物语", 1120 | "titleJP": "憑物語", 1121 | "officalSite": "http://www.monogatari-series.com/tsukimonogatari/", 1122 | "weekDayJP": 3, 1123 | "weekDayCN": 4, 1124 | "timeJP": "2100", 1125 | "timeCN": "0900", 1126 | "onAirSite": [ 1127 | "http://tv.sohu.com/s2014/dhppwy/" 1128 | ], 1129 | "newBgm": true, 1130 | "comment": "全四话连续播放", 1131 | "bgmId": 115932, 1132 | "showDate": "2014-12-31" 1133 | } 1134 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bangumi-list", 3 | "version": "2.1.3", 4 | "homepage": "http://bgmlist.com/", 5 | "description": "A broadcast list for Japanese Donga.", 6 | "private": true, 7 | "bugs": { 8 | "url": "https://github.com/wxt2005/bangumi-list/issues", 9 | "email": "wxt2005@gmail.com" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/wxt2005/bangumi-list.git" 14 | }, 15 | "keywords": [ 16 | "donga", 17 | "anime" 18 | ], 19 | "scripts": { 20 | "start": "npm run serve | npm run dev", 21 | "deploy": "NODE_ENV=production webpack -p && npm run clean:dist && npm run rename:build && npm run copy:favicon", 22 | "copy:favicon": "cp -r favicons dist", 23 | "serve": "http-server -p 8080", 24 | "clean:dist": "rm -rf dist", 25 | "rename:build": "mv build/ dist/", 26 | "dev": "webpack-dev-server --progress --colors --hot --port 8090 --host 0.0.0.0" 27 | }, 28 | "main": "./src/js/main.js", 29 | "author": "wxt2005@gmail.com", 30 | "license": "MIT", 31 | "devDependencies": { 32 | "babel-core": "^5.8.25", 33 | "babel-loader": "^5.4.2", 34 | "css-loader": "^0.15.1", 35 | "extract-text-webpack-plugin": "^0.8.2", 36 | "file-loader": "^0.8.4", 37 | "html-webpack-plugin": "^1.5.2", 38 | "http-server": "^0.12.3", 39 | "jsx-loader": "^0.13.2", 40 | "less": "^2.7.3", 41 | "less-loader": "^2.2.0", 42 | "node-libs-browser": "^0.5.2", 43 | "react-hot-loader": "^1.3.1", 44 | "style-loader": "^0.12.3", 45 | "url-loader": "^0.5.9", 46 | "webpack": "^1.15.0", 47 | "webpack-dev-server": "^1.16.5" 48 | }, 49 | "dependencies": { 50 | "flux": "^2.0.3", 51 | "lodash": "^4.8.2", 52 | "qwest": "^1.7.0", 53 | "react": "^0.13.3" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/js/_config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | archiveUrl: 'json/archive.json' 3 | }; 4 | -------------------------------------------------------------------------------- /src/js/action/Actions.js: -------------------------------------------------------------------------------- 1 | var Dispatcher = require('../dispatcher/Dispatcher'); 2 | 3 | var Actions = { 4 | updateConfig: function(newConfig){ 5 | Dispatcher.dispatch({ 6 | actionType: 'CONFIG_UPDATE', 7 | newConfig: newConfig 8 | }); 9 | }, 10 | resetConfig: function(){ 11 | Dispatcher.dispatch({ 12 | actionType: 'CONFIG_RESET' 13 | }); 14 | }, 15 | saveConfig: function(){ 16 | Dispatcher.dispatch({ 17 | actionType: 'CONFIG_SAVE' 18 | }); 19 | }, 20 | toggleAllSites: function(toggleFlag){ 21 | Dispatcher.dispatch({ 22 | actionType: 'SITES_TOGGLE_ALL', 23 | toggleFlag: toggleFlag 24 | }); 25 | }, 26 | toggleSite: function(domain, toggleFlag){ 27 | Dispatcher.dispatch({ 28 | actionType: 'TOGGLE_SITE', 29 | toggleFlag: toggleFlag, 30 | domain: domain 31 | }); 32 | }, 33 | resetSites: function(){ 34 | Dispatcher.dispatch({ 35 | actionType: 'SITES_RESET' 36 | }); 37 | }, 38 | saveSites: function(){ 39 | Dispatcher.dispatch({ 40 | actionType: 'SITES_SAVE' 41 | }); 42 | }, 43 | importSites: function (sites) { 44 | Dispatcher.dispatch({ 45 | actionType: 'SITES_IMPORT', 46 | sites: sites 47 | }); 48 | }, 49 | toggleItem: function(id, toggleFlag){ 50 | Dispatcher.dispatch({ 51 | actionType: 'TOGGLE_ITEM', 52 | toggleFlag: toggleFlag, 53 | id: id 54 | }); 55 | }, 56 | highlightItem: function(id, toggleFlag){ 57 | Dispatcher.dispatch({ 58 | actionType: 'HIGHLIGHT_ITEM', 59 | toggleFlag: toggleFlag, 60 | id: id 61 | }); 62 | }, 63 | resetData: function(){ 64 | Dispatcher.dispatch({ 65 | actionType: 'DATA_RESET' 66 | }); 67 | }, 68 | saveData: function(data){ 69 | Dispatcher.dispatch({ 70 | actionType: 'DATA_SAVE', 71 | data: data 72 | }); 73 | }, 74 | importData: function(data){ 75 | Dispatcher.dispatch({ 76 | actionType: 'DATA_IMPORT', 77 | data: data 78 | }); 79 | }, 80 | toggleAllItems: function(toggleFlag){ 81 | Dispatcher.dispatch({ 82 | actionType: 'DATA_TOGGLE_ALL', 83 | toggleFlag: toggleFlag 84 | }); 85 | }, 86 | showDialog: function(type, content, buttons){ 87 | Dispatcher.dispatch({ 88 | actionType: 'SHOW_DIALOG', 89 | option: { 90 | type: type, 91 | content: content, 92 | buttons: buttons || '' 93 | } 94 | }); 95 | } 96 | }; 97 | 98 | module.exports = Actions; 99 | -------------------------------------------------------------------------------- /src/js/component/BgmApp.js: -------------------------------------------------------------------------------- 1 | var _isEmpty = require('lodash/isEmpty'), 2 | _forIn = require('lodash/forIn'), 3 | _size = require('lodash/size'), 4 | React = require('react'), 5 | qwest = require('qwest'), 6 | Actions = require('../action/Actions'), 7 | configStore = require('../store/BgmConfigStore'), 8 | dataStore = require('../store/BgmDataStore'), 9 | BgmTable = require('./BgmTable'), 10 | BgmTop = require('./BgmTop'); 11 | 12 | var now = new Date(); 13 | 14 | var BgmApp = React.createClass({ 15 | getInitialState: function(){ 16 | var config = configStore.getConfig(); 17 | 18 | return { 19 | data: dataStore.getData(), 20 | tab: config.noAutoSwitch ? 7 : now.getDay(), 21 | isHistory: false, 22 | config: config, 23 | queryText: '' 24 | }; 25 | }, 26 | componentWillReceiveProps: function(nextProps){ 27 | var request; 28 | if(!this.initUrl && nextProps.currentArchive.path){ 29 | this.initUrl = nextProps.currentArchive.path; 30 | } 31 | 32 | if(_isEmpty(this.state.data) || 33 | this.state.data.path !== nextProps.currentArchive.path || 34 | typeof this.state.data.version === 'undefined' || 35 | nextProps.currentArchive.version === 0 || 36 | this.state.data.version !== nextProps.currentArchive.version || 37 | nextProps.currentArchive.path !== this.initUrl 38 | ){ 39 | qwest.get(nextProps.currentArchive.path) 40 | .then(function(response){ 41 | var data = {}, 42 | state = {}; 43 | data.path = nextProps.currentArchive.path; 44 | data.version = nextProps.currentArchive.version; 45 | data.items = _forIn(response, function(item, id){ 46 | item.id = id; 47 | }); 48 | 49 | if(this.initUrl === nextProps.currentArchive.path){ 50 | state.tab = this.state.config.noAutoSwitch ? 7 : now.getDay(); 51 | Actions.saveData(data); 52 | state.data = dataStore.getData(); 53 | state.isHistory = false; 54 | }else{ 55 | state.tab = 7; 56 | state.data = data; 57 | state.isHistory = true; 58 | } 59 | 60 | this.setState(state); 61 | }.bind(this)); 62 | } 63 | }, 64 | componentDidMount: function(){ 65 | configStore.addChangeListener(this.onConfigChange); 66 | dataStore.addChangeListener(this.onDataChange); 67 | }, 68 | componentWillUnmount: function(){ 69 | configStore.clearChangeListener(); 70 | dataStore.clearChangeListener(); 71 | }, 72 | onDataChange: function(){ 73 | this.setState({ 74 | data: dataStore.getData() 75 | }); 76 | }, 77 | onConfigChange: function(){ 78 | var config = configStore.getConfig(), 79 | state = {config: config}; 80 | 81 | if(config.noAutoSwitch){ 82 | state.tab = 7; 83 | } 84 | 85 | this.setState(state); 86 | }, 87 | handleTabChange: function(tab){ 88 | this.setState({ 89 | tab: +tab 90 | }); 91 | }, 92 | handleSearch: function(query){ 93 | this.setState({ 94 | queryText: query 95 | }); 96 | }, 97 | render: function(){ 98 | return ( 99 |
100 | 106 | 113 |
114 | ); 115 | } 116 | }); 117 | 118 | module.exports = BgmApp; 119 | -------------------------------------------------------------------------------- /src/js/component/BgmHeader.js: -------------------------------------------------------------------------------- 1 | var _map = require('lodash/map'), 2 | React = require('react'); 3 | 4 | var BgmHeader = React.createClass({ 5 | propTypes: { 6 | archiveData: React.PropTypes.object, 7 | handleItemClick: React.PropTypes.func 8 | }, 9 | render: function(){ 10 | return ( 11 |
12 |
13 |

番组放送

14 | 25 |
    26 |
  • 27 | Twitter 28 |
  • 29 |
  • 30 | Weibo 31 |
  • 32 |
  • 33 | 分享本站 34 |
  • 35 |
36 |
37 |
38 | ); 39 | } 40 | }); 41 | 42 | var ArchiveSelector = React.createClass({ 43 | propTypes: { 44 | items: React.PropTypes.object.isRequired, 45 | handleItemClick: React.PropTypes.func 46 | }, 47 | getInitialState: function(){ 48 | return {mainShow: false, subShow: false}; 49 | }, 50 | componentDidMount: function(){ 51 | document.addEventListener("click", this.hideAll); 52 | }, 53 | componentWillUnmount: function(){ 54 | document.removeEventListener("click", this.hideAll); 55 | }, 56 | _handleMainClick: function(e){ 57 | e.preventDefault(); 58 | e.nativeEvent.stopImmediatePropagation(); 59 | this.setState({mainShow: !this.state.mainShow}); 60 | }, 61 | _handleSubClick: function(e){ 62 | var subid = +e.target.getAttribute('data-subid'); 63 | e.preventDefault(); 64 | e.nativeEvent.stopImmediatePropagation(); 65 | this.setState({subShow: subid}); 66 | }, 67 | _handleItemClick: function(e){ 68 | e.preventDefault(); 69 | this.props.handleItemClick(e.target.getAttribute('data-year'), e.target.getAttribute('data-month')); 70 | // console.log(e.target.getAttribute('href')); 71 | }, 72 | hideAll: function(e){ 73 | this.setState({mainShow: false, subShow: false}); 74 | }, 75 | render: function(){ 76 | var _self = this, 77 | dropItems = _map(this.props.items, function(months, year){ 78 | var monthItems = _map(months, function(path, month){ 79 | return ( 80 |
  • 81 | 87 | {month + '月'} 88 | 89 |
  • 90 | ); 91 | }); 92 | 93 | return ( 94 |
  • 95 | {year + '年'} 96 | 99 |
  • 100 | ); 101 | }); 102 | 103 | return ( 104 |
  • 105 | 历史数据 106 |
    107 |
      108 | {dropItems} 109 |
    110 |
    111 |
  • 112 | ); 113 | } 114 | }); 115 | 116 | module.exports = BgmHeader; 117 | -------------------------------------------------------------------------------- /src/js/component/BgmItemMain.js: -------------------------------------------------------------------------------- 1 | var React = require('react'), 2 | Utils = require('../mod/Utils'), 3 | configStore = require('../store/BgmConfigStore'), 4 | ItemSites = require('./ItemSites'); 5 | 6 | var BgmItemMain = React.createClass({ 7 | propTypes: { 8 | handleExpandClick: React.PropTypes.func.isRequired, 9 | data: React.PropTypes.object.isRequired, 10 | config: React.PropTypes.object, 11 | supportSites: React.PropTypes.object 12 | }, 13 | render: function(){ 14 | var data = this.props.data; 15 | 16 | return ( 17 |
    21 | 26 | 31 | 36 | 41 |
    42 | ); 43 | } 44 | }); 45 | 46 | var ItemTitle = React.createClass({ 47 | propTypes: { 48 | titleJP: React.PropTypes.string, 49 | titleCN: React.PropTypes.string, 50 | jpTitle: React.PropTypes.bool 51 | }, 52 | render: function(){ 53 | if(this.props.jpTitle){ 54 | return ( 55 |
    56 | 57 | {this.props.titleJP} 58 | 59 |
    60 | ); 61 | }else{ 62 | return ( 63 |
    64 | 65 | {this.props.titleCN} 66 | 67 |
    68 | ); 69 | } 70 | } 71 | }); 72 | 73 | var ItemTimeDate = React.createClass({ 74 | propTypes: { 75 | weekDay: React.PropTypes.number.isRequired, 76 | time: React.PropTypes.string, 77 | flag: React.PropTypes.string 78 | }, 79 | render: function(){ 80 | var className = 'time-' + this.props.flag, 81 | flagCN = this.props.flag === 'jp' ? '日本' : '大陆', 82 | formatedTime = Utils.formatTime(this.props.time), 83 | formatedWeekDay = Utils.formatWeekDay(this.props.weekDay); 84 | 85 | return ( 86 |
    87 | {flagCN}: 88 | {formatedWeekDay}  {formatedTime} 89 |
    90 | ); 91 | } 92 | }); 93 | 94 | module.exports = BgmItemMain; -------------------------------------------------------------------------------- /src/js/component/BgmItemSub.js: -------------------------------------------------------------------------------- 1 | var _map = require('lodash/map'), 2 | _isArray = require('lodash/isArray'), 3 | _each = require('lodash/each'), 4 | React = require('react'), 5 | configStore = require('../store/BgmConfigStore'); 6 | 7 | var BgmItemSub = React.createClass({ 8 | propTypes: { 9 | data: React.PropTypes.object.isRequired, 10 | disableNewTab: React.PropTypes.bool, 11 | handleHideChange: React.PropTypes.func, 12 | handleHighlightChange: React.PropTypes.func, 13 | hide: React.PropTypes.bool, 14 | highlight: React.PropTypes.bool, 15 | isHistory: React.PropTypes.bool, 16 | bangumiDomain: React.PropTypes.string 17 | }, 18 | getInitialState: function(){ 19 | return { 20 | hideCheck: this.props.data.hide, 21 | highlightCheck: this.props.data.highlight 22 | }; 23 | }, 24 | handleHideClick: function(e){ 25 | this.setState({ 26 | hideCheck: e.target.checked 27 | }); 28 | this.props.handleHideChange(e.target.checked); 29 | }, 30 | handleHighlightClick: function(e){ 31 | this.setState({ 32 | highlightCheck: e.target.checked 33 | }); 34 | this.props.handleHighlightChange(e.target.checked); 35 | }, 36 | getDownloadSites: function(data){ 37 | var downloadSites = { 38 | 'dmhy': { 39 | name: '花园', 40 | prefix: 'https://share.dmhy.org/topics/list?keyword=', 41 | default: 'CN' 42 | } 43 | }; 44 | 45 | return _map(downloadSites, function(conf, domain){ 46 | var keyword = ''; 47 | 48 | // 如果在数据中有覆盖选项,则直接使用 49 | if(data.downloadKeyword && data.downloadKeyword[domain]){ 50 | keyword = data.downloadKeyword[domain]; 51 | }else{ 52 | if(typeof conf.default === 'string' && conf.default){ 53 | // 如果为字符串,则直接获取 54 | keyword = data['title' + conf.default]; 55 | }else if(_isArray(conf.default)){ 56 | // 如为数组,则依优先级获取 57 | _each(conf.default, function(value, i){ 58 | if(data['title' + value]){ 59 | keyword = data['title' + value]; 60 | return false; 61 | } 62 | }); 63 | } 64 | 65 | // 如果仍然没有值,则取中文标题 66 | if(!keyword){ 67 | keyword = data.titleCN; 68 | } 69 | } 70 | 71 | return ( 72 | 77 | {conf.name} 78 | 79 | ); 80 | }.bind(this)); 81 | }, 82 | render: function(){ 83 | var data = this.props.data, 84 | bangumiDomain = this.props.bangumiDomain, 85 | comment = data.comment ? 86 | ( 87 |

    88 | 备注: 89 | {data.comment} 90 |

    91 | ) :

    , 92 | downloadSites = this.getDownloadSites(data); 93 | 94 | var processedBangumiDomain = `https://${bangumiDomain || 'bangumi.tv'}`; 95 | var bangumi = data.bgmId ? 96 | Bangumi页面 : ''; 97 | 98 | return ( 99 |
    100 |
    101 |

    102 | 链接: 103 | 107 | 官方网站 108 | 109 | {bangumi} 110 |

    111 |

    112 | 下载: 113 | {downloadSites} 114 |

    115 |
    116 |
    117 |

    118 | 放送日期: 119 | {data.showDate} 120 |

    121 | {comment} 122 |
    123 |
    124 |

    125 | 131 | 132 |

    133 |

    134 | 140 | 141 |

    142 |
    143 |
    144 | ); 145 | } 146 | }); 147 | 148 | module.exports = BgmItemSub; 149 | -------------------------------------------------------------------------------- /src/js/component/BgmList.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'), 2 | React = require('react'), 3 | Utils = require('../mod/Utils'), 4 | Actions = require('../action/Actions'), 5 | BgmItemMain = require('./BgmItemMain'), 6 | BgmItemSub = require('./BgmItemSub'), 7 | Mixins = require('./Mixins'), 8 | configStore = require('../store/BgmConfigStore'), 9 | sitesStore = require('../store/BgmSitesStore'), 10 | getPinyin = require('../mod/getPinyin'); 11 | 12 | var BgmList = React.createClass({ 13 | mixins: [ 14 | Mixins.configMixin, 15 | Mixins.sitesMixin 16 | ], 17 | propTypes: { 18 | items: React.PropTypes.object, 19 | keyword: React.PropTypes.string, 20 | isHistory: React.PropTypes.bool, 21 | tab: React.PropTypes.number 22 | }, 23 | getInitialState: function(){ 24 | return { 25 | config: configStore.getConfig(), 26 | supportSites: sitesStore.getSites() 27 | }; 28 | }, 29 | _thirtyHours: function(item){ 30 | if(this.state.config.dayDivide <= 24) return item; 31 | // 相当于前一天的几时 32 | var asPrevDayCN = (+item.timeCN) + 2400; 33 | // 如果这样算没跨过分日线则修正为前一天的日期时间 34 | var fixCN = (item.timeCN && asPrevDayCN < this.state.config.dayDivide * 100)?{ 35 | weekDayCN: (item.weekDayCN === 0) ? 6 : (item.weekDayCN - 1), 36 | timeCN: asPrevDayCN.toString() 37 | }:{}; 38 | // 同上对 *JP 操作 39 | var asPrevDayJP = (+item.timeJP) + 2400; 40 | var fixJP = (item.timeJP && asPrevDayJP < this.state.config.dayDivide * 100)?{ 41 | weekDayJP: (item.weekDayJP === 0) ? 6 : (item.weekDayJP - 1), 42 | timeJP: asPrevDayJP.toString() 43 | }:{}; 44 | // 并入法修正 45 | return _.assign({}, item, fixCN, fixJP); 46 | }, 47 | _decideShow: function(item){ 48 | var useCNTime = item.timeCN || item.weekDayCN !== item.weekDayJP; 49 | var showHour = +(useCNTime ? item.timeCN : item.timeJP).slice(0, 2); 50 | 51 | // 有搜索词且匹配中日文,直接显示 52 | if(this.props.keyword){ 53 | if (this.props.keyword.match(/^[a-zA-Z]+$/)) { 54 | return getPinyin(item.titleJP + item.titleCN).toLowerCase().indexOf(this.props.keyword.toLowerCase()) !== -1; 55 | } 56 | return (item.titleJP + item.titleCN).toLowerCase().indexOf(this.props.keyword.toLowerCase()) !== -1; 57 | } 58 | 59 | // 非历史模式,有结束日期并且已经结束一周,则不显示 60 | if(!this.props.isHistory && typeof item.endDate !== 'undefined' && 61 | Utils.hasEnded(item.endDate, item.timeJP, 7)){ 62 | return false; 63 | } 64 | 65 | // 非历史模式,设定只显示关注项目则隐藏其他所以项目 66 | if(!this.props.isHistory && this.state.config.highlightOnly && !item.highlight){ 67 | return false; 68 | } 69 | 70 | 71 | // 如为全部tab,显示 72 | if(this.props.tab === 7){ 73 | return true; 74 | // 被设置为隐藏 75 | }else if(item.hide){ 76 | return false; 77 | // 只显示新番设置下不显示旧番 78 | }else if(this.state.config.newOnly && !item.newBgm){ 79 | return false; 80 | } 81 | 82 | // 选中周天 83 | if(item.weekDayCN === this.props.tab){ 84 | // 日期分割之后的不显示 85 | if(showHour >= this.state.config.dayDivide){ 86 | return false; 87 | // 其余显示 88 | }else{ 89 | return true; 90 | } 91 | } 92 | 93 | // 选中的前一天 94 | if(this.props.tab - item.weekDayCN === 1 || this.props.tab - item.weekDayCN === -6){ 95 | // 日期分割之前的不显示 96 | if(showHour < this.state.config.dayDivide){ 97 | return false; 98 | // 其余显示 99 | }else{ 100 | return true; 101 | } 102 | }else{ 103 | // 其它周天直接不显示 104 | return false; 105 | } 106 | 107 | // 默认显示 108 | return true; 109 | }, 110 | render: function(){ 111 | var sortArr = (this.props.tab === 7 ? // 如果tab为全部,则以日本时间排序。否则以大陆时间排序 112 | ['weekDayJP', 'timeJP'] : ['weekDayCN', 'timeCN']), 113 | listItems = _(this.props.items) 114 | // 转换 30 小时制 115 | .map(function(item, id){ 116 | return this._thirtyHours(item); 117 | }.bind(this)) 118 | // 过滤掉不显示的番组 119 | .filter(function(item, id){ 120 | return this._decideShow(item); 121 | }.bind(this)) 122 | // 排序 123 | .sortBy(sortArr) 124 | // 生成列表 125 | .map(function(item, i){ 126 | var className = Utils.classList({ 127 | 'new': item.newBgm, // 新番 128 | 'end': (typeof item.endDate !== 'undefined' && 129 | Utils.hasEnded(item.endDate, item.timeJP, 0)), // 已完结 130 | 'data-hide': item.hide, // 用户隐藏 131 | 'data-highlight': item.highlight, // 用户关注 132 | 'data-not-onair': !Utils.hasOnair(item.showDate, item.timeJP) // 还未放送 133 | }); 134 | 135 | return ( 136 | 144 | ); 145 | }.bind(this)).value(); 146 | 147 | // 如果可显示的番组数小于等于4,显示一个图片占位 148 | if(listItems.length <= 4){ 149 | listItems.push(
  • ); 150 | } 151 | return ( 152 |
    153 |
      {listItems}
    154 |
    155 | ); 156 | } 157 | }); 158 | 159 | var BgmListItem = React.createClass({ 160 | propTypes: { 161 | className: React.PropTypes.string, 162 | config: React.PropTypes.object, 163 | data: React.PropTypes.object.isRequired, 164 | supportSites: React.PropTypes.object, 165 | isHistory: React.PropTypes.bool 166 | }, 167 | getInitialState: function(){ 168 | return {expanded: false}; 169 | }, 170 | handleExpandClick: function(e){ 171 | this.setState({expanded: !this.state.expanded}); 172 | }, 173 | handleHideChange: function(flag){ 174 | Actions.toggleItem(this.props.data.id, flag); 175 | }, 176 | handleHighlightChange: function(flag){ 177 | Actions.highlightItem(this.props.data.id, flag); 178 | }, 179 | render: function(){ 180 | var classObj = {}, 181 | className = ''; 182 | classObj.expanded = this.state.expanded; 183 | classObj[this.props.className] = true; 184 | className = Utils.classList(classObj); 185 | 186 | return ( 187 |
  • 188 |
    189 | 195 | 203 |
    204 |
  • 205 | ); 206 | } 207 | }); 208 | 209 | module.exports = BgmList; 210 | -------------------------------------------------------------------------------- /src/js/component/BgmPreferences.js: -------------------------------------------------------------------------------- 1 | var _every = require('lodash/every'), 2 | _map = require('lodash/map'), 3 | _ = require('lodash'), 4 | React = require('react'), 5 | Utils = require('../mod/Utils'), 6 | Mixins = require('./Mixins'), 7 | Actions = require('../action/Actions'), 8 | configStore = require('../store/BgmConfigStore'), 9 | dataStore = require('../store/BgmDataStore'), 10 | sitesStore = require('../store/BgmSitesStore'); 11 | 12 | var PanelSwitch = React.createClass({ 13 | propTypes: { 14 | configName: React.PropTypes.string.isRequired, 15 | children: React.PropTypes.string.isRequired, 16 | value: React.PropTypes.bool, 17 | changeHandler: React.PropTypes.func 18 | }, 19 | getDefaultProps: function(){ 20 | return { 21 | value: false 22 | }; 23 | }, 24 | componentWillReceiveProps: function(nextProps){ 25 | this.setState({ 26 | value: nextProps.value 27 | }); 28 | }, 29 | getInitialState: function(){ 30 | return { 31 | value: this.props.value 32 | }; 33 | }, 34 | _handleChange: function(e){ 35 | this.setState({ 36 | value: e.target.checked 37 | }); 38 | this.props.changeHandler(this.props.configName, e.target.checked); 39 | }, 40 | render: function(){ 41 | var className = Utils.classList({ 42 | check: true, 43 | on: this.state.value 44 | }); 45 | 46 | return ( 47 |
  • 48 | 52 | 58 |
  • 59 | ); 60 | } 61 | }); 62 | 63 | var NumberSelector = React.createClass({ 64 | propTypes: { 65 | configName: React.PropTypes.string.isRequired, 66 | children: React.PropTypes.string.isRequired, 67 | value: React.PropTypes.number.isRequired, 68 | maxNumber: React.PropTypes.number, 69 | minNumber: React.PropTypes.number, 70 | changeHandler: React.PropTypes.func 71 | }, 72 | getInitialState: function(){ 73 | return { 74 | value: this.props.value 75 | }; 76 | }, 77 | componentWillReceiveProps: function(nextProps){ 78 | this.setState({ 79 | value: nextProps.value 80 | }); 81 | }, 82 | _handleAddBtnClick: function(e){ 83 | e.preventDefault(); 84 | this._changeNumber(1); 85 | }, 86 | _handleMinusBtnClick: function(e){ 87 | e.preventDefault(); 88 | this._changeNumber(-1); 89 | }, 90 | _changeNumber: function(operate){ 91 | var oldValue = this.state.value, 92 | maxNumber = this.props.maxNumber, 93 | minNumber = this.props.minNumber, 94 | newValue; 95 | 96 | switch(operate){ 97 | case 1: 98 | newValue = oldValue >= maxNumber ? maxNumber : oldValue + 1; 99 | break; 100 | case -1: 101 | newValue = oldValue <= minNumber ? minNumber : oldValue - 1; 102 | break; 103 | default: 104 | } 105 | 106 | this.setState({ 107 | value: newValue 108 | }); 109 | 110 | this.props.changeHandler(this.props.configName, newValue); 111 | }, 112 | render: function(){ 113 | var minusBtnClassName = Utils.classList({ 114 | 'number-control-btn': true, 115 | 'left-arrow': true, 116 | 'disabled': this.state.value <= this.props.minNumber 117 | }), 118 | addBtnClassName = Utils.classList({ 119 | 'number-control-btn': true, 120 | 'right-arrow': true, 121 | 'disabled': this.state.value >= this.props.maxNumber 122 | }); 123 | 124 | return ( 125 |
  • 126 | 127 |
    128 | 减小 133 | 139 | 增大 144 |
    145 |
  • 146 | ); 147 | } 148 | }); 149 | 150 | var SelectList = React.createClass({ 151 | propTypes: { 152 | configName: React.PropTypes.string.isRequired, 153 | children: React.PropTypes.string.isRequired, 154 | value: React.PropTypes.string.isRequired, 155 | changeHandler: React.PropTypes.func 156 | }, 157 | getInitialState: function(){ 158 | return { 159 | value: this.props.value 160 | }; 161 | }, 162 | componentWillReceiveProps: function(nextProps){ 163 | this.setState({ 164 | value: nextProps.value 165 | }); 166 | }, 167 | _handleChange: function(event) { 168 | var newValue = event.target.value; 169 | this.props.changeHandler(this.props.configName, newValue); 170 | }, 171 | render: function() { 172 | var options = this.props.options.map(function(option) { 173 | return ( 174 | 180 | ); 181 | }); 182 | 183 | return ( 184 |
  • 185 | 186 | 194 |
  • 195 | ); 196 | } 197 | }); 198 | 199 | var BgmPreferences = React.createClass({ 200 | mixins: [Mixins.configMixin, Mixins.sitesMixin], 201 | propTypes: { 202 | show: React.PropTypes.bool, 203 | toggleHandler: React.PropTypes.func 204 | }, 205 | getInitialState: function(){ 206 | return { 207 | config: configStore.getConfig(), 208 | supportSites: sitesStore.getSites(), 209 | show: this.props.show 210 | }; 211 | }, 212 | componentWillReceiveProps: function(nextProps){ 213 | this.setState({ 214 | show: nextProps.show 215 | }); 216 | }, 217 | _handleConfigChange: function(name, value){ 218 | var configObj = {}; 219 | configObj[name] = value; 220 | Actions.updateConfig(configObj); 221 | }, 222 | _handleSiteChange: function(name, value){ 223 | Actions.toggleSite(name.split('_')[1], value); 224 | }, 225 | _handleSiteAll: function(e){ 226 | e.preventDefault(); 227 | Actions.toggleAllSites(!this._sitesAllEnabled()); 228 | }, 229 | _sitesAllEnabled: function(){ 230 | return _every(this.state.supportSites, function(info, site){ 231 | return info.enable; 232 | }); 233 | }, 234 | _handleConfirm: function(e){ 235 | e.preventDefault(); 236 | Actions.saveConfig(); 237 | Actions.saveSites(); 238 | this.props.toggleHandler(e); 239 | }, 240 | _handleExport: function(e){ 241 | var data, dn, blob; 242 | e.preventDefault(); 243 | data = dataStore.getData(); 244 | dn = this.refs.exportSetting.getDOMNode(); 245 | blob = new Blob( 246 | [JSON.stringify(_.assign({}, { 247 | config: this.state.config, 248 | supportSites: this.state.supportSites, 249 | data: { 250 | path: data.path, 251 | version: data.version, 252 | items: _.pickBy(data.items, function(val, key) { 253 | return val.hide || val.highlight 254 | }) 255 | } 256 | }))], 257 | {type: "application/json"} 258 | ); 259 | dn.href = URL.createObjectURL(blob); 260 | dn.click(); 261 | this.props.toggleHandler(e); 262 | }, 263 | _handleImport: function(e){ 264 | e.preventDefault(); 265 | var fileSelector = this.refs.importSetting.getDOMNode(); 266 | fileSelector.onchange = function() { 267 | var files = fileSelector.files; 268 | if (files.length) { 269 | var reader = new FileReader(); 270 | reader.onload = function () { 271 | try { 272 | var setting = JSON.parse(reader.result); 273 | Actions.updateConfig(setting.config); 274 | Actions.importSites(setting.supportSites); 275 | Actions.importData(setting.data); 276 | } catch (e) { 277 | alert('无效'); 278 | } 279 | } 280 | reader.readAsText(files[0]); 281 | } 282 | }; 283 | fileSelector.click(); 284 | }, 285 | _handleReset: function(e){ 286 | e.preventDefault(); 287 | Actions.showDialog( 288 | 'warning', 289 | '重置不仅会清除您的设置,还会清除您对作品的关注/隐藏记录,请问您确定要重置吗?', 290 | [{ 291 | text: '确定', 292 | callback: () => { 293 | Actions.resetConfig(); 294 | Actions.resetSites(); 295 | Actions.resetData(); 296 | location.reload(true); 297 | } 298 | },{ 299 | text: '取消', 300 | callback: () => {} 301 | }] 302 | ); 303 | }, 304 | render: function(){ 305 | var SiteToggles = _map(this.state.supportSites, function(info, domain){ 306 | return ( 307 | {info.name} 313 | ); 314 | }.bind(this)); 315 | 316 | return ( 317 |
    318 |
    319 |
    320 |
    321 |

    显示设置

    322 |
    323 |
      324 | 只显示新番 329 | 关闭自动切换 334 | 当前页面打开 339 | 显示日文标题 344 | 只显示关注 349 | 转到次日 356 | Bangumi域名 368 |
    369 |
    370 |
    371 |
    372 |

    站点过滤

    373 | {this._sitesAllEnabled() ? '全不选' : '全选'} 378 | 379 |
    380 |
      381 | {SiteToggles} 382 |
    383 |
    384 |
    385 |
    386 | 确定 391 | 导出 397 | 导入 403 | 重置 408 | 415 | 导出 423 |
    424 |
    425 | ); 426 | } 427 | }); 428 | 429 | module.exports = BgmPreferences; 430 | -------------------------------------------------------------------------------- /src/js/component/BgmTable.js: -------------------------------------------------------------------------------- 1 | var React = require('react'), 2 | configStore = require('../store/BgmConfigStore'), 3 | TableSelector = require('./TableSelector'), 4 | BgmList = require('./BgmList'), 5 | BgmPreferences = require('./BgmPreferences'), 6 | Utils = require('../mod/Utils'); 7 | 8 | var BgmTable = React.createClass({ 9 | propTypes: { 10 | data: React.PropTypes.object, 11 | handleTabChange: React.PropTypes.func.isRequired, 12 | tab: React.PropTypes.number, 13 | keyword: React.PropTypes.string, 14 | isHistory: React.PropTypes.bool 15 | }, 16 | getInitialState: function(){ 17 | return ({ 18 | prefShow: false, 19 | tabName: Utils.formatWeekDay((new Date()).getDay()) 20 | }); 21 | }, 22 | togglePref: function(e){ 23 | e.preventDefault(); 24 | this.setState({ 25 | prefShow: !this.state.prefShow 26 | }); 27 | }, 28 | handleTabChange: function(tabKey, tabName){ 29 | this.props.handleTabChange(tabKey); 30 | this.setState({ 31 | tabName: tabName 32 | }); 33 | 34 | React.findDOMNode(this.refs.selectorToggle).checked = false; 35 | }, 36 | render: function(){ 37 | var props = this.props, 38 | state = this.state; 39 | 40 | return ( 41 |
    42 |
    43 |
    44 |
    45 | 设置 46 |
    47 |
    48 |
    49 |
    50 | 51 | 作品名 52 |
    53 |
    日本放送
    54 |
    55 | 大陆放送 56 | 放送时间 57 |
    58 |
    59 | 放送站点 60 |
    61 |
    62 |
    63 |
    64 |
    65 | 67 | 72 | 78 | 82 |
    83 |
    84 |
    85 | ); 86 | } 87 | }); 88 | 89 | module.exports = BgmTable; 90 | -------------------------------------------------------------------------------- /src/js/component/BgmTop.js: -------------------------------------------------------------------------------- 1 | var React = require('react'); 2 | 3 | var BgmTop = React.createClass({ 4 | propTypes: { 5 | handleSearch: React.PropTypes.func.isRequired, 6 | month: React.PropTypes.number, 7 | year: React.PropTypes.number, 8 | count: React.PropTypes.number 9 | }, 10 | render: function(){ 11 | return ( 12 |
    13 |
    14 |

    {this.props.year + '年' + this.props.month + '月番组'}

    15 |
    16 |

    本季共 {this.props.count} 部番组

    17 | 18 |
    19 |
    20 |
    21 | ); 22 | } 23 | }); 24 | 25 | var BgmSearcher = React.createClass({ 26 | propTypes: { 27 | handleSearch: React.PropTypes.func.isRequired 28 | }, 29 | handleInput: function(e){ 30 | var val = React.findDOMNode(this.refs.searchInput).value.trim(); 31 | this.props.handleSearch(val); 32 | }, 33 | render: function(){ 34 | return ( 35 |
    36 | 42 |
    搜索
    43 |
    44 | ); 45 | } 46 | }); 47 | 48 | module.exports = BgmTop; -------------------------------------------------------------------------------- /src/js/component/Dialog.js: -------------------------------------------------------------------------------- 1 | var React = require('react'); 2 | 3 | var Dialog = React.createClass({ 4 | propTypes: { 5 | type: React.PropTypes.oneOf(['info','error','warning']), 6 | content: React.PropTypes.string, 7 | buttons: React.PropTypes.arrayOf(React.PropTypes.shape({ 8 | text: React.PropTypes.string, 9 | callback: React.PropTypes.func 10 | })) 11 | }, 12 | getInitialState: function(){ 13 | return { 14 | show: false, 15 | buttons: this.props.buttons.length ? this.props.buttons : [{text: '确定', callback: ()=>{}}] 16 | }; 17 | }, 18 | componentWillReceiveProps: function(nextProps){ 19 | this.setState({ 20 | buttons: nextProps.buttons.length ? nextProps.buttons : [{text: '确定', callback: ()=>{}}] 21 | }); 22 | }, 23 | show: function(){ 24 | this.setState({show: true}); 25 | }, 26 | _buttonClick: function(index){ 27 | this.setState({show: false}); 28 | this.state.buttons[index].callback(); 29 | }, 30 | render: function(){ 31 | return ( 32 |
    33 |
    34 |
    35 |

    {{info:'注意', warning:'警告', error:'错误'}[this.props.type]}

    36 |
    37 |
    38 |

    {this.props.content}

    39 |
    40 |
    41 | {this.state.buttons.map((button,index) => {button.text})} 42 |
    43 |
    44 |
    45 | ); 46 | } 47 | }); 48 | 49 | module.exports = Dialog; 50 | // vim: set expandtab ts=4 sw=4: 51 | -------------------------------------------------------------------------------- /src/js/component/ItemSites.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'), 2 | React = require('react'), 3 | Utils = require('../mod/Utils'), 4 | configStore = require('../store/BgmConfigStore'), 5 | sitesStore = require('../store/BgmSitesStore'); 6 | 7 | var ItemSites = React.createClass({ 8 | propTypes: { 9 | sites: React.PropTypes.array.isRequired, 10 | supportSites: React.PropTypes.object, 11 | disableNewTab: React.PropTypes.bool 12 | }, 13 | _handleClick: function(e){ 14 | e.stopPropagation(); 15 | }, 16 | render: function(){ 17 | var siteItems = _(this.props.sites) 18 | .filter(function(url){ 19 | return Utils.getLinkSite(url, this.props.supportSites).enable; 20 | }.bind(this)) 21 | .sortBy(function(url){ 22 | return Utils.getLinkSite(url, this.props.supportSites).name; 23 | }.bind(this)) 24 | .map(function(url, i){ 25 | var siteName = Utils.getLinkSite(url, this.props.supportSites).name; 26 | return ( 27 |
  • 28 | {siteName} 33 |
  • 34 | ); 35 | }.bind(this)).value(); 36 | 37 | if(!siteItems.length){ 38 | if(this.props.sites && this.props.sites.length){ 39 | siteItems.push(
  • 过滤
  • ); 40 | }else{ 41 | siteItems.push(
  • 暂无
  • ); 42 | } 43 | } 44 | 45 | return ( 46 |
    47 |
      48 | {siteItems} 49 |
    50 |
    51 | ); 52 | } 53 | }); 54 | 55 | module.exports = ItemSites; 56 | -------------------------------------------------------------------------------- /src/js/component/MainApp.js: -------------------------------------------------------------------------------- 1 | var React = require('react'), 2 | qwest = require('qwest'), 3 | Actions = require('../action/Actions'), 4 | Utils = require('../mod/Utils'), 5 | configStore = require('../store/BgmConfigStore'), 6 | ArchiveStore = require('../store/ArchiveStore'), 7 | BgmApp = require('./BgmApp'), 8 | BgmHeader = require('./BgmHeader'), 9 | Dialog = require('./Dialog'), 10 | Dispacher = require('../dispatcher/Dispatcher'); 11 | 12 | var App = React.createClass({ 13 | getInitialState: function(){ 14 | 15 | Dispacher.register(action => { 16 | switch(action.actionType){ 17 | case 'SHOW_DIALOG': 18 | this.setState({dialog: action.option}, ()=>this.refs.dialog.show()); 19 | break; 20 | default: 21 | } 22 | }); 23 | var dateNow = new Date(), 24 | monthNow = dateNow.getMonth() + 1, 25 | yeartNow = dateNow.getFullYear(), 26 | seasonNow = Utils.monthToSeason(monthNow); 27 | 28 | return { 29 | yearNow: yeartNow, 30 | monthNow: seasonNow, 31 | archiveData: {}, 32 | currentArchive: {}, 33 | dialog:{ 34 | type: 'info', // 'info', 'error', 'warning' 35 | content: '', 36 | buttons: [] // [{text:'OK', callback: function(){}}] 37 | } 38 | }; 39 | }, 40 | changeDataUrl: function(year, month){ 41 | this.setState({ 42 | currentArchive: ArchiveStore.getArchive(year, month), 43 | yearNow: +year, 44 | monthNow: +month 45 | }); 46 | }, 47 | componentDidMount: function(){ 48 | ArchiveStore.addInitListener(function(){ 49 | this.setState({ 50 | archiveData: ArchiveStore.getArchiveData(), 51 | currentArchive: ArchiveStore.getArchive(this.state.yearNow, this.state.monthNow) 52 | }); 53 | }.bind(this)); 54 | ArchiveStore.init(); 55 | }, 56 | componentWillUnmount: function(){ 57 | ArchiveStore.clearInitListener(); 58 | }, 59 | render: function(){ 60 | var state = this.state; 61 | return ( 62 |
    63 | 67 | 72 | 75 | 76 |
    77 | ); 78 | } 79 | }); 80 | 81 | function init(){ 82 | React.initializeTouchEvents(true); 83 | 84 | React.render( 85 | , 86 | document.getElementById('main') 87 | ); 88 | } 89 | 90 | module.exports = { 91 | init: init 92 | }; 93 | -------------------------------------------------------------------------------- /src/js/component/Mixins.js: -------------------------------------------------------------------------------- 1 | var Actions = require('../action/Actions'), 2 | configStore = require('../store/BgmConfigStore'), 3 | sitesStore = require('../store/BgmSitesStore'); 4 | 5 | var Mixins = { 6 | configMixin: { 7 | componentDidMount: function(){ 8 | configStore.addChangeListener(this.onConfigChange); 9 | }, 10 | componentWillUnmount: function(){ 11 | configStore.clearChangeListener(); 12 | }, 13 | onConfigChange: function(){ 14 | this.setState({ 15 | config: configStore.getConfig() 16 | }); 17 | } 18 | }, 19 | sitesMixin: { 20 | componentDidMount: function(){ 21 | sitesStore.addChangeListener(this.onSitesChange); 22 | }, 23 | componentWillUnmount: function(){ 24 | sitesStore.clearChangeListener(); 25 | }, 26 | onSitesChange: function(){ 27 | this.setState({ 28 | supportSites: sitesStore.getSites() 29 | }); 30 | } 31 | } 32 | }; 33 | 34 | module.exports = Mixins; -------------------------------------------------------------------------------- /src/js/component/TableSelector.js: -------------------------------------------------------------------------------- 1 | var _map = require('lodash/map'), 2 | React = require('react'), 3 | Utils = require('../mod/Utils'); 4 | 5 | var now = new Date(); 6 | 7 | var TableSelector = React.createClass({ 8 | propTypes: { 9 | onTabChange: React.PropTypes.func.isRequired, 10 | tab: React.PropTypes.number.isRequired, 11 | isInSearch: React.PropTypes.bool 12 | }, 13 | _handleTabClick: function(event){ 14 | var tabKey = +event.target.getAttribute('data-tab'), 15 | tabName = event.target.getAttribute('data-name'); 16 | 17 | event.preventDefault(); 18 | 19 | if(typeof tabKey === 'number'){ 20 | this.props.onTabChange(tabKey, tabName); 21 | } 22 | }, 23 | render: function(){ 24 | var tabs = [ 25 | {name: '周一', key: 1}, 26 | {name: '周二', key: 2}, 27 | {name: '周三', key: 3}, 28 | {name: '周四', key: 4}, 29 | {name: '周五', key: 5}, 30 | {name: '周六', key: 6}, 31 | {name: '周日', key: 0}, 32 | {name: '全部', key: 7}, 33 | // {name: '单次', key: 8} 34 | ]; 35 | 36 | var _self = this, 37 | tabItems = _map(tabs, function(tab, i){ 38 | var selectdTab = _self.props.isInSearch ? 7 : _self.props.tab, 39 | className = Utils.classList({ 40 | 'cur': tab.key === selectdTab 41 | }); 42 | 43 | return ( 44 |
  • 45 | {now.getDay() === tab.key ? '今天' : tab.name} 50 |
  • 51 | ); 52 | }); 53 | 54 | return ( 55 |
    56 |
      57 | {tabItems} 58 |
    59 |
    60 | ); 61 | } 62 | }); 63 | 64 | module.exports = TableSelector; 65 | -------------------------------------------------------------------------------- /src/js/dispatcher/Dispatcher.js: -------------------------------------------------------------------------------- 1 | module.exports = new (require('flux').Dispatcher)(); -------------------------------------------------------------------------------- /src/js/main.js: -------------------------------------------------------------------------------- 1 | var MainApp = require('./component/MainApp'); 2 | 3 | require('../less/main.less'); 4 | 5 | MainApp.init(); 6 | -------------------------------------------------------------------------------- /src/js/mod/Utils.js: -------------------------------------------------------------------------------- 1 | var url = require('url'); 2 | 3 | var WEEKDAYCN = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'], 4 | WEEKDAYJP = ['日曜', '月曜', '火曜', '水曜', '木曜', '金曜', '土曜']; 5 | 6 | var SITE_REGEX = { 7 | 'acfun' : /acfun\.(cn|tv|tudou)/, 8 | 'bilibili': /bilibili\.com/, 9 | 'tucao' : /tucao\.(tv|cc)/, 10 | 'sohu' : /sohu\.com/, 11 | 'youku' : /youku\.com/, 12 | 'qq' : /qq\.com/, 13 | 'iqiyi' : /iqiyi\.com/, 14 | 'letv' : /(le|letv)\.com/, 15 | 'pptv' : /pptv\.com/, 16 | 'tudou' : /tudou\.com/, 17 | 'movie' : /kankan\.com/, 18 | 'mgtv' : /mgtv\.com/, 19 | 'netflix' : /netflix\.com/, 20 | 'niconico': /nicovideo\.jp/, 21 | 'gamer' : /acg\.gamer\.com\.tw/, 22 | 'muse_hk' : /youtube\.com\/playlist\?list=PLuxqoToY7Uc/, 23 | }; 24 | 25 | /** 26 | * 从主域名获得站点名称 27 | * @param {string} urlString 网址 28 | * @param {Object[]} sites 站点数组 29 | * @returns {Object} 站点信息 30 | */ 31 | function getLinkSite(urlString, sites){ 32 | for (var siteKey in SITE_REGEX) { 33 | if (SITE_REGEX[siteKey].test(urlString)) { 34 | return sites[siteKey]; 35 | } 36 | } 37 | 38 | return {}; 39 | } 40 | 41 | /** 42 | * 格式化周天 43 | * @param {number} index 周天序号 44 | * @param {string} [country=cn] 国家代号 'cn' or 'jp' 45 | * @returns {string} 格式化后的周天 46 | */ 47 | function formatWeekDay(index, country){ 48 | if(country && country.toLowerCase() === 'jp'){ 49 | return WEEKDAYJP[index]; 50 | }else{ 51 | return WEEKDAYCN[index]; 52 | } 53 | } 54 | 55 | /** 56 | * 格式化时间 57 | * @param {string} time 时间字符串 '1200' 58 | * @return {string} 格式化后的时间 '12:00' 59 | */ 60 | function formatTime(time){ 61 | var text = ''; 62 | 63 | if(time === -1){ 64 | text = '(未知)'; 65 | }else if(time){ 66 | text = time.slice(0, 2) + ':' + time.slice(2); 67 | }else{ 68 | text = '(预计)'; 69 | } 70 | 71 | return text; 72 | } 73 | 74 | /** 75 | * 将内容储存在localstorage中 76 | * @param {string} namespace 命名空间 77 | * @param {array|object} data 待储存的内容 78 | * @return {array|object} 取到的内容 79 | */ 80 | function store(namespace, data){ 81 | var s = null; 82 | if (data) { 83 | return localStorage.setItem(namespace, JSON.stringify(data)); 84 | } 85 | 86 | s = localStorage.getItem(namespace); 87 | return (s && JSON.parse(s)) || []; 88 | } 89 | 90 | /** 91 | * 月份转换为季度 92 | * @param {number} month 月份 93 | * @return {number} 季度 '1月 4月 7月 10月' 94 | */ 95 | function monthToSeason(month){ 96 | switch (true) { 97 | case (month < 4): 98 | return 1; 99 | case (month < 7): 100 | return 4; 101 | case (month < 10): 102 | return 7; 103 | case (month <= 12): 104 | return 10; 105 | default: 106 | throw new Error('failed convrting to season'); 107 | } 108 | } 109 | 110 | /** 111 | * 辅助生成className 112 | * @param {object} obj className的key value对, value为true则输出 113 | * @return {string} class string 114 | */ 115 | function classList(obj){ 116 | var className = '', 117 | result = []; 118 | 119 | for(className in obj){ 120 | if(obj[className] === true){ 121 | result.push(className); 122 | } 123 | } 124 | 125 | return result.join(' '); 126 | } 127 | 128 | /** 129 | * 判断是否已开播 130 | * @param {string} dateStr 日期字符串 2004-10-01 131 | * @param {string} time 时间字符串 0830 132 | * return {boolean} 是否开播 133 | */ 134 | function hasOnair(dateStr, timeStr){ 135 | var now = new Date(), 136 | showDate = new Date(dateStr.replace(/-/g, '/') + ' ' + 137 | timeStr.slice(0, 2) + ':' + 138 | timeStr.slice(2) + 139 | ' GMT+0800 (CST)'); 140 | 141 | return now >= showDate; 142 | } 143 | 144 | /** 145 | * 判断是否已结束播放 146 | * @param {string} dateStr 日期字符串 2004-10-01 147 | * @param {string} timeStr 时间字符串 0830 148 | * @param {number} offset 延迟天数 149 | * @return {Boolean} 是否已结束放送 150 | */ 151 | function hasEnded(dateStr, timeStr, offset){ 152 | var now = new Date(), 153 | endDate = new Date(dateStr.replace(/-/g, '/') + ' ' + 154 | timeStr.slice(0, 2) + ':' + timeStr.slice(2) + 155 | ' GMT+0800 (CST)'); 156 | endDate.setDate(endDate.getDate() + (offset || 0)) 157 | return now >= endDate; 158 | } 159 | 160 | module.exports = { 161 | getLinkSite: getLinkSite, 162 | formatWeekDay: formatWeekDay, 163 | formatTime: formatTime, 164 | store: store, 165 | monthToSeason: monthToSeason, 166 | classList: classList, 167 | hasOnair: hasOnair, 168 | hasEnded: hasEnded 169 | }; 170 | -------------------------------------------------------------------------------- /src/js/mod/getPinyin.js: -------------------------------------------------------------------------------- 1 | function getPinyin(str){ 2 | var pyt = "ydkqsxnwzssxjbymgcczqpssqbycdscdqldylybssjgyqzjjfgcclzznwdwzjljpfyynnjjtmynzwzhflzppqhgccyynmjqyxxgd" + 3 | "nnsnsjnjnsnnmlnrxyfsngnnnnqzggllyjlnyzssecykyyhqwjssggyxyqyjtwktjhychmnxjtlhjyqbyxdldwrrjnwysrldzjpc" + 4 | "bzjjbrcfslnczstzfxxchtrqggddlyccssymmrjcyqzpwwjjyfcrwfdfzqpyddwyxkyjawjffxjbcftzyhhycyswccyxsclcxxwz" + 5 | "cxnbgnnxbxlzsqsbsjpysazdhmdzbqbscwdzzyytzhbtsyyfzgntnxjywqnknphhlxgybfmjnbjhhgqtjcysxstkzglyckglysmz" + 6 | "xyalmeldccxgzyrjxjzlnjzcqkcnnjwhjczccqljststbnhbtyxceqxkkwjyflzqlyhjxspsfxlmpbysxxxytccnylllsjxfhjxp" + 7 | "jbtffyabyxbcczbzyclwlczggbtssmdtjcxpthyqtgjjxcjfzkjzjqnlzwlslhdzbwjncjzyzsqnycqynzcjjwybrtwpyftwexcs" + 8 | "kdzctbyhyzqyyjxzcfbzzmjyxxsdczottbzljwfckscsxfyrlrygmbdthjxsqjccsbxyytswfbjdztnbcnzlcyzzpsacyzzsqqcs" + 9 | "hzqydxlbpjllmqxqydzxsqjtzpxlcglqdcwzfhctdjjsfxjejjtlbgxsxjmyjjqpfzasyjnsydjxkjcdjsznbartcclnjqmwnqnc" + 10 | "lllkbdbzzsyhqcltwlccrshllzntylnewyzyxczxxgdkdmtcedejtsyyssdqdfmxdbjlkrwnqlybglxnlgtgxbqjdznyjsjyjcjm" + 11 | "rnymgrcjczgjmzmgxmmryxkjnymsgmzzymknfxmbdtgfbhcjhkylpfmdxlxjjsmsqgzsjlqdldgjycalcmzcsdjllnxdjffffjcn" + 12 | "fnnffpfkhkgdpqxktacjdhhzdddrrcfqyjkqccwjdxhwjlyllzgcfcqjsmlzpbjjblsbcjggdckkdezsqcckjgcgkdjtjllzycxk" + 13 | "lqccgjcltfpcqczgwbjdqyzjjbyjhsjddwgfsjgzkcjctllfspkjgqjhzzljplgjgjjthjjyjzccmlzlyqbgjwmljkxzdznjqsyz" + 14 | "mljlljkywxmkjlhskjhbmclyymkxjqlbmllkmdxxkwyxwslmlpsjqqjqxyqfjtjdxmxxllcrqbsyjbgwynnggbcnxpjtgpapfgdj" + 15 | "qbhbncfjyzjkjkhxqfgqckfhygkhdkllsdjqxpqyaybnqsxqnszswhbsxwhxwbzzxdmndjbsbkbbzklylxgwxjjwaqzmywsjqlsj" + 16 | "xxjqwjeqxnchetlzalyyyszzpnkyzcptlshtzcfycyxyljsdcjqagyslcllyyysslqqqnldxzsccscadycjysfsgbfrsszqsbxjp" + 17 | "sjysdrckgjlgtkzjzbdktcsyqpyhstcldjnhmymcgxyzhjdctmhltxzhylamoxyjcltyfbqqjpfbdfehthsqhzywwcncxcdwhowg" + 18 | "yjlegmdqcwgfjhcsntmydolbygnqwesqpwnmlrydzszzlyqpzgcwxhnxpyxshmdqjgztdppbfbhzhhjyfdzwkgkzbldnzsxhqeeg" + 19 | "zxylzmmzyjzgszxkhkhtxexxgylyapsthxdwhzydpxagkydxbhnhnkdnjnmyhylpmgecslnzhkxxlbzzlbmlsfbhhgsgyyggbhsc" + 20 | "yajtxglxtzmcwzydqdqmngdnllszhngjzwfyhqswscelqajynytlsxthaznkzzsdhlaxxtwwcjhqqtddwzbcchyqzflxpslzqgpz" + 21 | "sznglydqtbdlxntctajdkywnsyzljhhdzckryyzywmhychhhxhjkzwsxhdnxlyscqydpslyzwmypnkxyjlkchtyhaxqsyshxasmc" + 22 | "hkdscrsgjpwqsgzjlwwschsjhsqnhnsngndantbaalczmsstdqjcjktscjnxplggxhhgoxzcxpdmmhldgtybynjmxhmrzplxjzck" + 23 | "zxshflqxxcdhxwzpckczcdytcjyxqhlxdhypjqxnlsyydzozjnhhqezysjyayxkypdgxddnsppyzndhthrhxydpcjjhtcnnctlhb" + 24 | "ynyhmhzllnnxmylllmdcppxhmxdkycyrdltxjchhznxclcclylnzsxnjzzlnnnnwhyqsnjhxynttdkyjpychhyegkcwtwlgjrlgg" + 25 | "tgtygyhpyhylqyqgcwyqkpyyettttlhyylltyttsylnyzwgywgpydqqzzdqnnkcqnmjjzzbxtqfjkdffbtkhzkbxdjjkdjjtlbwf" + 26 | "zpptkqtztgpdwntpjyfalqmkgxbcclzfhzcllllanpnxtjklcclgyhdzfgyddgcyyfgydxkssendhykdndknnaxxhbpbyyhxccga" + 27 | "pfqyjjdmlxcsjzllpcnbsxgjyndybwjspcwjlzkzddtacsbkzdyzypjzqsjnkktknjdjgyepgtlnyqnacdntcyhblgdzhbbydmjr" + 28 | "egkzyheyybjmcdtafzjzhgcjnlghldwxjjkytcyksssmtwcttqzlpbszdtwcxgzagyktywxlnlcpbclloqmmzsslcmbjcsdzkydc" + 29 | "zjgqjdsmcytzqqlnzqzxssbpkdfqmddzzsddtdmfhtdycnaqjqkypbdjyyxtljhdrqxlmhkydhrnlklytwhllrllrcxylbnsrnzz" + 30 | "symqzzhhkyhxksmzsyzgcxfbnbsqlfzxxnnxkxwymsddyqnggqmmyhcdzttfgyyhgsbttybykjdnkyjbelhdypjqnfxfdnkzhqks" + 31 | "byjtzbxhfdsbdaswpawajldyjsfhblcnndnqjtjnchxfjsrfwhzfmdrfjyxwzpdjkzyjympcyznynxfbytfyfwygdbnzzzdnytxz" + 32 | "emmqbsqehxfznbmflzzsrsyqjgsxwzjsprytjsjgskjjgljjynzjjxhgjkymlpyyycxycgqzswhwlyrjlpxslcxmnsmwklcdnkny" + 33 | "npsjszhdzeptxmwywxyysywlxjqcqxzdclaeelmcpjpclwbxsqhfwrtfnjtnqjhjqdxhwlbyccfjlylkyynldxnhycstyywncjtx" + 34 | "ywtrmdrqnwqcmfjdxzmhmayxnwmyzqtxtlmrspwwjhanbxtgzypxyyrrclmpamgkqjszycymyjsnxtplnbappypylxmyzkynldgy" + 35 | "jzcchnlmzhhanqnbgwqtzmxxmllhgdzxnhxhrxycjmffxywcfsbssqlhnndycannmtcjcypnxnytycnnymnmsxndlylysljnlxys" + 36 | "sqmllyzlzjjjkyzzcsfbzxxmstbjgnxnchlsnmcjscyznfzlxbrnnnylmnrtgzqysatswryhyjzmgdhzgzdwybsscskxsyhytsxg" + 37 | "cqgxzzbhyxjscrhmkkbsczjyjymkqhzjfnbhmqhysnjnzybknqmcjgqhwlsnzswxkhljhyybqcbfcdsxdldspfzfskjjzwzxsddx" + 38 | "jseeegjscssygclxxnwwyllymwwwgydkzjggggggsycknjwnjpcxbjjtqtjwdsspjxcxnzxnmelptfsxtllxcljxjjljsxctnswx" + 39 | "lennlyqrwhsycsqnybyaywjejqfwqcqqcjqgxaldbzzyjgkgxbltqyfxjltpydkyqhpmatlcndnkxmtxynhklefxdllegqtymsaw" + 40 | "hzmljtkynxlyjzljeeyybqqffnlyxhdsctgjhxywlkllxqkcctnhjlqmkkzgcyygllljdcgydhzwypysjbzjdzgyzzhywyfqdtyz" + 41 | "szyezklymgjjhtsmqwyzljyywzcsrkqyqltdxwcdrjalwsqzwbdcqyncjnnszjlncdcdtlzzzacqqzzddxyblxcbqjylzllljddz" + 42 | "jgyqyjzyxnyyyexjxksdaznyrdlzyyynjlslldyxjcykywnqcclddnyyynycgczhjxcclgzqjgnwnncqqjysbzzxyjxjnxjfzbsb" + 43 | "dsfnsfpzxhdwztdmpptflzzbzdmyypqjrsdzsqzsqxbdgcpzswdwcsqzgmdhzxmwwfybpngphdmjthzsmmbgzmbzjcfzhfcbbnmq" + 44 | "dfmbcmcjxlgpnjbbxgyhyyjgptzgzmqbqdcgybjxlwnkydpdymgcftpfxyztzxdzxtgkptybbclbjaskytssqyymscxfjhhlslls" + 45 | "jpqjjqaklyldlycctsxmcwfgngbqxllllnyxtyltyxytdpjhnhgnkbyqnfjyyzbyyessessgdyhfhwtcqbsdzjtfdmxhcnjzymqw" + 46 | "srxjdzjqbdqbbsdjgnfbknbxdkqhmkwjjjgdllthzhhyyyyhhsxztyyyccbdbpypzyccztjpzywcbdlfwzcwjdxxhyhlhwczxjtc" + 47 | "nlcdpxnqczczlyxjjcjbhfxwpywxzpcdzzbdccjwjhmlxbqxxbylrddgjrrctttgqdczwmxfytmmzcwjwxyywzzkybzcccttqnhx" + 48 | "nwxxkhkfhtswoccjybcmpzzykbnnzpbthhjdlszddytyfjpxyngfxbyqxzbhxcpxxtnzdnnycnxsxlhkmzxlthdhkghxxsshqyhh" + 49 | "cjyxglhzxcxnhekdtgqxqypkdhentykcnymyyjmkqyyyjxzlthhqtbyqhxbmyhsqckwwyllhcyylnneqxqwmcfbdccmljggxdqkt" + 50 | "lxkknqcdgcjwyjjlyhhqyttnwchhxcxwherzjydjccdbqcdgdnyxzdhcqrxcbhztqcbxwgqwyybxhmbymykdyecmqkyaqyngyzsl" + 51 | "fnkkqgyssqyshngjctxkzycssbkyxhyylstycxqthysmnscpmmgcccccmnztasmgqzjhklosjylswtmqzyqkdzljqqyplzycztcq" + 52 | "qpbbcjzclpkhqcyyxxdtdddsjcxffllchqxmjlwcjcxtspycxndtjshjwhdqqqckxyamylsjhmlalygxcyydmamdqmlmcznnyybz" + 53 | "xkyflmcncmlhxrcjjhsylnmtjggzgywjxsrxcwjgjqhqzdqjdcjjskjkgdzcgjjyjylxzxxcdqhhheslmhlfsbdjsyyshfyssczq" + 54 | "lpbdrfnztzdkykhsccgkwtqzckmsynbcrxqbjyfaxpzzedzcjykbcjwhyjbqzzywnyszptdkzpfpbaztklqnhbbzptpptyzzybhn" + 55 | "ydcpzmmcycqmcjfzzdcmnlfpbplngqjtbttajzpzbbdnjkljqylnbzqhksjznggqstzkcxchpzsnbcgzkddzqanzgjkdrtlzldwj" + 56 | "njzlywtxndjzjhxnatncbgtzcsskmljpjytsnwxcfjwjjtkhtzplbhsnjssyjbhbjyzlstlsbjhdnwqpslmmfbjdwajyzccjtbnn" + 57 | "nzwxxcdslqgdsdpdzgjtqqpsqlyyjzlgyhsdlctcbjtktyczjtqkbsjlgnnzdncsgpynjzjjyyknhrpwszxmtncszzyshbyhyzax" + 58 | "ywkcjtllckjjtjhgcssxyqyczbynnlwqcglzgjgqyqcczssbcrbcskydznxjsqgxssjmecnstjtpbdlthzwxqwqczexnqczgwesg" + 59 | "ssbybstscslccgbfsdqnzlccglllzghzcthcnmjgyzazcmsksstzmmzckbjygqljyjppldxrkzyxccsnhshhdznlzhzjjcddcbcj" + 60 | "xlbfqbczztpqdnnxljcthqzjgylklszzpcjdscqjhjqkdxgpbajynnsmjtzdxlcjyryynhjbngzjkmjxltbsllrzpylssznxjhll" + 61 | "hyllqqzqlsymrcncxsljmlzltzldwdjjllnzggqxppskyggggbfzbdkmwggcxmcgdxjmcjsdycabxjdlnbcddygskydqdxdjjyxh" + 62 | "saqazdzfslqxxjnqzylblxxwxqqzbjzlfbblylwdsljhxjyzjwtdjcyfqzqzzdzsxzzqlzcdzfxhwspynpqzmlpplffxjjnzzyls" + 63 | "jnyqzfpfzgsywjjjhrdjzzxtxxglghtdxcskyswmmtcwybazbjkshfhgcxmhfqhyxxyzftsjyzbxyxpzlchmzmbxhzzssyfdmncw" + 64 | "dabazlxktcshhxkxjjzjsthygxsxyyhhhjwxkzxssbzzwhhhcwtzzzpjxsyxqqjgzyzawllcwxznxgyxyhfmkhydwsqmnjnaycys" + 65 | "pmjkgwcqhylajgmzxhmmcnzhbhxclxdjpltxyjkdyylttxfqzhyxxsjbjnayrsmxyplckdnyhlxrlnllstycyyqygzhhsccsmcct" + 66 | "zcxhyqfpyyrpbflfqnntszlljmhwtcjqyzwtlnmlmdwmbzzsnzrbpdddlqjjbxtcsnzqqygwcsxfwzlxccrszdzmcyggdyqsgtnn" + 67 | "nlsmymmsyhfbjdgyxccpshxczcsbsjyygjmpbwaffyfnxhydxzylremzgzzyndsznlljcsqfnxxkptxzgxjjgbmyyssnbtylbnlh" + 68 | "bfzdcyfbmgqrrmzszxysjtznnydzzcdgnjafjbdknzblczszpsgcycjszlmnrznbzzldlnllysxsqzqlcxzlsgkbrxbrbzcycxzj" + 69 | "zeeyfgklzlnyhgzcgzlfjhgtgwkraajyzkzqtsshjjxdzyznynnzyrzdqqhgjzxsszbtkjbbfrtjxllfqwjgclqtymblpzdxtzag" + 70 | "bdhzzrbgjhwnjtjxlkscfsmwlldcysjtxkzscfwjlbnntzlljzllqblcqmqqcgcdfpbphzczjlpyyghdtgwdxfczqyyyqysrclqz" + 71 | "fklzzzgffcqnwglhjycjjczlqzzyjbjzzbpdcsnnjgxdqnknlznnnnpsntsdyfwwdjzjysxyyczcyhzwbbyhxrylybhkjksfxtjj" + 72 | "mmchhlltnyymsxxyzpdjjycsycwmdjjkqyrhllngpngtlyycljnnnxjyzfnmlrgjjtyzbsyzmsjyjhgfzqmsyxrszcytlrtqzsst" + 73 | "kxgqkgsptgxdnjsgcqcqhmxggztqydjjznlbznxqlhyqgggthqscbyhjhhkyygkggcmjdzllcclxqsftgjslllmlcskctbljszsz" + 74 | "mmnytpzsxqhjcnnqnyexzqzcpshkzzyzxxdfgmwqrllqxrfztlystctmjcsjjthjnxtnrztzfqrhcgllgcnnnnjdnlnnytsjtlny" + 75 | "xsszxcgjzyqpylfhdjsbbdczgjjjqzjqdybssllcmyttmqnbhjqmnygjyeqyqmzgcjkpdcnmyzgqllslnclmholzgdylfzslncnz" + 76 | "lylzcjeshnyllnxnjxlyjyyyxnbcljsswcqqnnyllzldjnllzllbnylnqchxyyqoxccqkyjxxxyklksxeyqhcqkkkkcsnyxxyqxy" + 77 | "gwtjohthxpxxhsnlcykychzzcbwqbbwjqcscszsslcylgddsjzmmymcytsdsxxscjpqqsqylyfzychdjynywcbtjsydchcyddjlb" + 78 | "djjsodzyqyskkyxdhhgqjyohdyxwgmmmazdybbbppbcmnnpnjzsmtxerxjmhqdntpjdcbsnmssythjtslmltrcplzszmlqdsdmjm" + 79 | "qpnqdxcfrnnfsdqqyxhyaykqyddlqyyysszbydslntfgtzqbzmchdhczcwfdxtmqqsphqwwxsrgjcwnntzcqmgwqjrjhtqjbbgwz" + 80 | "fxjhnqfxxqywyyhyscdydhhqmrmtmwctbszppzzglmzfollcfwhmmsjzttdhlmyffytzzgzyskjjxqyjzqbhmbzclyghgfmshpcf" + 81 | "zsnclpbqsnjyzslxxfpmtyjygbxlldlxpzjyzjyhhzcywhjylsjexfszzywxkzjlnadymlymqjpwxxhxsktqjezrpxxzghmhwqpw" + 82 | "qlyjjqjjzszcnhjlchhnxjlqwzjhbmzyxbdhhypylhlhlgfwlcfyytlhjjcwmscpxstkpnhjxsntyxxtestjctlsslstdlllwwyh" + 83 | "dnrjzsfgxssyczykwhtdhwjglhtzdqdjzxxqgghltzphcsqfclnjtclzpfstpdynylgmjllycqhynspchylhqyqtmzymbywrfqyk" + 84 | "jsyslzdnjmpxyyssrhzjnyqtqdfzbwwdwwrxcwggyhxmkmyyyhmxmzhnksepmlqqmtcwctmxmxjpjjhfxyyzsjzhtybmstsyjznq" + 85 | "jnytlhynbyqclcycnzwsmylknjxlggnnpjgtysylymzskttwlgsmzsylmpwlcwxwqcssyzsyxyrhssntsrwpccpwcmhdhhxzdzyf" + 86 | "jhgzttsbjhgyglzysmyclllxbtyxhbbzjkssdmalhhycfygmqypjyjqxjllljgclzgqlycjcctotyxmtmshllwlqfxymzmklpszz" + 87 | "cxhkjyclctyjcyhxsgyxnnxlzwpyjpxhjwpjpwxqqxlxsdhmrslzzydwdtcxknstzshbsccstplwsscjchjlcgchssphylhfhhxj" + 88 | "sxallnylmzdhzxylsxlmzykcldyahlcmddyspjtqjzlngjfsjshctsdszlblmssmnyymjqbjhrzwtyydchjljapzwbgqxbkfnbjd" + 89 | "llllyylsjydwhxpsbcmljpscgbhxlqhyrljxyswxhhzlldfhlnnymjljyflyjycdrjlfsyzfsllcqyqfgqyhnszlylmdtdjcnhbz" + 90 | "llnwlqxygyyhbmgdhxxnhlzzjzxczzzcyqzfngwpylcpkpykpmclgkdgxzgxwqbdxzzkzfbddlzxjtpjpttbythzzdwslcpnhslt" + 91 | "jxxqlhyxxxywzyswttzkhlxzxzpyhgzhknfsyhntjrnxfjcpjztwhplshfcrhnslxxjxxyhzqdxqwnnhyhmjdbflkhcxcwhjfyjc" + 92 | "fpqcxqxzyyyjygrpynscsnnnnchkzdyhflxxhjjbyzwttxnncyjjymswyxqrmhxzwfqsylznggbhyxnnbwttcsybhxxwxyhhxyxn" + 93 | "knyxmlywrnnqlxbbcljsylfsytjzyhyzawlhorjmnsczjxxxyxchcyqryxqzddsjfslyltsffyxlmtyjmnnyyyxltzcsxqclhzxl" + 94 | "wyxzhnnlrxkxjcdyhlbrlmbrdlaxksnlljlyxxlynrylcjtgncmtlzllcyzlpzpzyawnjjfybdyyzsepckzzqdqpbpsjpdyttbdb" + 95 | "bbyndycncpjmtmlrmfmmrwyfbsjgygsmdqqqztxmkqwgxllpjgzbqrdjjjfpkjkcxbljmswldtsjxldlppbxcwkcqqbfqbccajzg" + 96 | "mykbhyhhzykndqzybpjnspxthlfpnsygyjdbgxnhhjhzjhstrstldxskzysybmxjlxyslbzyslzxjhfybqnbylljqkygzmcyzzym" + 97 | "ccslnlhzhwfwyxzmwyxtynxjhbyymcysbmhysmydyshnyzchmjjmzcaahcbjbbhblytylsxsnxgjdhkxxtxxnbhnmlngsltxmrhn" + 98 | "lxqqxmzllyswqgdlbjhdcgjyqyymhwfmjybbbyjyjwjmdpwhxqldyapdfxxbcgjspckrssyzjmslbzzjfljjjlgxzgyxyxlszqkx" + 99 | "bexyxhgcxbpndyhwectwwcjmbtxchxyqqllxflyxlljlssnwdbzcmyjclwswdczpchqekcqbwlcgydblqppqzqfnqdjhymmcxtxd" + 100 | "rmzwrhxcjzylqxdyynhyyhrslnrsywwjjymtltllgtqcjzyabtckzcjyccqlysqxalmzynywlwdnzxqdllqshgpjfjljnjabcqzd" + 101 | "jgthhsstnyjfbswzlxjxrhgldlzrlzqzgsllllzlymxxgdzhgbdphzpbrlwnjqbpfdwonnnhlypcnjccndmbcpbzzncyqxldomzb" + 102 | "lzwpdwyygdstthcsqsccrsssyslfybnntyjszdfndpdhtqzmbqlxlcmyffgtjjqwftmnpjwdnlbzcmmcngbdzlqlpnfhyymjylsd" + 103 | "chdcjwjcctljcldtljjcbddpndsszycndbjlggjzxsxnlycybjjxxcbylzcfzppgkcxqdzfztjjfjdjxzbnzyjqctyjwhdyczhym" + 104 | "djxttmpxsplzcdwslshxypzgtfmlcjtacbbmgdewycyzxdszjyhflystygwhkjyylsjcxgywjcbllcsnddbtzbsclyzczzssqdll" + 105 | "mjyyhfllqllxfdyhabxggnywyypllsdldllbjcyxjznlhljdxyyqytdlllbngpfdfbbqbzzmdpjhgclgmjjpgaehhbwcqxajhhhz" + 106 | "chxyphjaxhlphjpgpzjqcqzgjjzzgzdmqyybzzphyhybwhazyjhykfgdpfqsdlzmljxjpgalxzdaglmdgxmmzqwtxdxxpfdmmssy" + 107 | "mpfmdmmkxksyzyshdzkjsysmmzzzmdydyzzczxbmlstmdyemxckjmztyymzmzzmsshhdccjewxxkljsthwlsqlyjzllsjssdppmh" + 108 | "nlgjczyhmxxhgncjmdhxtkgrmxfwmckmwkdcksxqmmmszzydkmsclcmpcjmhrpxqpzdsslcxkyxtwlkjyahzjgzjwcjnxyhmmbml" + 109 | "gjxmhlmlgmxctkzmjlyscjsyszhsyjzjcdajzhbsdqjzgwtkqxfkdmsdjlfmnhkzqkjfeypzyszcdpynffmzqykttdzzefmzlbnp" + 110 | "plplpbpszalltnlkckqzkgenjlwalkxydpxnhsxqnwqnkxqclhyxxmlnccwlymqyckynnlcjnszkpyzkcqzqljbdmdjhlasqlbyd" + 111 | "wqlwdgbqcryddztjybkbwszdxdtnpjdtcnqnfxqqmgnseclstbhpwslctxxlpwydzklnqgzcqapllkqcylbqmqczqcnjslqzdjxl" + 112 | "ddhpzqdljjxzqdjyzhhzlkcjqdwjppypqakjyrmpzbnmcxkllzllfqpylllmbsglzysslrsysqtmxyxzqzbscnysyztffmzzsmzq" + 113 | "hzssccmlyxwtpzgxzjgzgsjzgkddhtqggzllbjdzlsbzhyxyzhzfywxytymsdnzzyjgtcmtnxqyxjscxhslnndlrytzlryylxqht" + 114 | "xsrtzcgyxbnqqzfhykmzjbzymkbpnlyzpblmcnqyzzzsjztjctzhhyzzjrdyzhnfxklfzslkgjtctssyllgzrzbbjzzklpkbczys" + 115 | "nnyxbjfbnjzzxcdwlzyjxzzdjjgggrsnjkmsmzjlsjywqsnyhqjsxpjztnlsnshrnynjtwchglbnrjlzxwjqxqkysjycztlqzybb" + 116 | "ybyzjqdwgyzcytjcjxckcwdkkzxsnkdnywwyyjqyytlytdjlxwkcjnklccpzcqqdzzqlcsfqchqqgssmjzzllbjjzysjhtsjdysj" + 117 | "qjpdszcdchjkjzzlpycgmzndjxbsjzzsyzyhgxcpbjydssxdzncglqmbtsfcbfdzdlznfgfjgfsmpnjqlnblgqcyyxbqgdjjqsrf" + 118 | "kztjdhczklbsdzcfytplljgjhtxzcsszzxstjygkgckgynqxjplzbbbgcgyjzgczqszlbjlsjfzgkqqjcgycjbzqtldxrjnbsxxp" + 119 | "zshszycfwdsjjhxmfczpfzhqhqmqnknlyhtycgfrzgnqxcgpdlbzcsczqlljblhbdcypscppdymzzxgyhckcpzjgslzlnscnsldl" + 120 | "xbmsdlddfjmkdqdhslzxlsznpqpgjdlybdskgqlbzlnlkyyhzttmcjnqtzzfszqktlljtyyllnllqyzqlbdzlslyyzxmdfszsnxl" + 121 | "xznczqnbbwskrfbcylctnblgjpmczzlstlxshtzcyzlzbnfmqnlxflcjlyljqcbclzjgnsstbrmhxzhjzclxfnbgxgtqncztmsfz" + 122 | "kjmssncljkbhszjntnlzdntlmmjxgzjyjczxyhyhwrwwqnztnfjscpyshzjfyrdjsfscjzbjfzqzchzlxfxsbzqlzsgyftzdcszx" + 123 | "zjbjpszkjrhxjzcgbjkhcggtxkjqglxbxfgtrtylxqxhdtsjxhjzjjcmzlcqsbtxwqgxtxxhxftsdkfjhzyjfjxnzldlllcqsqqz" + 124 | "qwqxswqtwgwbzcgcllqzbclmqjtzgzyzxljfrmyzflxnsnxxjkxrmjdzdmmyxbsqbhgzmwfwygmjlzbyytgzyccdjyzxsngnyjyz" + 125 | "nbgpzjcqsyxsxrtfyzgrhztxszzthcbfclsyxzlzqmzlmplmxzjssfsbysmzqhxxnxrxhqzzzsslyflczjrcrxhhzxqndshxsjjh" + 126 | "qcjjbcynsysxjbqjpxzqplmlxzkyxlxcnlcycxxzzlxdlllmjyhzxhyjwkjrwyhcpsgnrzlfzwfzznsxgxflzsxzzzbfcsyjdbrj" + 127 | "krdhhjxjljjtgxjxxstjtjxlyxqfcsgswmsbctlqzzwlzzkxjmltmjyhsddbxgzhdlbmyjfrzfcgclyjbpmlysmsxlszjqqhjzfx" + 128 | "gfqfqbphngyyqxgztnqwyltlgwgwwhnlfmfgzjmgmgbgtjflyzzgzyzaflsspmlbflcwbjztljjmzlpjjlymqtmyyyfbgygqzgly" + 129 | "zdxqyxrqqqhsxyyqxygjtyxfsfsllgnqcygycwfhcccfxpylypllzqxxxxxqqhhsshjzcftsczjxspzwhhhhhapylqnlpqafyhxd" + 130 | "ylnkmzqgggddesrenzltzgchyppcsqjjhclljtolnjpzljlhymhezdydsqycddhgznndzclzywllznteydgnlhslpjjbdgwxpcnn" + 131 | "tycklkclwkllcasstknzdnnjttlyyzssysszzryljqkcgdhhyrxrzydgrgcwcgzqffbppjfzynakrgywyjpqxxfkjtszzxswzddf" + 132 | "bbqtbgtzkznpzfpzxzpjszbmqhkyyxyldkljnypkyghgdzjxxeaxpnznctzcmxcxmmjxnkszqnmnlwbwwqjjyhclstmcsxnjcxxt" + 133 | "pcnfdtnnpglllzcjlspblpgjcdtnjjlyarscffjfqwdpgzdwmrzzcgodaxnssnyzrestyjwjyjdbcfxnmwttbqlwstszgybljpxg" + 134 | "lbnclgpcbjftmxzljylzxcltpnclcgxtfzjshcrxsfysgdkntlbyjcyjllstgqcbxnhzxbxklylhzlqzlnzcqwgzlgzjncjgcmnz" + 135 | "zgjdzxtzjxycyycxxjyyxjjxsssjstsstdppghtcsxwzdcsynptfbchfbblzjclzzdbxgcjlhpxnfzflsyltnwbmnjhszbmdnbcy" + 136 | "sccldnycndqlyjjhmqllcsgljjsyfpyyccyltjantjjpwycmmgqyysxdxqmzhszxbftwwzqswqrfkjlzjqqyfbrxjhhfwjgzyqac" + 137 | "myfrhcyybynwlpexcczsyyrlttdmqlrkmpbgmyyjprkznbbsqyxbhyzdjdnghpmfsgbwfzmfqmmbzmzdcgjlnnnxyqgmlrygqccy" + 138 | "xzlwdkcjcggmcjjfyzzjhycfrrcmtznzxhkqgdjxccjeascrjthpljlrzdjrbcqhjdnrhylyqjsymhzydwcdfryhbbydtssccwbx" + 139 | "glpzmlzjdqsscfjmmxjcxjytycghycjwynsxlfemwjnmkllswtxhyyyncmmcyjdqdjzglljwjnkhpzggflccsczmcbltbhbqjxqd" + 140 | "jpdjztghglfjawbzyzjltstdhjhctcbchflqmpwdshyytqwcnntjtlnnmnndyyyxsqkxwyyflxxnzwcxypmaelyhgjwzzjbrxxaq" + 141 | "jfllpfhhhytzzxsgqjmhspgdzqwbwpjhzjdyjcqwxkthxsqlzyymysdzgnqckknjlwpnsyscsyzlnmhqsyljxbcxtlhzqzpcycyk" + 142 | "pppnsxfyzjjrcemhszmnxlxglrwgcstlrsxbygbzgnxcnlnjlclynymdxwtzpalcxpqjcjwtcyyjlblxbzlqmyljbghdslssdmxm" + 143 | "bdczsxyhamlczcpjmcnhjyjnsykchskqmczqdllkablwjqsfmocdxjrrlyqchjmybyqlrhetfjzfrfksryxfjdwtsxxywsqjysly" + 144 | "xwjhsdlxyyxhbhawhwjcxlmyljcsqlkydttxbzslfdxgxsjkhsxxybssxdpwncmrptqzczenygcxqfjxkjbdmljzmqqxnoxslyxx" + 145 | "lylljdzptymhbfsttqqwlhsgynlzzalzxclhtwrrqhlstmypyxjjxmnsjnnbryxyjllyqyltwylqyfmlkljdnlltfzwkzhljmlhl" + 146 | "jnljnnlqxylmbhhlnlzxqchxcfxxlhyhjjgbyzzkbxscqdjqdsndzsygzhhmgsxcsymxfepcqwwrbpyyjqryqcyjhqqzyhmwffhg" + 147 | "zfrjfcdbxntqyzpcyhhjlfrzgpbxzdbbgrqstlgdgylcqmgchhmfywlzyxkjlypjhsywmqqggzmnzjnsqxlqsyjtcbehsxfszfxz" + 148 | "wfllbcyyjdytdthwzsfjmqqyjlmqsxlldttkghybfpwdyysqqrnqwlgwdebzwcyygcnlkjxtmxmyjsxhybrwfymwfrxyymxysctz" + 149 | "ztfykmldhqdlgyjnlcryjtlpsxxxywlsbrrjwxhqybhtydnhhxmmywytycnnmnssccdalwztcpqpyjllqzyjswjwzzmmglmxclmx" + 150 | "nzmxmzsqtzppjqblpgxjzhfljjhycjsrxwcxsncdlxsyjdcqzxslqyclzxlzzxmxqrjmhrhzjbhmfljlmlclqnldxzlllfyprgjy" + 151 | "nxcqqdcmqjzzxhnpnxzmemmsxykynlxsxtljxyhwdcwdzhqyybgybcyscfgfsjnzdrzzxqxrzrqjjymcanhrjtldbpyzbstjhxxz" + 152 | "ypbdwfgzzrpymnnkxcqbyxnbnfyckrjjcmjegrzgyclnnzdnkknsjkcljspgyyclqqjybzssqlllkjftbgtylcccdblsppfylgyd" + 153 | "tzjqjzgkntsfcxbdkdxxhybbfytyhbclnnytgdhryrnjsbtcsnyjqhklllzslydxxwbcjqsbxnpjzjzjdzfbxxbrmladhcsnclbj" + 154 | "dstblprznswsbxbcllxxlzdnzsjpynyxxyftnnfbhjjjgbygjpmmmmsszljmtlyzjxswxtyledqpjmpgqzjgdjlqjwjqllsdgjgy" + 155 | "gmscljjxdtygjqjjjcjzcjgdzdshqgzjggcjhqxsnjlzzbxhsgzxcxyljxyxyydfqqjhjfxdhctxjyrxysqtjxyefyyssyxjxncy" + 156 | "zxfxcsxszxyyschshxzzzgzzzgfjdldylnpzgsjaztyqzpbxcbdztzczyxxyhhscjshcggqhjhgxhsctmzmehyxgebtclzkkwytj" + 157 | "zrslekestdbcyhqqsayxcjxwwgsphjszsdncsjkqcxswxfctynydpccczjqtcwjqjzzzqzljzhlsbhpydxpsxshhezdxfptjqyzc" + 158 | "xhyaxncfzyyhxgnqmywntzsjbnhhgymxmxqcnssbcqsjyxxtyyhybcqlmmszmjzzllcogxzaajzyhjmchhcxzsxsdznleyjjzjbh" + 159 | "zwjzsqtzpsxzzdsqjjjlnyazphhyysrnqzthzhnyjyjhdzxzlswclybzyecwcycrylchzhzydzydyjdfrjjhtrsqtxyxjrjhojyn" + 160 | "xelxsfsfjzghpzsxzszdzcqzbyyklsgsjhczshdgqgxyzgxchxzjwyqwgyhksseqzzndzfkwyssdclzstsymcdhjxxyweyxczayd" + 161 | "mpxmdsxybsqmjmzjmtjqlpjyqzcgqhyjhhhqxhlhdldjqcfdwbsxfzzyyschtytyjbhecxhjkgqfxbhyzjfxhwhbdzfyzbchpnpg" + 162 | "dydmsxhkhhmamlnbyjtmpxejmcthqbzyfcgtyhwphftgzzezsbzegpbmdskftycmhbllhgpzjxzjgzjyxzsbbqsczzlzscstpgxm" + 163 | "jsfdcczjzdjxsybzlfcjsazfgszlwbczzzbyztzynswyjgxzbdsynxlgzbzfygczxbzhzftpbgzgejbstgkdmfhyzzjhzllzzgjq" + 164 | "zlsfdjsscbzgpdlfzfzszyzyzsygcxsnxxchczxtzzljfzgqsqqxcjqccccdjcdszzyqjccgxztdlgscxzsyjjqtcclqdqztqchq" + 165 | "qyzynzzzpbkhdjfcjfztypqyqttynlmbdktjcpqzjdzfpjsbnjlgyjdxjdcqkzgqkxclbzjtcjdqbxdjjjstcxnxbxqmslyjcxnt" + 166 | "jqwwcjjnjjlllhjcwqtbzqqczczpzzdzyddcyzdzccjgtjfzdprntctjdcxtqzdtjnplzbcllctdsxkjzqdmzlbznbtjdcxfczdb" + 167 | "czjjltqqpldckztbbzjcqdcjwynllzlzccdwllxwzlxrxntqjczxkjlsgdnqtddglnlajjtnnynkqlldzntdnycygjwyxdxfrsqs" + 168 | "tcdenqmrrqzhhqhdldazfkapbggpzrebzzykyqspeqjjglkqzzzjlysyhyzwfqznlzzlzhwcgkypqgnpgblplrrjyxcccgyhsfzf" + 169 | "wbzywtgzxyljczwhncjzplfflgskhyjdeyxhlpllllcygxdrzelrhgklzzyhzlyqszzjzqljzflnbhgwlczcfjwspyxzlzlxgccp" + 170 | "zbllcxbbbbnbbcbbcrnnzccnrbbnnldcgqyyqxygmqzwnzytyjhyfwtehznjywlccntzyjjcdedpwdztstnjhtymbjnyjzlxtsst" + 171 | "phndjxxbyxqtzqddtjtdyztgwscszqflshlnzbcjbhdlyzjyckwtydylbnydsdsycctyszyyebgexhqddwnygyclxtdcystqnygz" + 172 | "ascsszzdzlcclzrqxyywljsbymxshzdembbllyyllytdqyshymrqnkfkbfxnnsbychxbwjyhtqbpbsbwdzylkgzskyghqzjxhxjx" + 173 | "gnljkzlyycdxlfwfghljgjybxblybxqpqgntzplncybxdjyqydymrbeyjyyhkxxstmxrczzjwxyhybmcflyzhqyzfwxdbxbcwzms" + 174 | "lpdmyckfmzklzcyqycclhxfzlydqzpzygyjyzmdxtzfnnyttqtzhgsfcdmlccytzxjcytjmkslpzhysnwllytpzctzccktxdhxxt" + 175 | "qcyfksmqccyyazhtjplylzlyjbjxtfnyljyynrxcylmmnxjsmybcsysslzylljjgyldzdlqhfzzblfndsqkczfyhhgqmjdsxyctt" + 176 | "xnqnjpyybfcjtyyfbnxejdgyqbjrcnfyyqpghyjsyzngrhtknlnndzntsmgklbygbpyszbydjzsstjztsxzbhbscsbzczptqfzlq" + 177 | "flypybbjgszmnxdjmtsyskkbjtxhjcegbsmjyjzcstmljyxrczqscxxqpyzhmkyxxxjcljyrmyygadyskqlnadhrskqxzxztcggz" + 178 | "dlmlwxybwsyctbhjhcfcwzsxwwtgzlxqshnyczjxemplsrcgltnzntlzjcyjgdtclglbllqpjmzpapxyzlaktkdwczzbncctdqqz" + 179 | "qyjgmcdxltgcszlmlhbglkznnwzndxnhlnmkydlgxdtwcfrjerctzhydxykxhwfzcqshknmqqhzhhymjdjskhxzjzbzzxympajnm" + 180 | "ctbxlsxlzynwrtsqgscbptbsgzwyhtlkssswhzzlyytnxjgmjrnsnnnnlskztxgxlsammlbwldqhylakqcqctmycfjbslxclzjcl" + 181 | "xxknbnnzlhjphqplsxsckslnhpsfqcytxjjzljldtzjjzdlydjntptnndskjfsljhylzqqzlbthydgdjfdbyadxdzhzjnthqbykn" + 182 | "xjjqczmlljzkspldsclbblnnlelxjlbjycxjxgcnlcqplzlznjtsljgyzdzpltqcssfdmnycxgbtjdcznbgbqyqjwgkfhtnbyqzq" + 183 | "gbkpbbyzmtjdytblsqmbsxtbnpdxklemyycjynzdtldykzzxtdxhqshygmzsjycctayrzlpwltlkxslzcggexclfxlkjrtlqjaqz" + 184 | "ncmbqdkkcxglczjzxjhptdjjmzqykqsecqzdshhadmlzfmmzbgntjnnlhbyjbrbtmlbyjdzxlcjlpldlpcqdhlhzlycblcxccjad" + 185 | "qlmzmmsshmybhbnkkbhrsxxjmxmdznnpklbbrhgghfchgmnklltsyyycqlcskymyehywxnxqywbawykqldnntndkhqcgdqktgpkx" + 186 | "hcpdhtwnmssyhbwcrwxhjmkmzngwtmlkfghkjyldyycxwhyyclqhkqhtdqkhffldxqwytyydesbpkyrzpjfyyzjceqdzzdlattpb" + 187 | "fjllcxdlmjsdxegwgsjqxcfbssszpdyzcxznyxppzydlyjccpltxlnxyzyrscyyytylwwndsahjsygyhgywwaxtjzdaxysrltdps" + 188 | "syxfnejdxyzhlxlllzhzsjnyqyqyxyjghzgjcyjchzlycdshhsgczyjscllnxzjjyyxnfsmwfpyllyllabmddhwzxjmcxztzpmlq" + 189 | "chsfwzynctlndywlslxhymmylmbwwkyxyaddxylldjpybpwnxjmmmllhafdllaflbnhhbqqjqzjcqjjdjtffkmmmpythygdrjrdd" + 190 | "wrqjxnbysrmzdbyytbjhpymyjtjxaahggdqtmystqxkbtzbkjlxrbyqqhxmjjbdjntgtbxpgbktlgqxjjjcdhxqdwjlwrfmjgwqh" + 191 | "cnrxswgbtgygbwhswdwrfhwytjjxxxjyzyslphyypyyxhydqpxshxyxgskqhywbdddpplcjlhqeewjgsyykdpplfjthkjltcyjhh" + 192 | "jttpltzzcdlyhqkcjqysteeyhkyzyxxyysddjkllpymqyhqgxqhzrhbxpllnqydqhxsxxwgdqbshyllpjjjthyjkyphthyyktyez" + 193 | "yenmdshlzrpqfbnfxzbsftlgxsjbswyysksflxlpplbbblnsfbfyzbsjssylpbbffffsscjdstjsxtryjcyffsyzyzbjtlctsbsd" + 194 | "hrtjjbytcxyyeylycbnebjdsysyhgsjzbxbytfzwgenhhhthjhhxfwgcstbgxklstyymtmbyxjskzscdyjrcythxzfhmymcxlzns" + 195 | "djtxtxrycfyjsbsdyerxhljxbbdeynjghxgckgscymblxjmsznskgxfbnbbthfjyafxwxfbxmyfhdttcxzzpxrsywzdlybbktyqw" + 196 | "qjbzypzjznjpzjlztfysbttslmptzrtdxqsjehbnylndxljsqmlhtxtjecxalzzspktlzkqqyfsyjywpcpqfhjhytqxzkrsgtksq" + 197 | "czlptxcdyyzsslzslxlzmacpcqbzyxhbsxlzdltztjtylzjyytbzypltxjsjxhlbmytxcqrblzssfjzztnjytxmyjhlhpblcyxqj" + 198 | "qqkzzscpzkswalqsplczzjsxgwwwygyatjbbctdkhqhkgtgpbkqyslbxbbckbmllndzstbklggqkqlzbkktfxrmdkbftpzfrtppm" + 199 | "ferqnxgjpzsstlbztpszqzsjdhljqlzbpmsmmsxlqqnhknblrddnhxdkddjcyyljfqgzlgsygmjqjkhbpmxyxlytqwlwjcpbmjxc" + 200 | "yzydrjbhtdjyeqshtmgsfyplwhlzffnynnhxqhpltbqpfbjwjdbygpnxtbfzjgnnntjshxeawtzylltyqbwjpgxghnnkndjtmszs" + 201 | "qynzggnwqtfhclssgmnnnnynzqqxncjdqgzdlfnykljcjllzlmzznnnnsshthxjlzjbbhqjwwycrdhlyqqjbeyfsjhthnrnwjhwp" + 202 | "slmssgzttygrqqwrnlalhmjtqjsmxqbjjzjqzyzkxbjqxbjxshzssfglxmxnxfghkzszggslcnnarjxhnlllmzxelglxydjytlfb" + 203 | "kbpnlyzfbbhptgjkwetzhkjjxzxxglljlstgshjjyqlqzfkcgnndjsszfdbctwwseqfhqjbsaqtgypjlbxbmmywxgslzhglsgnyf" + 204 | "ljbyfdjfngsfmbyzhqffwjsyfyjjphzbyyzffwotjnlmftwlbzgyzqxcdjygzyyryzynyzwegazyhjjlzrthlrmgrjxzclnnnljj" + 205 | "yhtbwjybxxbxjjtjteekhwslnnlbsfazpqqbdlqjjtyyqlyzkdksqjnejzldqcgjqnnjsncmrfqthtejmfctyhypymhydmjncfgy" + 206 | "yxwshctxrljgjzhzcyyyjltkttntmjlzclzzayyoczlrlbszywjytsjyhbyshfjlykjxxtmzyyltxxypslqyjzyzyypnhmymdyyl" + 207 | "blhlsyygqllnjjymsoycbzgdlyxylcqyxtszegxhzglhwbljheyxtwqmakbpqcgyshhegqcmwyywljyjhyyzlljjylhzyhmgsljl" + 208 | "jxcjjyclycjbcpzjzjmmwlcjlnqljjjlxyjmlszljqlycmmgcfmmfpqqmfxlqmcffqmmmmhnznfhhjgtthxkhslnchhyqzxtmmqd" + 209 | "cydyxyqmyqylddcyaytazdcymdydlzfffmmycqcwzzmabtbyctdmndzggdftypcgqyttssffwbdttqssystwnjhjytsxxylbyyhh" + 210 | "whxgzxwznnqzjzjjqjccchykxbzszcnjtllcqxynjnckycynccqnxyewyczdcjycchyjlbtzyycqwlpgpyllgktltlgkgqbgychj" + 211 | "xy"; 212 | const start=0x4e00; 213 | const end=0x9fa5; 214 | var result=""; 215 | var code; 216 | for(var i=0;i=start&&code<=end)result+=pyt[code-start];else result+=str[i]; 219 | } 220 | return result; 221 | } 222 | 223 | module.exports = getPinyin; 224 | -------------------------------------------------------------------------------- /src/js/store/ArchiveStore.js: -------------------------------------------------------------------------------- 1 | var _assign = require('lodash/assign'), 2 | _isEmpty = require('lodash/isEmpty'), 3 | qwest = require('qwest'), 4 | EventEmitter = require('events').EventEmitter, 5 | config = require('../config'); 6 | 7 | var now = new Date(); 8 | 9 | var _archive = {}; 10 | 11 | var ArchiveStore = _assign({}, EventEmitter.prototype, { 12 | getArchive: function(year, month){ 13 | if(_isEmpty(_archive)){ 14 | this.init(); 15 | } 16 | 17 | if(!(year in _archive)){ 18 | console.log('missing year ' + year); 19 | return ''; 20 | }else if(!(month in _archive[year])){ 21 | console.log('missing month ' + month + ' in year ' + year); 22 | return ''; 23 | }else{ 24 | return _archive[year][month]; 25 | } 26 | }, 27 | getArchiveData: function(){ 28 | if(_isEmpty(_archive)){ 29 | this.init(); 30 | } 31 | 32 | return _archive; 33 | }, 34 | init: function(){ 35 | qwest.get(config.archiveUrl || 'json/archive.json') 36 | .then(function(response){ 37 | _archive = response.data; 38 | this.emitInit(); 39 | }.bind(this)); 40 | }, 41 | addInitListener: function(callback){ 42 | this.on('init', callback); 43 | }, 44 | clearInitListener: function(callback){ 45 | this.removeAllListeners('init'); 46 | }, 47 | emitInit: function(){ 48 | this.emit('init'); 49 | } 50 | }); 51 | 52 | module.exports = ArchiveStore; 53 | -------------------------------------------------------------------------------- /src/js/store/BgmConfigStore.js: -------------------------------------------------------------------------------- 1 | var Dispacher = require('../dispatcher/Dispatcher'), 2 | _isEmpty = require('lodash/isEmpty'), 3 | _assign = require('lodash/assign'), 4 | _isObject = require('lodash/isObject'), 5 | Utils = require('../mod/Utils'), 6 | EventEmitter = require('events').EventEmitter; 7 | 8 | var now = new Date(); 9 | 10 | var _config = {}; 11 | 12 | var STORAGE_NAMESAPCE = 'bgmlist_configs'; 13 | 14 | var DEFAULT = { 15 | newOnly: false, 16 | highlightOnly: false, 17 | noAutoSwitch: false, 18 | disableNewTab: false, 19 | jpTitle: false, 20 | dayDivide: 24, 21 | bangumiDomain: 'bangumi.tv' 22 | }; 23 | 24 | var BgmConfigStore = _assign({}, EventEmitter.prototype, { 25 | reset: function(){ 26 | _config = DEFAULT; 27 | this.saveToStorage(); 28 | console.info('config reseted'); 29 | }, 30 | getConfig: function(name){ 31 | if(_isEmpty(_config) && !this.readFromStorage()){ 32 | this.reset(); 33 | } 34 | 35 | if(typeof name === 'string'){ 36 | return _config[name]; 37 | }else{ 38 | return _config; 39 | } 40 | }, 41 | addChangeListener: function(callback){ 42 | this.on('change', callback); 43 | }, 44 | clearChangeListener: function(){ 45 | this.removeAllListeners('change'); 46 | }, 47 | emitChange: function(){ 48 | this.emit('change'); 49 | }, 50 | update: function(newConfg){ 51 | if(!_isObject(newConfg)){ 52 | console.warn('newConfg format wrong'); 53 | return; 54 | } 55 | _config = _assign({}, _config, newConfg); 56 | }, 57 | readFromStorage: function(){ 58 | var data = Utils.store(STORAGE_NAMESAPCE); 59 | if(!_isEmpty(data)){ 60 | this.update(data); 61 | console.info('config read successed'); 62 | return true; 63 | }else{ 64 | console.info('config read failed'); 65 | return false; 66 | } 67 | }, 68 | saveToStorage: function(){ 69 | Utils.store(STORAGE_NAMESAPCE, _config); 70 | } 71 | }); 72 | 73 | Dispacher.register(function(action){ 74 | var newConfig = null; 75 | switch(action.actionType){ 76 | case 'CONFIG_UPDATE': 77 | newConfig = action.newConfig; 78 | BgmConfigStore.update(newConfig); 79 | BgmConfigStore.emitChange(); 80 | break; 81 | case 'CONFIG_RESET': 82 | BgmConfigStore.reset(); 83 | BgmConfigStore.emitChange(); 84 | break; 85 | case 'CONFIG_SAVE': 86 | BgmConfigStore.saveToStorage(); 87 | break; 88 | 89 | default: 90 | } 91 | }); 92 | 93 | module.exports = BgmConfigStore; 94 | -------------------------------------------------------------------------------- /src/js/store/BgmDataStore.js: -------------------------------------------------------------------------------- 1 | var Dispacher = require('../dispatcher/Dispatcher'), 2 | _isEmpty = require('lodash/isEmpty'), 3 | _assign = require('lodash/assign'), 4 | _isObject = require('lodash/isObject'), 5 | _mergeWith = require('lodash/mergeWith'), 6 | _forIn = require('lodash/forIn'), 7 | Utils = require('../mod/Utils'), 8 | EventEmitter = require('events').EventEmitter; 9 | 10 | var now = new Date(); 11 | 12 | var _data = {}; 13 | 14 | var STORAGE_NAMESAPCE = 'bgmlist_data'; 15 | 16 | var BgmDataStore = _assign({}, EventEmitter.prototype, { 17 | reset: function(){ 18 | if(_isEmpty(_data)){ 19 | console.info('data store is empty'); 20 | return; 21 | }else{ 22 | _data = {}; 23 | this.saveToStorage(); 24 | console.info('data reseted'); 25 | } 26 | }, 27 | getData: function(){ 28 | if(_isEmpty(_data) && !this.readFromStorage()){ 29 | console.info('data store is empty'); 30 | } 31 | 32 | return _data; 33 | }, 34 | saveData: function(data){ 35 | if(!_isObject(data)){ 36 | console.warn('data format wrong'); 37 | return; 38 | } 39 | 40 | if(data.version !== 0 && _data.path === data.path){ 41 | (function() { 42 | var oldItems = {}, id; 43 | _data.version = data.version; 44 | oldItems = _data.items; 45 | _data.items = data.items; 46 | 47 | for (id in _data.items) { 48 | if (id in oldItems) { 49 | _data.items[id].hide = oldItems[id].hide || false; 50 | _data.items[id].highlight = oldItems[id].highlight || false; 51 | } 52 | } 53 | })(); 54 | 55 | console.info('data maerged'); 56 | }else{ 57 | console.info('data replaced'); 58 | _data = data; 59 | } 60 | 61 | 62 | this.saveToStorage(); 63 | }, 64 | importData: function(data) { 65 | if(!_isObject(data)){ 66 | console.warn('data format wrong'); 67 | return; 68 | } 69 | 70 | if(data.version !== 0 && _data.path === data.path){ 71 | var items = data.items; 72 | _data.items = _assign(_data.items, items); 73 | } 74 | this.saveToStorage(); 75 | }, 76 | toggle: function(id, hide){ 77 | if(_isEmpty(_data)){ 78 | console.info('data store is empty'); 79 | return; 80 | } 81 | 82 | _data.items[id].hide = !!hide; 83 | this.saveToStorage(); 84 | }, 85 | toggleAll: function(hide){ 86 | if(_isEmpty(_data)){ 87 | console.info('data store is empty'); 88 | return; 89 | } 90 | 91 | _forIn(_data.items, function(item, id){ 92 | hide = !!hide; 93 | if(hide){ 94 | item.hide = hide; 95 | }else{ 96 | delete item.hide; 97 | } 98 | }); 99 | this.saveToStorage(); 100 | }, 101 | highlight: function(id, highlight){ 102 | if(_isEmpty(_data)){ 103 | console.info('data store is empty'); 104 | return; 105 | } 106 | 107 | _data.items[id].highlight = !!highlight; 108 | this.saveToStorage(); 109 | }, 110 | addChangeListener: function(callback){ 111 | this.on('change', callback); 112 | }, 113 | clearChangeListener: function(){ 114 | this.removeAllListeners('change'); 115 | }, 116 | emitChange: function(){ 117 | this.emit('change'); 118 | }, 119 | readFromStorage: function(){ 120 | var data = Utils.store(STORAGE_NAMESAPCE); 121 | if(!_isEmpty(data)){ 122 | _data = data; 123 | console.info('data read successed'); 124 | return true; 125 | }else{ 126 | console.info('data read failed'); 127 | return false; 128 | } 129 | }, 130 | saveToStorage: function(){ 131 | Utils.store(STORAGE_NAMESAPCE, _data); 132 | } 133 | }); 134 | 135 | Dispacher.register(function(action){ 136 | var newConfig, toggleFlag, id, data; 137 | switch(action.actionType){ 138 | case 'TOGGLE_ITEM': 139 | toggleFlag = action.toggleFlag; 140 | id = action.id; 141 | BgmDataStore.toggle(id, toggleFlag); 142 | BgmDataStore.emitChange(); 143 | break; 144 | case 'HIGHLIGHT_ITEM': 145 | toggleFlag = action.toggleFlag; 146 | id = action.id; 147 | BgmDataStore.highlight(id, toggleFlag); 148 | BgmDataStore.emitChange(); 149 | break; 150 | case 'DATA_RESET': 151 | BgmDataStore.reset(); 152 | BgmDataStore.emitChange(); 153 | break; 154 | case 'DATA_SAVE': 155 | data = action.data; 156 | BgmDataStore.saveData(data); 157 | break; 158 | case 'DATA_IMPORT': 159 | data = action.data; 160 | BgmDataStore.importData(data); 161 | BgmDataStore.emitChange(); 162 | break; 163 | case 'DATA_TOGGLE_ALL': 164 | toggleFlag = action.toggleFlag; 165 | BgmDataStore.toggleAll(toggleFlag); 166 | BgmDataStore.emitChange(); 167 | break; 168 | default: 169 | } 170 | }); 171 | 172 | module.exports = BgmDataStore; 173 | -------------------------------------------------------------------------------- /src/js/store/BgmSitesStore.js: -------------------------------------------------------------------------------- 1 | var Dispacher = require('../dispatcher/Dispatcher'), 2 | _assign = require('lodash/assign'), 3 | _isEmpty = require('lodash/isEmpty'), 4 | _isObject = require('lodash/isObject'), 5 | _forIn = require('lodash/forIn'), 6 | Utils = require('../mod/Utils'), 7 | EventEmitter = require('events').EventEmitter; 8 | 9 | var now = new Date(); 10 | 11 | var _sites = {}; 12 | 13 | var DEFAULT = { 14 | 'acfun' : { name: 'A站', enable: true }, 15 | 'bilibili': { name: 'B站', enable: true }, 16 | 'tucao' : { name: 'C站', enable: true }, 17 | 'sohu' : { name: '搜狐', enable: true }, 18 | 'youku' : { name: '优酷', enable: true }, 19 | 'qq' : { name: '腾讯', enable: true }, 20 | 'iqiyi' : { name: '爱奇艺', enable: true }, 21 | 'letv' : { name: '乐视', enable: true }, 22 | 'pptv' : { name: 'PPTV', enable: true }, 23 | 'tudou' : { name: '土豆', enable: true }, 24 | 'movie' : { name: '迅雷', enable: true }, 25 | 'mgtv' : { name: '芒果', enable: true }, 26 | 'netflix' : { name: '网飞', enable: true }, 27 | 'niconico': { name: 'N站', enable: true }, 28 | 'gamer': { name: '動畫瘋', enable: true }, 29 | 'muse_hk': { name: '木棉花香港', enable: true }, 30 | }; 31 | 32 | var STORAGE_NAMESAPCE = 'bgmlist_sites'; 33 | 34 | var BgmSitesStore = _assign({}, EventEmitter.prototype, { 35 | reset: function(){ 36 | _sites = DEFAULT; 37 | this.saveToStorage(); 38 | console.info('sites reseted'); 39 | }, 40 | getSites: function(domain){ 41 | if(_isEmpty(_sites) && !this.readFromStorage()){ 42 | this.reset(); 43 | } 44 | 45 | if(typeof domain === 'string'){ 46 | return _sites[domain]; 47 | }else{ 48 | return _sites; 49 | } 50 | }, 51 | toggleAll: function(enable){ 52 | _forIn(_sites, function(info, domain){ 53 | info.enable = enable; 54 | }); 55 | }, 56 | addChangeListener: function(callback){ 57 | this.on('change', callback); 58 | }, 59 | clearChangeListener: function(){ 60 | this.removeAllListeners('change'); 61 | }, 62 | emitChange: function(){ 63 | this.emit('change'); 64 | }, 65 | updateSite: function(domain, newConfg){ 66 | _assign(_sites[domain], newConfg); 67 | }, 68 | importSites: function (sites) { 69 | if(!_isObject(sites)){ 70 | console.warn('sites format wrong'); 71 | return; 72 | } 73 | _sites = _assign(_sites, sites); 74 | }, 75 | updateAll: function(sitesConfg){ 76 | _sites = _assign({}, DEFAULT, _sites, sitesConfg); 77 | }, 78 | readFromStorage: function(){ 79 | var data = Utils.store(STORAGE_NAMESAPCE); 80 | if(!_isEmpty(data)){ 81 | this.updateAll(data); 82 | console.info('sites read successed'); 83 | return true; 84 | }else{ 85 | console.info('sites read failed'); 86 | return false; 87 | } 88 | }, 89 | saveToStorage: function(){ 90 | Utils.store(STORAGE_NAMESAPCE, _sites); 91 | } 92 | }); 93 | 94 | Dispacher.register(function(action){ 95 | var newConfig, toggleFlag, domain; 96 | switch(action.actionType){ 97 | case 'TOGGLE_SITE': 98 | toggleFlag = action.toggleFlag; 99 | domain = action.domain; 100 | BgmSitesStore.updateSite(domain, {enable: toggleFlag}); 101 | BgmSitesStore.emitChange(); 102 | break; 103 | case 'SITES_RESET': 104 | BgmSitesStore.reset(); 105 | BgmSitesStore.emitChange(); 106 | break; 107 | case 'SITES_SAVE': 108 | BgmSitesStore.saveToStorage(); 109 | break; 110 | case 'SITES_IMPORT': 111 | BgmSitesStore.importSites(action.sites); 112 | BgmSitesStore.emitChange(); 113 | break; 114 | case 'SITES_TOGGLE_ALL': 115 | toggleFlag = action.toggleFlag; 116 | BgmSitesStore.toggleAll(toggleFlag); 117 | BgmSitesStore.emitChange(); 118 | break; 119 | default: 120 | } 121 | }); 122 | 123 | module.exports = BgmSitesStore; 124 | -------------------------------------------------------------------------------- /src/less/reset.less: -------------------------------------------------------------------------------- 1 | /* reset */ 2 | html, body { 3 | border: 0; 4 | font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; 5 | line-height: 1.5; 6 | margin: 0; 7 | padding: 0; 8 | } 9 | 10 | div, span, object, iframe, img, table, caption, thead, tbody, 11 | tfoot, tr, tr, td, article, aside, canvas, details, figure, hgroup, menu, 12 | nav, footer, header, section, summary, mark, audio, video { 13 | border: 0; 14 | margin: 0; 15 | padding: 0; 16 | } 17 | 18 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, address, cit, code, 19 | del, dfn, em, ins, q, samp, small, strong, sub, sup, b, i, hr, dl, dt, dd, 20 | ol, ul, li, fieldset, legend, label { 21 | border: 0; 22 | font-size: 100%; 23 | vertical-align: baseline; 24 | margin: 0; 25 | padding: 0; 26 | } 27 | 28 | h1, h2, h3, h4, h5, h6 { 29 | font-weight: normal; 30 | } 31 | 32 | article, aside, canvas, figure, figure img, figcaption, hgroup, 33 | footer, header, nav, section, audio, video { 34 | display: block; 35 | } 36 | 37 | table { 38 | border-collapse: separate; 39 | border-spacing: 0; 40 | caption, th, td { 41 | text-align: left; 42 | vertical-align: middle; 43 | } 44 | } 45 | 46 | a { 47 | text-decoration: none; 48 | color: inherit; 49 | } 50 | 51 | a img { 52 | border: 0; 53 | } 54 | 55 | ul, ol { 56 | list-style: none; 57 | } 58 | 59 | :focus { 60 | outline: 0; 61 | } 62 | 63 | input[type="search"] { 64 | -webkit-appearance: none; 65 | } -------------------------------------------------------------------------------- /template.html.example: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 番组放送 18 | {% for (var css in o.htmlWebpackPlugin.files.css) { %} 19 | 20 | {% } %} 21 | 22 | 23 |
    24 | {% for (var chunk in o.htmlWebpackPlugin.files.chunks) { %} 25 | 26 | {% } %} 27 | 28 | 29 | -------------------------------------------------------------------------------- /test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 番组放送 12 | 13 | 14 | 15 |
    16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /tpl/index0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 番组放送 12 | 13 | 14 | 15 |
    16 |
    17 |

    番组放送

    18 | 42 | 53 |
    54 |
    55 |
    56 |
    57 |

    2015年10月番组

    58 | 65 |
    66 |
    67 |
    68 |
    69 |
    70 |
    71 | 设置 72 |
    73 |
    74 |
    75 |
    76 | 作品名 77 |
    78 |
    79 | 日本放送时间 80 |
    81 |
    82 | 大陆放送时间放送时间 83 |
    84 |
    85 | 放送站点 86 |
    87 |
    88 |
    89 |
    90 |
    91 |
    92 |
      93 |
    1. 周一
    2. 94 |
    3. 周二
    4. 95 |
    5. 周三
    6. 96 |
    7. 周四
    8. 97 |
    9. 周五
    10. 98 |
    11. 周六
    12. 99 |
    13. 周日
    14. 100 |
    15. 全部
    16. 101 |
    17. 单次1
    18. 102 |
    103 |
    104 |
    105 | 274 |
    275 |
    276 |
    277 |
    278 |
    279 |

    显示设置

    280 |
    281 |
      282 |
    • 283 | 284 |
    • 285 |
    • 286 | 287 |
    • 288 |
    • 289 | 290 |
      291 | 减小 292 | 293 | 增大 294 |
      295 |
    • 296 |
    297 |
    298 |
    299 |
    300 |

    站点过滤

    301 | 全选 302 |
    303 |
      304 |
    • 305 | 306 |
    • 307 |
    • 308 | 309 |
    • 310 |
    311 |
    312 |
    313 |
    314 | 315 | 316 |
    317 |
    318 |
    319 |
    320 | 321 |
    322 | 325 | 326 | 327 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | var webpack = require('webpack'); 2 | var HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | var ExtractTextPlugin = require("extract-text-webpack-plugin"); 4 | var path = require('path'); 5 | 6 | var isProduction = process.env.NODE_ENV === 'production'; 7 | 8 | module.exports = { 9 | entry: { 10 | vendor: ['react', 'flux', 'qwest', 'lodash'], 11 | app: isProduction ? './src/js/main.js' : [ 12 | 'webpack-dev-server/client?http://localhost:8090', 13 | 'webpack/hot/dev-server', 14 | './src/js/main.js' 15 | ] 16 | }, 17 | output: { 18 | path: './build/js', 19 | filename: isProduction ? 'main.[chunkhash].js': 'main.js', 20 | sourceMapFilename: '[file].map', 21 | publicPath: isProduction ? 'dist/js/' : 'http://localhost:8090/assets/' 22 | }, 23 | module: { 24 | loaders: [ 25 | { 26 | test: /\.js$/, 27 | loader: 'react-hot!babel!jsx', 28 | include: path.join(__dirname, 'src') 29 | }, 30 | { 31 | test: /\.less$/, 32 | // loader: 'style!css!less' 33 | loader: ExtractTextPlugin.extract("style", "css!less") 34 | }, 35 | { 36 | test: /\.(png|jpg)$/, 37 | loader: 'url' 38 | } 39 | ] 40 | }, 41 | resolve: { 42 | extensions: ['', '.js', '.less'] 43 | }, 44 | devtool: 'source-map', 45 | plugins: (function(){ 46 | return isProduction ? [ 47 | new webpack.DefinePlugin({ 48 | 'process.env': { 49 | 'NODE_ENV': '"production"' 50 | } 51 | }), 52 | new HtmlWebpackPlugin({ 53 | template: 'template.html', 54 | inject: false, 55 | filename: '../../index.html' 56 | }), 57 | new webpack.optimize.CommonsChunkPlugin({ 58 | name: 'vendor', 59 | filename: 'vendor.[chunkhash].js' 60 | }), 61 | new webpack.optimize.UglifyJsPlugin({ 62 | compress: { 63 | warnings: false 64 | }, 65 | output: { 66 | comments: false 67 | } 68 | }), 69 | new ExtractTextPlugin('../css/styles.[chunkhash].css'), 70 | new webpack.NoErrorsPlugin(), 71 | new webpack.optimize.OccurenceOrderPlugin() 72 | ] : [ 73 | new webpack.optimize.CommonsChunkPlugin({ 74 | name: 'vendor', 75 | filename: 'vendor.js' 76 | }), 77 | new ExtractTextPlugin('styles.css') 78 | ]; 79 | })() 80 | }; 81 | --------------------------------------------------------------------------------