Skip to content
Snippets Groups Projects
Select Git revision
  • fix-index.html-encoding
  • develop default protected
  • document-loglevel
  • master
  • 1.0.1
  • 1121-download
  • plugins-v3
  • 876-http-signature
  • plugins-v2
  • plugins
  • 1.0.1
  • 1.0
  • 1.0-rc1
  • 0.21.2
  • 0.21.1
  • 0.21
  • 0.21-rc2
  • 0.21-rc1
  • 0.20.1
  • 0.20.0
  • 0.20.0-rc1
  • 0.19.1
  • 0.19.0
  • 0.19.0-rc2
  • 0.19.0-rc1
  • 0.18.3
  • 0.18.2
  • 0.18.1
  • 0.18
  • 0.17
30 results

ArtistImport.vue

Blame
  • Forked from funkwhale / funkwhale
    7866 commits behind the upstream repository.
    ArtistImport.vue 4.27 KiB
    <template>
      <div>
        <h3 class="ui dividing block header">
          <a :href="getMusicbrainzUrl('artist', metadata.id)" target="_blank" title="View on MusicBrainz">{{ metadata.name }}</a>
        </h3>
        <form class="ui form" @submit.prevent="">
          <h6 class="ui header">Filter album types</h6>
          <div class="inline fields">
            <div class="field" v-for="t in availableReleaseTypes">
              <div class="ui checkbox">
                <input type="checkbox" :value="t" v-model="releaseTypes" />
                <label>{{ t }}</label>
              </div>
            </div>
            <div class="field">
              <label>Query template</label>
              <input v-model="customQueryTemplate" />
            </div>
          </div>
        </form>
        <template
          v-for="release in releases">
          <release-import
            :key="release.id"
            :metadata="release"
            :backends="backends"
            :defaultEnabled="false"
            :default-backend-id="defaultBackendId"
            :query-template="customQueryTemplate"
            @import-data-changed="recordReleaseData"
            @enabled="recordReleaseEnabled"
          ></release-import>
          <div class="ui divider"></div>
        </template>
      </div>
    </template>
    
    <script>
    import Vue from 'vue'
    import axios from 'axios'
    import logger from '@/logging'
    
    import ImportMixin from './ImportMixin'
    import ReleaseImport from './ReleaseImport'
    
    export default Vue.extend({
      mixins: [ImportMixin],
      components: {
        ReleaseImport
      },
      data () {
        return {
          releaseImportData: [],
          releaseGroupsData: {},
          releases: [],
          releaseTypes: ['Album'],
          availableReleaseTypes: ['Album', 'Live', 'Compilation', 'EP', 'Single', 'Other']
        }
      },
      created () {
        this.fetchReleaseGroupsData()
      },
      methods: {
        recordReleaseData (release) {
          let existing = this.releaseImportData.filter(r => {
            return r.releaseId === release.releaseId
          })[0]
          if (existing) {
            existing.tracks = release.tracks
          } else {
            this.releaseImportData.push({
              releaseId: release.releaseId,
              enabled: true,
              tracks: release.tracks
            })
          }
        },
        recordReleaseEnabled (release, enabled) {
          let existing = this.releaseImportData.filter(r => {
            return r.releaseId === release.releaseId
          })[0]
          if (existing) {
            existing.enabled = enabled
          } else {
            this.releaseImportData.push({
              releaseId: release.releaseId,
              enabled: enabled,
              tracks: release.tracks
            })
          }
        },
        fetchReleaseGroupsData () {
          let self = this
          this.releaseGroups.forEach(group => {
            let url = 'providers/musicbrainz/releases/browse/' + group.id + '/'
            return axios.get(url).then((response) => {
              logger.default.info('successfully fetched release group', group.id)
              let release = response.data['release-list'].filter(r => {
                return r.status === 'Official'
              })[0]
              self.releaseGroupsData[group.id] = release
              self.releases = self.computeReleaseData()
            }, (response) => {
              logger.default.error('error while fetching release group', group.id)
            })
          })
        },
        computeReleaseData () {
          let self = this
          let releases = []
          this.releaseGroups.forEach(group => {
            let data = self.releaseGroupsData[group.id]
            if (data) {
              releases.push(data)
            }
          })
          return releases
        }
      },
      computed: {
        type () {
          return 'artist'
        },
        releaseGroups () {
          let self = this
          return this.metadata['release-group-list'].filter(r => {
            return self.releaseTypes.indexOf(r.type) !== -1
          }).sort(function (a, b) {
            if (a['first-release-date'] < b['first-release-date']) {
              return -1
            }
            if (a['first-release-date'] > b['first-release-date']) {
              return 1
            }
            return 0
          })
        },
        importData () {
          let releases = this.releaseImportData.filter(r => {
            return r.enabled
          })
          return {
            artistId: this.metadata.id,
            count: releases.reduce(function (a, b) {
              return a + b.tracks.length
            }, 0),
            albums: releases
          }
        }
      },
      watch: {
        releaseTypes (newValue) {
          this.fetchReleaseGroupsData()
        }
      }
    })
    </script>