Skip to content

Commit

Permalink
feat: add epg worker with new ipc commands
Browse files Browse the repository at this point in the history
  • Loading branch information
4gray committed Jan 13, 2021
1 parent 435e9b6 commit 418566f
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
/app-builds
/release
api.js
epg-worker.js
main.js
src/**/*.js
!src/karma.conf.js
Expand Down
12 changes: 12 additions & 0 deletions epg-worker.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hidden EPG worker</title>
</head>
<body>
<script>
require('./epg-worker.js');
</script>
</body>
</html>
99 changes: 99 additions & 0 deletions epg-worker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
const electron = require('electron');
const ipcRenderer = electron.ipcRenderer;
const zlib = require('zlib');
const parser = require('epg-parser');
const axios = require('axios');
import { EpgChannel } from './src/app/player/models/epg-channel.model';
import { EpgProgram } from './src/app/player/models/epg-program.model';
import {
EPG_ERROR,
EPG_FETCH,
EPG_FETCH_DONE,
EPG_GET_PROGRAM,
EPG_GET_PROGRAM_DONE,
} from './src/app/shared/ipc-commands';

// EPG data store
let EPG_DATA: { channels: EpgChannel[]; programs: EpgProgram[] };
const loggerLabel = '[EPG Worker]';

/**
* Fetches the epg data from the given url
* @param epgUrl url of the epg file
*/
const fetchEpgDataFromUrl = (epgUrl: string) => {
try {
let axiosConfig = {};
if (epgUrl.endsWith('.gz')) {
axiosConfig = {
responseType: 'arraybuffer',
};
}
axios
.get(epgUrl.trim(), axiosConfig)
.then((response) => {
console.log(loggerLabel, 'url content was fetched...');
const { data } = response;
if (epgUrl.endsWith('.gz')) {
console.log(loggerLabel, 'start unzipping...');
zlib.gunzip(data, (_err, output) => {
parseAndSetEpg(output);
});
} else {
parseAndSetEpg(data);
}
})
.catch((err) => {
console.log(loggerLabel, err);
ipcRenderer.send(EPG_ERROR);
});
} catch (error) {
console.log(loggerLabel, error);
ipcRenderer.send(EPG_ERROR);
}
};

/**
* Parses and sets the epg data
* @param xmlString xml file content from the fetched url as string
*/
const parseAndSetEpg = (xmlString) => {
console.log(loggerLabel, 'start parsing...');
EPG_DATA = parser.parse(xmlString.toString());
ipcRenderer.send(EPG_FETCH_DONE);
console.log(loggerLabel, 'done, parsing was finished...');
};

// fetches epg data from the provided URL
ipcRenderer.on(EPG_FETCH, (event, arg) => {
console.log(loggerLabel, 'epg fetch command was triggered');
fetchEpgDataFromUrl(arg);
});

// returns the epg data for the provided channel name and date
ipcRenderer.on(EPG_GET_PROGRAM, (event, args) => {
if (!EPG_DATA || !EPG_DATA.channels) return;
const foundChannel = EPG_DATA?.channels?.find((epgChannel) => {
if (
epgChannel.name.find((nameObj) => {
if (nameObj.value.trim() === args.channelName.trim())
return nameObj;
})
) {
return epgChannel;
}
});

if (foundChannel) {
const programs = EPG_DATA?.programs?.filter(
(ch) => ch.channel === foundChannel.id
);
ipcRenderer.send(EPG_GET_PROGRAM_DONE, {
payload: { channel: foundChannel, items: programs },
});
} else {
ipcRenderer.send(EPG_GET_PROGRAM_DONE, {
payload: { channel: {}, items: [] },
});
}
});
5 changes: 5 additions & 0 deletions src/app/shared/ipc-commands.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const EPG_FETCH = 'EPG:FETCH';
export const EPG_FETCH_DONE = 'EPG:FETCH_DONE';
export const EPG_ERROR = 'EPG:ERROR';
export const EPG_GET_PROGRAM = 'EPG:GET_PROGRAM';
export const EPG_GET_PROGRAM_DONE = 'EPG:GET_PROGRAM_DONE';
1 change: 1 addition & 0 deletions tsconfig.serve.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
},
"files": [
"api.ts",
"epg-worker.ts",
"main.ts"
],
"exclude": [
Expand Down

0 comments on commit 418566f

Please sign in to comment.