text: // import '../../polyfill/array.find'
  
  import { httpFetch } from '../../request'
  import { formatPlayTime, decodeName } from '../../index'
  // import { debug } from '../../utils/env'
  import { formatSinger } from './util'
  
  export default {
    regExps: {
      mInfo: /bitrate:(\d+),format:(\w+),size:([\w.]+)/,
    },
    _musicSearchRequestObj: null,
    limit: 30,
    total: 0,
    page: 0,
    allPage: 1,
    // cancelFn: null,
    musicSearch(str, page, limit) {
      if (this._musicSearchRequestObj) this._musicSearchRequestObj.cancelHttp()
      this._musicSearchRequestObj = httpFetch(`http://search.kuwo.cn/r.s?client=kt&all=${encodeURIComponent(str)}&pn=${page - 1}&rn=${limit}&uid=794762570&ver=kwplayer_ar_9.2.2.1&vipver=1&show_copyright_off=1&newver=1&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&vermerge=1&mobi=1&issubtitle=1`)
      return this._musicSearchRequestObj.promise
    },
    // getImg(songId) {
    //   return httpGet(`http://player.kuwo.cn/webmusic/sj/dtflagdate?flag=6&rid=MUSIC_${songId}`)
    // },
    // getLrc(songId) {
    //   return httpGet(`http://mobile.kuwo.cn/mpage/html5/songinfoandlrc?mid=${songId}&flag=0`)
    // },
    handleResult(rawData) {
      const result = []
      if (!rawData) return result
      for (let i = 0; i < rawData.length; i++) {
        const info = rawData[i]
        let songId = info.MUSICRID.replace('MUSIC_', '')
        // const format = (info.FORMATS || info.formats).split('|')
  
        if (!info.MINFO) {
          console.log('mInfo is undefined')
          return null
        }
  
        const types = []
        const _types = {}
  
        let infoArr = info.MINFO.split(';')
        infoArr.forEach(info => {
          info = info.match(this.regExps.mInfo)
          if (info) {
            switch (info[2]) {
              case 'flac':
                types.push({ type: 'flac', size: info[3] })
                _types.flac = {
                  size: info[3].toLocaleUpperCase(),
                }
                break
              // case 'ape':
              //   types.push({ type: 'ape', size: info[3] })
              //   _types.ape = {
              //     size: info[3].toLocaleUpperCase(),
              //   }
              //   break
              case 'mp3':
                switch (info[1]) {
                  case '320':
                    types.push({ type: '320k', size: info[3] })
                    _types['320k'] = {
                      size: info[3].toLocaleUpperCase(),
                    }
                    break
                  case '192':
                  //   types.push({ type: '192k', size: info[3] })
                  //   _types['192k'] = {
                  //     size: info[3].toLocaleUpperCase(),
                  //   }
                  //   break
                  case '128':
                    types.push({ type: '128k', size: info[3] })
                    _types['128k'] = {
                      size: info[3].toLocaleUpperCase(),
                    }
                    break
                }
                break
            }
          }
        })
        types.reverse()
  
        let interval = parseInt(info.DURATION)
  
        result.push({
          name: decodeName(info.SONGNAME),
          singer: formatSinger(decodeName(info.ARTIST)),
          source: 'kw',
          // img = (info.album.name === '' || info.album.name === '空')
          //   ? `http://player.kuwo.cn/webmusic/sj/dtflagdate?flag=6&rid=MUSIC_160911.jpg`
          //   : `https://y.gtimg.cn/music/photo_new/T002R500x500M000${info.album.mid}.jpg`
          songmid: songId,
          albumId: decodeName(info.ALBUMID || ''),
          interval: Number.isNaN(interval) ? 0 : formatPlayTime(interval),
          albumName: info.ALBUM ? decodeName(info.ALBUM) : '',
          lrc: null,
          img: null,
          otherSource: null,
          types,
          _types,
          typeUrl: {},
        })
      }
      return result
    },
    search(str, page = 1, { limit } = {}, retryNum = 0) {
      if (retryNum > 2) return Promise.reject(new Error('try max num'))
      if (limit == null) limit = this.limit
      // http://newlyric.kuwo.cn/newlyric.lrc?62355680
      return this.musicSearch(str, page, limit).then(({ body: result }) => {
        // console.log(result)
        if (!result || (result.TOTAL !== '0' && result.SHOW === '0')) return this.search(str, page, { limit }, ++retryNum)
        let list = this.handleResult(result.abslist)
  
        if (list == null) return this.search(str, page, { limit })
  
        this.total = parseInt(result.TOTAL)
        this.page = page
        this.allPage = Math.ceil(this.total / limit)
  
        return Promise.resolve({
          list,
          allPage: this.allPage,
          total: this.total,
          limit,
          source: 'kw',
        })
      })
    },
  }
  