A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Use new @tokenizer/http

+45 -75
+1 -1
package.json
··· 20 20 "webpack-cli": "^3.3.10" 21 21 }, 22 22 "dependencies": { 23 - "@tokenizer/http": "^0.5.0", 23 + "@tokenizer/http": "^0.5.1", 24 24 "blockstack": "https://gist.github.com/a888e02d7441aeb2af99263a3add0f73.git", 25 25 "fast-text-encoding": "^1.0.0", 26 26 "file-saver": "^2.0.2",
+35 -65
src/Javascript/processing.js
··· 6 6 7 7 8 8 import * as musicMetadata from "music-metadata-browser" 9 - 10 - import { HttpClient } from "@tokenizer/http/lib/http-client" 11 - import { parseContentRange } from "@tokenizer/range" 12 - import { RangeRequestTokenizer } from "@tokenizer/range/lib/range-request-tokenizer" 9 + import { makeTokenizer } from "@tokenizer/http" 13 10 14 11 import { mimeType } from "./common" 15 12 import { transformUrl } from "./urls" ··· 23 20 24 21 return context.urlsForTags.reduce((accumulator, urls, idx) => { 25 22 return accumulator.then(col => { 26 - let get, head 27 - 28 23 const filename = context 29 24 .receivedFilePaths[idx] 30 25 .split("/") 31 26 .reverse()[0] 32 27 33 - return transformUrl(urls.headUrl) 34 - .then(url => resolveUrl("HEAD", url)) 35 - .then(res => head = res) 28 + return Promise.all([ 29 + transformUrl(urls.headUrl), 30 + transformUrl(urls.getUrl) 36 31 37 - .then(_ => (urls.headUrl === urls.getUrl) && head.mime && head.size 38 - ? head 39 - : transformUrl(urls.getUrl).then(url => resolveUrl("GET", url)) 40 - ) 41 - .then(res => get = res) 32 + ]).then(([headUrl, getUrl]) => { 33 + return getTags(headUrl, getUrl, filename) 42 34 43 - .then(_ => getTags(head, get, filename)) 44 - .then(r => col.concat(r)) 35 + }).then(r => { 36 + return col.concat(r) 45 37 46 - .catch(e => { 47 - console.error(e) 48 - return col.concat(null) 49 - }) 38 + }).catch(e => { 39 + console.error(e) 40 + return col.concat(null) 41 + 42 + }) 50 43 }) 51 44 52 45 }, initialPromise).then(col => { ··· 68 61 ) 69 62 70 63 71 - function getTags(head, get, filename) { 64 + function getTags(headUrl, getUrl, filename) { 72 65 const fileExtMatch = filename.match(/\.(\w+)$/) 73 66 const fileExt = fileExtMatch && fileExtMatch[1] 74 67 75 - // Content type 76 68 const overrideContentType = ( 77 - get.url.includes("googleapis.com") || 78 - get.url.includes("googleusercontent.com") 69 + getUrl.includes("googleapis.com") || 70 + getUrl.includes("googleusercontent.com") 79 71 ) 80 72 81 - const fileMime = overrideContentType 82 - ? mimeType(fileExt) 83 - : get.mime 73 + return makeTokenizer(headUrl) 74 + .then(tokenizer => { 75 + const fileMime = overrideContentType 76 + ? mimeType(fileExt) 77 + : tokenizer.fileInfo.mimeType 84 78 85 - // Tokenizer 86 - const tokenizer = new RangeRequestTokenizer( 87 - new HttpClient(get.url), 88 - Object.assign({}, get, { mimeType: fileMime }), 89 - 1024 90 - ) 79 + tokenizer.fileInfo.mimeType = fileMime 80 + tokenizer.fileInfo.url = getUrl 81 + tokenizer.rangeRequestClient.url = getUrl 82 + tokenizer.rangeRequestClient.resolvedUrl = undefined 91 83 92 - // Get tags 93 - return musicMetadata.parseFromTokenizer( 94 - tokenizer, 95 - parserConfiguration 96 - ) 97 - .then(pickTags) 98 - .catch(err => { 99 - console.error(err) 100 - return fallbackTags(filename) 101 - }) 84 + return musicMetadata.parseFromTokenizer( 85 + tokenizer, 86 + parserConfiguration 87 + ) 88 + }) 89 + .then(pickTags) 90 + .catch(err => { 91 + console.error(err) 92 + return fallbackTags(filename) 93 + }) 102 94 } 103 95 104 96 ··· 133 125 picture: null 134 126 } 135 127 } 136 - 137 - 138 - function resolveUrl(method, url) { 139 - return fetch(url, { 140 - method: method, 141 - headers: method === "HEAD" 142 - ? new Headers() 143 - : new Headers({ "Range": "bytes=0-0" }) 144 - 145 - }).then(resp => { 146 - const length = resp.headers.get("content-length") 147 - const rangeString = resp.headers.get("content-range") 148 - const range = parseContentRange(rangeString) 149 - 150 - return { 151 - contentRange: range, 152 - mimeType: resp.headers.get("content-type"), 153 - size: range ? range.instanceLength : parseInt(length, 10), 154 - url: resp.url 155 - } 156 - }) 157 - }
+9 -9
yarn.lock
··· 31 31 resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" 32 32 integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== 33 33 34 - "@tokenizer/http@^0.5.0": 35 - version "0.5.0" 36 - resolved "https://registry.yarnpkg.com/@tokenizer/http/-/http-0.5.0.tgz#3cb0dea6297cc8c0597de69487d5fed713fba20e" 37 - integrity sha512-RafHGmPhJXfX9dEXZr23a4Fi5JzLn1D/bd89a4Z96KJ4e6zLDPGDHye1bD80bFYM/KmjzTO3Fc4gKMeIW9T7rw== 34 + "@tokenizer/http@^0.5.1": 35 + version "0.5.1" 36 + resolved "https://registry.yarnpkg.com/@tokenizer/http/-/http-0.5.1.tgz#6966ef87b458aa566b37ead3fad47253406d5497" 37 + integrity sha512-CdAFhvgAk1TGm/fbPVv9yPIOAkAABWU9xzmyKruiReQu3wCXeaD1tKDJTpczYRk1weivD11qrBsmDRzWm45e3Q== 38 38 dependencies: 39 - "@tokenizer/range" "^0.2.0" 39 + "@tokenizer/range" "^0.2.1" 40 40 debug "^4.1.1" 41 41 node-fetch "^2.6.0" 42 42 strtok3 "^5.0.0" 43 43 44 - "@tokenizer/range@^0.2.0": 45 - version "0.2.1" 46 - resolved "https://registry.yarnpkg.com/@tokenizer/range/-/range-0.2.1.tgz#f50605c2b42936f296d8fd32569fee5c79ee6bbf" 47 - integrity sha512-guIiNyR/VXFtYbpMbfQj8zVdbwu5MoRjh2YE/NwFeJJwkBOPBw5FhoHmJ7IAv4btHlFeBGtRDiLuuZtYkr12AA== 44 + "@tokenizer/range@^0.2.1": 45 + version "0.2.2" 46 + resolved "https://registry.yarnpkg.com/@tokenizer/range/-/range-0.2.2.tgz#c7698af4ae6ca2efb8b06d88f60555fa99256b97" 47 + integrity sha512-yzJ7oRzs1kMnpDaBFptCiLZL0AJakLr2q2+EoRVZY3Csg9QKPuN5FRlHfpeipHo0tAp5d3OvJG7s+/bXP2Ntzw== 48 48 dependencies: 49 49 debug "^4.1.1" 50 50 strtok3 "^5.0.0"