dev@74: import { dev@236: Component, dev@236: OnInit, dev@236: Output, dev@236: EventEmitter, dev@236: Input, dev@74: OnDestroy dev@74: } from '@angular/core'; dev@236: import { dev@236: FeatureExtractionService dev@236: } from '../services/feature-extraction/feature-extraction.service'; dev@497: import {ListResponse} from 'piper-js/core'; dev@236: import {Subscription} from 'rxjs/Subscription'; dev@441: import {HigherLevelFeatureShape} from '../visualisations/FeatureUtilities'; dev@44: dev@47: export interface ExtractorOutputInfo { dev@47: extractorKey: string; dev@47: combinedKey: string; dev@47: outputId: string; dev@44: name: string; dev@441: typeUri?: string; dev@44: } dev@44: dev@423: interface ExtractorInfo { dev@423: name: string; dev@423: outputs: ExtractorOutputInfo[]; dev@423: } dev@423: dev@440: const crudeTypeUriMap: {[key: string]: HigherLevelFeatureShape} = { dev@440: 'http://purl.org/ontology/af/Beat': 'instants', dev@440: 'http://purl.org/ontology/af/Chromagram': 'matrix', dev@440: 'http://purl.org/ontology/af/Spectrogram': 'matrix', dev@440: 'http://purl.org/ontology/af/KeyChange': 'instants', dev@440: 'http://purl.org/ontology/af/OnsetDetectionFunction': 'vector', dev@440: 'http://purl.org/ontology/af/Onset': 'instants', dev@440: 'http://purl.org/ontology/af/StructuralSegment': 'instants', dev@440: 'http://purl.org/ontology/af/TonalOnset': 'instants', dev@440: 'http://purl.org/ontology/af/Note': 'notes', dev@440: 'http://purl.org/ontology/af/ChordSegment': 'instants', dev@440: 'http://purl.org/ontology/af/MusicSegment': 'instants', dev@440: 'http://purl.org/ontology/af/Pitch': 'tracks' dev@440: }; dev@440: dev@44: @Component({ dev@236: selector: 'ugly-feature-extraction-menu', dev@44: templateUrl: './feature-extraction-menu.component.html', dev@44: styleUrls: ['./feature-extraction-menu.component.css'] dev@44: }) dev@74: export class FeatureExtractionMenuComponent implements OnInit, OnDestroy { dev@44: dev@48: @Input() dev@48: set disabled(isDisabled: boolean) { dev@48: this.isDisabled = isDisabled; dev@48: } dev@48: dev@48: get disabled() { dev@48: return this.isDisabled; dev@48: } dev@426: @Input() onRequestOutput: () => void; dev@48: dev@47: @Output() requestOutput: EventEmitter; dev@47: dev@48: private isDisabled: boolean; dev@74: private populateExtractors: (available: ListResponse) => void; dev@423: extractors: Iterable; dev@74: private librariesUpdatedSubscription: Subscription; dev@433: private isLoading: boolean; dev@44: dev@44: constructor(private piperService: FeatureExtractionService) { dev@44: this.extractors = []; dev@51: this.requestOutput = new EventEmitter(); dev@48: this.isDisabled = true; dev@74: this.populateExtractors = available => { dev@423: this.extractors = available.available.reduce((acc, staticData) => { dev@423: const name = staticData.basic.name; dev@423: const outputs: ExtractorOutputInfo[] = dev@423: staticData.basicOutputInfo.map(output => { dev@423: const combinedKey = `${staticData.key}:${output.identifier}`; dev@441: const maybeTypeInfo = staticData.staticOutputInfo && dev@440: staticData.staticOutputInfo.get(output.identifier) && dev@440: staticData.staticOutputInfo.get(output.identifier).typeURI; dev@440: return Object.assign({ dev@440: extractorKey: staticData.key, dev@440: combinedKey: combinedKey, dev@440: name: output.name, dev@440: outputId: output.identifier dev@440: }, dev@441: maybeTypeInfo ? {typeUri: maybeTypeInfo} : {} dev@440: ); dev@46: }); dev@423: acc.push({name, outputs}); dev@423: return acc; dev@423: }, [] as ExtractorInfo[]); dev@433: this.isLoading = false; dev@74: }; dev@74: } dev@74: dev@74: ngOnInit() { dev@236: this.librariesUpdatedSubscription = dev@236: this.piperService.librariesUpdated$.subscribe(this.populateExtractors); dev@324: this.piperService.list().then(this.populateExtractors); dev@44: } dev@44: dev@423: extract(info: ExtractorOutputInfo): void { dev@426: if (this.onRequestOutput) { dev@426: this.onRequestOutput(); dev@426: } dev@431: if (info && !this.disabled) { dev@100: this.requestOutput.emit(info); dev@100: } dev@47: } dev@47: dev@238: load(): void { dev@433: this.isLoading = true; dev@324: this.piperService.updateAvailableLibraries(); dev@74: } dev@74: dev@441: getFeatureIconName(outputInfo: ExtractorOutputInfo): string { dev@442: return { dev@441: vector: 'show_chart', dev@441: matrix: 'grid_on', dev@441: tracks: 'multiline_chart', dev@441: instants: 'view_week', dev@441: notes: 'audiotrack', dev@442: }[crudeTypeUriMap[outputInfo.typeUri]] || 'extension'; dev@441: } dev@441: dev@74: ngOnDestroy(): void { dev@74: this.librariesUpdatedSubscription.unsubscribe(); dev@74: } dev@44: }