From 1f6944ac3cf7aad60f52ff328df493d96ae65456 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 25 Jan 2023 05:21:04 +0300 Subject: [PATCH 1/6] Create content.html --- sites/mediagenie.co.kr/__data__/content.html | 868 +++++++++++++++++++ 1 file changed, 868 insertions(+) create mode 100644 sites/mediagenie.co.kr/__data__/content.html diff --git a/sites/mediagenie.co.kr/__data__/content.html b/sites/mediagenie.co.kr/__data__/content.html new file mode 100644 index 00000000..ca46d969 --- /dev/null +++ b/sites/mediagenie.co.kr/__data__/content.html @@ -0,0 +1,868 @@ + + + + + + + + + + + + + + + + + + + +미디어지니 [Touch and Feel 콘텐츠 채널] + + + + + + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+
+
+
+
+ +
+ +
+ 드라마틱 DNA, ENA DRAMA +
+

최고를 꿈꾸는 드라마 전문채널 

+

3049 여성들의 취향을 저격할 드라마 전문 큐레이션 채널
+드라마 덕후들을 위한 즐거운 커뮤니티장
+가장 HOT한 드라마를 가장 빠르게 !!

+
+ +
+
+ + + +
+
+

실시간 편성표

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
실시간 편성표
시간프로그램 제목회차프로그램 정보시청등급
00:20 + 대행사
    +
  • +
  • +
+
5회 +
    +
  • +
  • +
+
15
01:34 + 대행사
    +
  • +
  • +
+
6회 +
    +
  • +
  • +
+
15
02:48 + 빨간 풍선
    +
  • +
  • +
+
9회 +
    +
  • +
  • +
+
15
04:13 + 빨간 풍선
    +
  • +
  • +
+
10회 +
    +
  • +
  • +
+
15
05:40 + 법쩐
    +
  • +
  • +
+
5회 +
    +
  • +
  • +
+
15
06:55 + 법쩐
    +
  • +
  • +
+
6회 +
    +
  • +
  • +
+
15
08:11 + 남이 될 수 있을까
    +
  • +
  • +
+
1회 +
    +
  • +
  • +
+
15
09:28 + 남이 될 수 있을까
    +
  • +
  • +
+
2회 +
    +
  • +
  • +
+
15
10:51 + ON AIR + 오은영 게임
    +
  • +
  • +
+
ON AIR1회 +
    +
  • +
  • +
+
12
12:20 + 대행사
    +
  • +
  • +
+
5회 +
    +
  • +
  • +
+
15
13:41 + 대행사
    +
  • +
  • +
+
6회 +
    +
  • +
  • +
+
15
:59 + 남이 될 수 있을까
    +
  • +
  • +
+
1회 +
    +
  • +
  • +
+
15
16:19 + 남이 될 수 있을까
    +
  • +
  • +
+
2회 +
    +
  • +
  • +
+
15
17:38 + 오은영 게임
    +
  • +
  • +
+
1회 +
    +
  • +
  • +
+
12
19:06 + 무한도전
    +
  • +
  • +
+
392회 +
    +
  • +
  • +
+
12
20:40 + 무한도전
    +
  • +
  • +
+
393회 +
    +
  • +
  • +
+
12
22:15 + 남이 될 수 있을까
    +
  • +
  • +
+
5회 +
    +
  • +
  • +
+
15
23:27 + 법쩐
    +
  • +
  • +
+
6회 +
    +
  • +
  • +
+
15
+
+
+ 편성표 자세히 보기 +

* 이 편성표는 방송사 사정에 따라 변경 될 수 있습니다.

+
+
+
    +
  • 재방송
  • +
  • 본방송
  • +
  • 일반방송
  • +
  • 화면해설
  • +
  • 수화방송
  • +
  • 자막방송
  • +
  • 음성다중
  • +
  • SD일반화질
  • +
  • HD고화질
  • +
  • UHD초고화질
  • +
+
+
    +
  • ALL
  • +
  • 7
  • +
  • 12
  • +
  • 15
  • +
  • 19
  • +
+ 연령대 별 시청 가능 +
+
+
+
+ +
+
+ +

채널 번호

