|
@ -1,17 +1,10 @@ |
|
|
import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; |
|
|
import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; |
|
|
import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; |
|
|
import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; |
|
|
import { |
|
|
import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; |
|
|
IDataProviderHistoricalResponse, |
|
|
|
|
|
IDataProviderResponse |
|
|
|
|
|
} from '@ghostfolio/api/services/interfaces/interfaces'; |
|
|
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; |
|
|
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; |
|
|
import { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; |
|
|
import { DEFAULT_REQUEST_TIMEOUT } from '@ghostfolio/common/config'; |
|
|
import { |
|
|
import { DATE_FORMAT, extractNumberFromString, getYesterday } from '@ghostfolio/common/helper'; |
|
|
DATE_FORMAT, |
|
|
|
|
|
extractNumberFromString, |
|
|
|
|
|
getYesterday |
|
|
|
|
|
} from '@ghostfolio/common/helper'; |
|
|
|
|
|
import { Granularity } from '@ghostfolio/common/types'; |
|
|
import { Granularity } from '@ghostfolio/common/types'; |
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
@ -75,6 +68,7 @@ export class ManualService implements DataProviderInterface { |
|
|
url |
|
|
url |
|
|
} = symbolProfile.scraperConfiguration ?? {}; |
|
|
} = symbolProfile.scraperConfiguration ?? {}; |
|
|
|
|
|
|
|
|
|
|
|
Logger.log(symbolProfile); |
|
|
if (defaultMarketPrice) { |
|
|
if (defaultMarketPrice) { |
|
|
const historical: { |
|
|
const historical: { |
|
|
[symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; |
|
|
[symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; |
|
@ -95,23 +89,10 @@ export class ManualService implements DataProviderInterface { |
|
|
} else if (selector === undefined || url === undefined) { |
|
|
} else if (selector === undefined || url === undefined) { |
|
|
return {}; |
|
|
return {}; |
|
|
} |
|
|
} |
|
|
|
|
|
Logger.log("Here"); |
|
|
|
|
|
|
|
|
const abortController = new AbortController(); |
|
|
|
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
abortController.abort(); |
|
|
|
|
|
}, DEFAULT_REQUEST_TIMEOUT); |
|
|
|
|
|
|
|
|
|
|
|
const { body } = await got(url, { |
|
|
|
|
|
headers, |
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
signal: abortController.signal |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const $ = cheerio.load(body); |
|
|
|
|
|
|
|
|
|
|
|
const value = extractNumberFromString($(selector).text()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const value = await this.scrape(url, selector, headers); |
|
|
return { |
|
|
return { |
|
|
[symbol]: { |
|
|
[symbol]: { |
|
|
[format(getYesterday(), DATE_FORMAT)]: { |
|
|
[format(getYesterday(), DATE_FORMAT)]: { |
|
@ -129,6 +110,26 @@ export class ManualService implements DataProviderInterface { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public async scrape(url: string, selector: string, headers = {}): Promise<number>{ |
|
|
|
|
|
|
|
|
|
|
|
const abortController = new AbortController(); |
|
|
|
|
|
|
|
|
|
|
|
const { body } = await got(url, { |
|
|
|
|
|
headers, |
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
signal: abortController.signal |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
abortController.abort(); |
|
|
|
|
|
}, DEFAULT_REQUEST_TIMEOUT); |
|
|
|
|
|
const $ = cheerio.load(body); |
|
|
|
|
|
|
|
|
|
|
|
return extractNumberFromString($(selector).first().text()); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public getName(): DataSource { |
|
|
public getName(): DataSource { |
|
|
return DataSource.MANUAL; |
|
|
return DataSource.MANUAL; |
|
|
} |
|
|
} |
|
|