2025-01-21 18:53:55 +03:00
|
|
|
import { IssueLoader, HTMLTable, ChannelsParser } from '../../core'
|
2025-04-02 07:13:39 +03:00
|
|
|
import { Logger, Storage, Collection } from '@freearhey/core'
|
2025-07-18 22:51:01 +03:00
|
|
|
import { ChannelList, Issue, Site } from '../../models'
|
2025-01-21 18:53:55 +03:00
|
|
|
import { SITES_DIR, ROOT_DIR } from '../../constants'
|
2025-04-02 07:13:39 +03:00
|
|
|
import { Channel } from 'epg-grabber'
|
2025-01-01 10:18:30 +03:00
|
|
|
|
|
|
|
|
async function main() {
|
2025-07-18 22:51:01 +03:00
|
|
|
const logger = new Logger({ level: -999 })
|
|
|
|
|
const issueLoader = new IssueLoader()
|
2025-01-21 18:53:55 +03:00
|
|
|
const sitesStorage = new Storage(SITES_DIR)
|
2025-01-01 10:18:30 +03:00
|
|
|
const sites = new Collection()
|
|
|
|
|
|
2025-07-18 22:51:01 +03:00
|
|
|
logger.info('loading channels...')
|
|
|
|
|
const channelsParser = new ChannelsParser({
|
|
|
|
|
storage: sitesStorage
|
|
|
|
|
})
|
|
|
|
|
|
2025-01-01 10:18:30 +03:00
|
|
|
logger.info('loading list of sites')
|
2025-01-21 18:53:55 +03:00
|
|
|
const folders = await sitesStorage.list('*/')
|
2025-01-01 10:18:30 +03:00
|
|
|
|
|
|
|
|
logger.info('loading issues...')
|
2025-07-18 22:51:01 +03:00
|
|
|
const issues = await issueLoader.load()
|
2025-01-01 10:18:30 +03:00
|
|
|
|
|
|
|
|
logger.info('putting the data together...')
|
2025-04-02 07:13:39 +03:00
|
|
|
const brokenGuideReports = issues.filter(issue =>
|
|
|
|
|
issue.labels.find((label: string) => label === 'broken guide')
|
|
|
|
|
)
|
2025-01-21 18:53:55 +03:00
|
|
|
for (const domain of folders) {
|
2025-04-02 07:13:39 +03:00
|
|
|
const filteredIssues = brokenGuideReports.filter(
|
|
|
|
|
(issue: Issue) => domain === issue.data.get('site')
|
|
|
|
|
)
|
|
|
|
|
|
2025-01-01 10:18:30 +03:00
|
|
|
const site = new Site({
|
|
|
|
|
domain,
|
|
|
|
|
issues: filteredIssues
|
|
|
|
|
})
|
|
|
|
|
|
2025-01-21 18:53:55 +03:00
|
|
|
const files = await sitesStorage.list(`${domain}/*.channels.xml`)
|
|
|
|
|
for (const filepath of files) {
|
2025-07-18 22:51:01 +03:00
|
|
|
const channelList: ChannelList = await channelsParser.parse(filepath)
|
2025-01-21 18:53:55 +03:00
|
|
|
|
2025-07-18 22:51:01 +03:00
|
|
|
site.totalChannels += channelList.channels.count()
|
|
|
|
|
site.markedChannels += channelList.channels
|
|
|
|
|
.filter((channel: Channel) => channel.xmltv_id)
|
|
|
|
|
.count()
|
2025-01-21 18:53:55 +03:00
|
|
|
}
|
|
|
|
|
|
2025-01-01 10:18:30 +03:00
|
|
|
sites.add(site)
|
2025-01-21 18:53:55 +03:00
|
|
|
}
|
2025-01-01 10:18:30 +03:00
|
|
|
|
|
|
|
|
logger.info('creating sites table...')
|
2025-07-18 22:51:01 +03:00
|
|
|
const tableData = new Collection()
|
2025-01-01 10:18:30 +03:00
|
|
|
sites.forEach((site: Site) => {
|
2025-07-18 22:51:01 +03:00
|
|
|
tableData.add([
|
2025-01-24 20:53:17 +03:00
|
|
|
{ value: `<a href="sites/${site.domain}">${site.domain}</a>` },
|
|
|
|
|
{ value: site.totalChannels, align: 'right' },
|
|
|
|
|
{ value: site.markedChannels, align: 'right' },
|
|
|
|
|
{ value: site.getStatus().emoji, align: 'center' },
|
|
|
|
|
{ value: site.getIssues().all().join(', ') }
|
2025-01-01 10:18:30 +03:00
|
|
|
])
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
logger.info('updating sites.md...')
|
2025-07-18 22:51:01 +03:00
|
|
|
const table = new HTMLTable(tableData.all(), [
|
2025-01-24 20:53:17 +03:00
|
|
|
{ name: 'Site', align: 'left' },
|
|
|
|
|
{ name: 'Channels<br>(total / with xmltv-id)', colspan: 2, align: 'left' },
|
|
|
|
|
{ name: 'Status', align: 'left' },
|
|
|
|
|
{ name: 'Notes', align: 'left' }
|
2025-01-21 18:53:55 +03:00
|
|
|
])
|
|
|
|
|
const rootStorage = new Storage(ROOT_DIR)
|
|
|
|
|
const sitesTemplate = await new Storage().load('scripts/templates/_sites.md')
|
|
|
|
|
const sitesContent = sitesTemplate.replace('_TABLE_', table.toString())
|
|
|
|
|
await rootStorage.save('SITES.md', sitesContent)
|
2025-01-01 10:18:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
main()
|