+
+
+
+
+
+ 우리지역찾기 +
+
+ +
+
+ +
+ +
+
+
+
+
+
+ +
+
+
+ +
+ + +
+
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + From 70dee62b3f6f3f922513c3650eaf3aad5186646b Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 25 Jan 2023 05:21:07 +0300 Subject: [PATCH 2/6] Create no_content.html --- .../mediagenie.co.kr/__data__/no_content.html | 543 ++++++++++++++++++ 1 file changed, 543 insertions(+) create mode 100644 sites/mediagenie.co.kr/__data__/no_content.html diff --git a/sites/mediagenie.co.kr/__data__/no_content.html b/sites/mediagenie.co.kr/__data__/no_content.html new file mode 100644 index 00000000..e7c5d62e --- /dev/null +++ b/sites/mediagenie.co.kr/__data__/no_content.html @@ -0,0 +1,543 @@ + + + + + + + + + + + + + + + + + + + +미디어지니 [Touch and Feel 콘텐츠 채널] + + + + + + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+
+
+
+
+ +
+ +
+ 드라마틱 DNA, ENA DRAMA +
+

최고를 꿈꾸는 드라마 전문채널 

+

3049 여성들의 취향을 저격할 드라마 전문 큐레이션 채널
+드라마 덕후들을 위한 즐거운 커뮤니티장
+가장 HOT한 드라마를 가장 빠르게 !!

+
+ +
+
+ + + +
+
+

실시간 편성표

+ + +
+ 편성표 자세히 보기 +

* 이 편성표는 방송사 사정에 따라 변경 될 수 있습니다.

+
+
+
    +
  • 재방송
  • +
  • 본방송
  • +
  • 일반방송
  • +
  • 화면해설
  • +
  • 수화방송
  • +
  • 자막방송
  • +
  • 음성다중
  • +
  • SD일반화질
  • +
  • HD고화질
  • +
  • UHD초고화질
  • +
+
+
    +
  • ALL
  • +
  • 7
  • +
  • 12
  • +
  • 15
  • +
  • 19
  • +
+ 연령대 별 시청 가능 +
+
+
+
+ +
+
+ +

채널 번호

+
+
+
+
+
+ 우리지역찾기 +
+
+ +
+
+ +
+ +
+
+
+
+
+
+ +
+
+
+ +
+ + +
+
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + From 7e6c8848713891fa9c94987cfd5be88bffeea531 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 25 Jan 2023 05:21:11 +0300 Subject: [PATCH 3/6] Create mediagenie.co.kr.test.js --- .../mediagenie.co.kr/mediagenie.co.kr.test.js | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 sites/mediagenie.co.kr/mediagenie.co.kr.test.js diff --git a/sites/mediagenie.co.kr/mediagenie.co.kr.test.js b/sites/mediagenie.co.kr/mediagenie.co.kr.test.js new file mode 100644 index 00000000..595fff26 --- /dev/null +++ b/sites/mediagenie.co.kr/mediagenie.co.kr.test.js @@ -0,0 +1,65 @@ +// npx epg-grabber --config=sites/mediagenie.co.kr/mediagenie.co.kr.config.js --channels=sites/mediagenie.co.kr/mediagenie.co.kr.channels.xml --output=guide.xml --days=2 + +const { parser, url, request } = require('./mediagenie.co.kr.config.js') +const fs = require('fs') +const path = require('path') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const customParseFormat = require('dayjs/plugin/customParseFormat') +dayjs.extend(customParseFormat) +dayjs.extend(utc) + +const date = dayjs.utc('2023-01-25', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: 'ENA_DRAMA', + xmltv_id: 'ENADRAMA.kr' +} + +it('can generate valid url', () => { + expect(url({ channel, date })).toBe('https://mediagenie.co.kr/ENA_DRAMA/?qd=20230125') +}) + +it('can generate valid request headers', () => { + expect(request.headers).toMatchObject({ + cookie: 'CUPID=d5ed6b77012aef2b4d4365ffd3a1a3a4' + }) +}) + +it('can parse response', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'), 'utf8') + let results = parser({ content, date }) + results = results.map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(results[0]).toMatchObject({ + start: '2023-01-24T15:20:00.000Z', + stop: '2023-01-24T16:34:00.000Z', + title: `대행사`, + rating: { + system: 'KMRB', + value: '15' + } + }) + + expect(results[16]).toMatchObject({ + start: '2023-01-25T14:27:00.000Z', + stop: '2023-01-25T14:57:00.000Z', + title: `법쩐`, + rating: { + system: 'KMRB', + value: '15' + } + }) +}) + +it('can handle empty guide', () => { + const results = parser({ + date, + content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'), 'utf8') + }) + + expect(results).toMatchObject([]) +}) From 66f5231ffd6328d67e550111c2a40818406abd08 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 25 Jan 2023 05:21:16 +0300 Subject: [PATCH 4/6] Create mediagenie.co.kr.config.js --- .../mediagenie.co.kr.config.js | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 sites/mediagenie.co.kr/mediagenie.co.kr.config.js diff --git a/sites/mediagenie.co.kr/mediagenie.co.kr.config.js b/sites/mediagenie.co.kr/mediagenie.co.kr.config.js new file mode 100644 index 00000000..b7380cb2 --- /dev/null +++ b/sites/mediagenie.co.kr/mediagenie.co.kr.config.js @@ -0,0 +1,77 @@ +const cheerio = require('cheerio') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +const customParseFormat = require('dayjs/plugin/customParseFormat') + +dayjs.extend(utc) +dayjs.extend(timezone) +dayjs.extend(customParseFormat) + +module.exports = { + site: 'mediagenie.co.kr', + days: 2, + url({ channel, date }) { + return `https://mediagenie.co.kr/${channel.site_id}/?qd=${date.format('YYYYMMDD')}` + }, + request: { + headers: { + cookie: 'CUPID=d5ed6b77012aef2b4d4365ffd3a1a3a4' + } + }, + parser({ content, date }) { + const programs = [] + const items = parseItems(content, date) + items.forEach(item => { + const $item = cheerio.load(item) + const prev = programs[programs.length - 1] + const start = parseStart($item, date) + if (!start) return + if (prev) { + if (start.isBefore(prev.start)) { + start = start.add(1, 'd') + date = date.add(1, 'd') + } + prev.stop = start + } + const stop = start.add(30, 'm') + programs.push({ + title: parseTitle($item), + rating: parseRating($item), + start, + stop + }) + }) + + return programs + } +} + +function parseTitle($item) { + return $item('.col2').clone().children().remove().end().text().trim() +} + +function parseRating($item) { + const rating = $item('.col6').text().trim() + + return rating + ? { + system: 'KMRB', + value: rating + } + : null +} + +function parseStart($item, date) { + const time = $item('.col1').text().trim() + + if (!/^\d{2}:\d{2}$/.test(time)) return null + + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Asia/Seoul') +} + +function parseItems(content, channel, date) { + const $ = cheerio.load(content) + + return $('.tbl > tbody > tr').toArray() +} From c900d93bbe22166e2cb93f57c58461f5a74aaa2d Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 25 Jan 2023 05:21:20 +0300 Subject: [PATCH 5/6] Create mediagenie.co.kr.channels.xml --- sites/mediagenie.co.kr/mediagenie.co.kr.channels.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 sites/mediagenie.co.kr/mediagenie.co.kr.channels.xml diff --git a/sites/mediagenie.co.kr/mediagenie.co.kr.channels.xml b/sites/mediagenie.co.kr/mediagenie.co.kr.channels.xml new file mode 100644 index 00000000..8e439f16 --- /dev/null +++ b/sites/mediagenie.co.kr/mediagenie.co.kr.channels.xml @@ -0,0 +1,10 @@ + + + + CHING + ENA DRAMA + ENA STORY + Healthmedi + ONT + + From f959be35afed8721d77c111b316d7a7cfe708041 Mon Sep 17 00:00:00 2001 From: Aleksandr Statciuk Date: Wed, 25 Jan 2023 05:21:26 +0300 Subject: [PATCH 6/6] Create mediagenie.co.kr.yml --- .github/workflows/mediagenie.co.kr.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/mediagenie.co.kr.yml diff --git a/.github/workflows/mediagenie.co.kr.yml b/.github/workflows/mediagenie.co.kr.yml new file mode 100644 index 00000000..937dbfe0 --- /dev/null +++ b/.github/workflows/mediagenie.co.kr.yml @@ -0,0 +1,17 @@ +name: mediagenie.co.kr +on: + schedule: + - cron: '0 3 * * *' + workflow_dispatch: + workflow_run: + workflows: [_trigger] + types: + - completed +jobs: + load: + uses: ./.github/workflows/_load.yml + with: + site: ${{github.workflow}} + secrets: + APP_ID: ${{ secrets.APP_ID }} + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }}