Showing with 12,594 additions and 17,143 deletions.
  1. +19 −0 .dockerignore
  2. +13 −3 .eslintrc.json
  3. +1 −1 .github/FUNDING.yml
  4. +35 −7 .github/workflows/ci.yaml
  5. +9 −68 .github/workflows/codesee-arch-diagram.yml
  6. +29 −0 .github/workflows/docker.yml
  7. +5 −2 .github/workflows/release.yml
  8. +1 −1 .github/workflows/winget.yml
  9. +2 −0 .gitignore
  10. +0 −7 .mocharc.json
  11. +1 −3 .stylelintrc.json
  12. +60 −0 CHANGELOG.md
  13. +1 −1 README.md
  14. +153 −164 angular.json
  15. +31 −0 docker/Dockerfile
  16. +16 −0 docker/README.md
  17. +17 −0 docker/docker-compose.yml
  18. +11 −0 docker/nginx.conf
  19. +97 −0 e2e/basic.e2e.ts
  20. +0 −58 e2e/basic.test.ts
  21. +11 −0 e2e/fixtures/test.m3u
  22. +0 −8 e2e/playwright.config.ts
  23. +104 −0 e2e/settings.e2e.ts
  24. +9 −17 electron-builder.json
  25. +267 −423 electron/api.ts
  26. +20 −6 electron/epg-worker.ts
  27. +32 −4 electron/main.ts
  28. +23 −10 electron/menu.ts
  29. +0 −7 electron/package.json
  30. +8,407 −14,423 package-lock.json
  31. +60 −56 package.json
  32. +38 −0 playwright.config.ts
  33. +13 −10 shared/ipc-commands.ts
  34. +3 −3 shared/playlist.interface.ts
  35. +47 −1 shared/playlist.utils.ts
  36. +16 −4 src/app/app-routing.module.ts
  37. +17 −8 src/app/app.component.spec.ts
  38. +58 −27 src/app/app.component.ts
  39. +14 −2 src/app/app.module.ts
  40. +14 −32 src/app/home/home.component.spec.ts
  41. +48 −62 src/app/home/home.component.ts
  42. +0 −2 src/app/home/home.module.ts
  43. +5 −1 src/app/home/recent-playlists/playlist-info/playlist-info.component.html
  44. +29 −24 src/app/home/recent-playlists/playlist-info/playlist-info.component.spec.ts
  45. +60 −30 src/app/home/recent-playlists/playlist-info/playlist-info.component.ts
  46. +83 −28 src/app/home/recent-playlists/recent-playlists.component.html
  47. +33 −0 src/app/home/recent-playlists/recent-playlists.component.scss
  48. +31 −24 src/app/home/recent-playlists/recent-playlists.component.spec.ts
  49. +96 −63 src/app/home/recent-playlists/recent-playlists.component.ts
  50. +1 −1 src/app/home/url-upload/url-upload.component.html
  51. +48 −68 src/app/player/components/channel-list-container/channel-list-container.component.html
  52. +0 −23 src/app/player/components/channel-list-container/channel-list-container.component.scss
  53. +29 −27 src/app/player/components/channel-list-container/channel-list-container.component.spec.ts
  54. +49 −25 src/app/player/components/channel-list-container/channel-list-container.component.ts
  55. +31 −0 src/app/player/components/channel-list-container/channel-list-item/channel-list-item.component.scss
  56. +48 −0 src/app/player/components/channel-list-container/channel-list-item/channel-list-item.component.ts
  57. +10 −18 src/app/player/components/epg-list/epg-list.component.html
  58. +68 −1 src/app/player/components/epg-list/epg-list.component.scss
  59. +29 −18 src/app/player/components/epg-list/epg-list.component.spec.ts
  60. +27 −22 src/app/player/components/epg-list/epg-list.component.ts
  61. +11 −9 src/app/player/components/html-video-player/html-video-player.component.ts
  62. +52 −0 src/app/player/components/video-player/sidebar/sidebar.component.html
  63. +47 −0 src/app/player/components/video-player/sidebar/sidebar.component.scss
  64. +42 −0 src/app/player/components/video-player/sidebar/sidebar.component.ts
  65. +41 −0 src/app/player/components/video-player/toolbar/toolbar.component.html
  66. +3 −0 src/app/player/components/video-player/toolbar/toolbar.component.scss
  67. +46 −0 src/app/player/components/video-player/toolbar/toolbar.component.ts
  68. +8 −116 src/app/player/components/video-player/video-player.component.html
  69. +0 −49 src/app/player/components/video-player/video-player.component.scss
  70. +30 −26 src/app/player/components/video-player/video-player.component.spec.ts
  71. +86 −99 src/app/player/components/video-player/video-player.component.ts
  72. +6 −0 src/app/player/player.module.ts
  73. +9 −7 src/app/services/dialog.service.spec.ts
  74. +7 −4 src/app/services/dialog.service.ts
  75. +6 −5 src/app/services/epg.service.spec.ts
  76. +8 −3 src/app/services/epg.service.ts
  77. +215 −0 src/app/services/playlists.service.ts
  78. +72 −347 src/app/services/pwa.service.ts
  79. +2 −2 src/app/services/settings.service.ts
  80. +1 −0 src/app/settings/language.enum.ts
  81. +233 −195 src/app/settings/settings.component.html
  82. +27 −17 src/app/settings/settings.component.scss
  83. +36 −15 src/app/settings/settings.component.spec.ts
  84. +116 −20 src/app/settings/settings.component.ts
  85. +0 −11 src/app/settings/settings.module.ts
  86. +0 −16 src/app/settings/settings.routing.ts
  87. 0 src/app/{state → shared}/channel.model.ts
  88. +0 −38 src/app/shared/components/about-dialog/about-dialog.component.html
  89. +0 −11 src/app/shared/components/about-dialog/about-dialog.component.scss
  90. +0 −34 src/app/shared/components/about-dialog/about-dialog.component.spec.ts
  91. +60 −10 src/app/shared/components/about-dialog/about-dialog.component.ts
  92. +7 −0 src/app/shared/components/confirm-dialog/confirm-dialog-data.interface.ts
  93. +0 −14 src/app/shared/components/confirm-dialog/confirm-dialog.component.html
  94. +0 −41 src/app/shared/components/confirm-dialog/confirm-dialog.component.spec.ts
  95. +23 −16 src/app/shared/components/confirm-dialog/confirm-dialog.component.ts
  96. +1 −0 src/app/shared/components/header/header.component.html
  97. +2 −1 src/app/shared/components/header/header.component.ts
  98. +16 −0 src/app/shared/pipes/filter.pipe.ts
  99. +2 −0 src/app/shared/playlist-meta.type.ts
  100. +10 −11 src/app/shared/shared.module.ts
  101. +121 −0 src/app/state/actions.ts
  102. +0 −10 src/app/state/channel.query.ts
  103. +0 −6 src/app/state/channel.service.ts
  104. +0 −164 src/app/state/channel.store.ts
  105. +236 −0 src/app/state/effects.ts
  106. +0 −4 src/app/state/index.ts
  107. +26 −0 src/app/state/playlists.state.ts
  108. +227 −0 src/app/state/reducers.ts
  109. +96 −0 src/app/state/selectors.ts
  110. +20 −0 src/app/state/state.ts
  111. +4 −2 src/assets/i18n/de.json
  112. +49 −10 src/assets/i18n/en.json
  113. +2 −1 src/assets/i18n/es.json
  114. +2 −1 src/assets/i18n/fr.json
  115. +167 −0 src/assets/i18n/it.json
  116. +2 −1 src/assets/i18n/ko.json
  117. +4 −2 src/assets/i18n/ru.json
  118. +23 −22 src/assets/i18n/zh.json
  119. +1 −0 src/environments/environment.dev.ts
  120. +1 −0 src/environments/environment.prod.ts
  121. +1 −0 src/environments/environment.ts
  122. +1 −0 src/environments/environment.web.ts
  123. +4 −4 src/styles.scss
  124. +0 −4 src/testing/translate.stub.ts
  125. +3 −2 tsconfig.json
19 changes: 19 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.git
.gitignore
.github
.vscode
.editorconfig
.dockerignore
.angular
.electron
.husky
Dockerfile
README.md
dist
e2e
node_modules
screenshots
test-results
coverage
build
release
16 changes: 13 additions & 3 deletions .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,15 @@
4,
{
"SwitchCase": 1,
"CallExpression": { "arguments": "first" },
"FunctionExpression": { "parameters": "first" },
"FunctionDeclaration": { "parameters": "first" },
"CallExpression": {
"arguments": "first"
},
"FunctionExpression": {
"parameters": "first"
},
"FunctionDeclaration": {
"parameters": "first"
},
"ignoredNodes": ["TSTypeParameterInstantiation"]
}
],
Expand Down Expand Up @@ -66,6 +72,10 @@
"@angular-eslint/template/banana-in-box": "error",
"@angular-eslint/template/no-negated-async": "error"
}
},
{
"files": ["*.ts"],
"extends": ["plugin:@ngrx/recommended"]
}
]
}
2 changes: 1 addition & 1 deletion .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
github: [4gray]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
Expand Down
42 changes: 35 additions & 7 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,42 @@ jobs:
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: '16.x'
node-version: '18.10'
- run: git config --global url."https://${{ secrets.PAT }}@github.com/".insteadOf ssh://git@github.com/
- run: npm ci
- run: npm test -- --coverage
- run: bash <(curl -s https://codecov.io/bash)
- run: npm run build:prod
env:
CI: true
e2e-tests:
runs-on: ${{ matrix.os }}

strategy:
matrix:
os: [macos-latest]

steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: '18.10'
- run: git config --global url."https://${{ secrets.PAT }}@github.com/".insteadOf ssh://git@github.com/
- run: npm ci
# env:
# PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
- run: npm run build:prod
#- run: npx playwright install --with-deps chromium
#- run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run e2e:ci
# if: matrix.os == 'ubuntu-latest'
# env:
# e2e: true
- run: npm run e2e:ci
env:
e2e: true
release:
needs: [build-and-test]
runs-on: ${{ matrix.os }}
Expand All @@ -42,7 +70,7 @@ jobs:
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v1
with:
node-version: '16.x'
node-version: '18.10'

- name: Build Electron app
uses: samuelmeuli/action-electron-builder@v1
Expand All @@ -54,8 +82,8 @@ jobs:
# If the commit is tagged with a version (e.g. "v1.0.0"),
# release the app after building
release: ${{ startsWith(github.ref, 'refs/tags/v') }}
- name: Archive production artifacts
uses: actions/upload-artifact@v3
with:
name: dev-release
path: ./release/iptvnator/**
#- name: Archive production artifacts
# uses: actions/upload-artifact@v3
# with:
# name: dev-release
# path: ./release/**
77 changes: 9 additions & 68 deletions .github/workflows/codesee-arch-diagram.yml
Original file line number Diff line number Diff line change
@@ -1,81 +1,22 @@
# This workflow was added by CodeSee. Learn more at https://codesee.io/
# This is v2.0 of this workflow file
on:
push:
branches:
- electron
pull_request_target:
types: [opened, synchronize, reopened]

name: CodeSee Map
name: CodeSee

permissions: read-all

jobs:
test_map_action:
codesee:
runs-on: ubuntu-latest
continue-on-error: true
name: Run CodeSee Map Analysis
name: Analyze the repo with CodeSee
steps:
- name: checkout
id: checkout
uses: actions/checkout@v2
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 0

# codesee-detect-languages has an output with id languages.
- name: Detect Languages
id: detect-languages
uses: Codesee-io/codesee-detect-languages-action@latest

- name: Configure JDK 16
uses: actions/setup-java@v2
if: ${{ fromJSON(steps.detect-languages.outputs.languages).java }}
with:
java-version: '16'
distribution: 'zulu'

# CodeSee Maps Go support uses a static binary so there's no setup step required.

- name: Configure Node.js 14
uses: actions/setup-node@v2
if: ${{ fromJSON(steps.detect-languages.outputs.languages).javascript }}
with:
node-version: '14'

- name: Configure Python 3.x
uses: actions/setup-python@v2
if: ${{ fromJSON(steps.detect-languages.outputs.languages).python }}
with:
python-version: '3.10'
architecture: 'x64'

- name: Configure Ruby '3.x'
uses: ruby/setup-ruby@v1
if: ${{ fromJSON(steps.detect-languages.outputs.languages).ruby }}
with:
ruby-version: '3.0'

# CodeSee Maps Rust support uses a static binary so there's no setup step required.

- name: Generate Map
id: generate-map
uses: Codesee-io/codesee-map-action@latest
with:
step: map
github_ref: ${{ github.ref }}
languages: ${{ steps.detect-languages.outputs.languages }}

- name: Upload Map
id: upload-map
uses: Codesee-io/codesee-map-action@latest
with:
step: mapUpload
api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }}
github_ref: ${{ github.ref }}

- name: Insights
id: insights
uses: Codesee-io/codesee-map-action@latest
- uses: Codesee-io/codesee-action@v2
with:
step: insights
api_token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }}
github_ref: ${{ github.ref }}
codesee-token: ${{ secrets.CODESEE_ARCH_DIAG_API_TOKEN }}
29 changes: 29 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: docker-build

on: [workflow_dispatch]

jobs:
build:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v3
-
name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
-
name: Build and push
uses: docker/build-push-action@v3
with:
context: .
file: ./docker/Dockerfile
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/iptvnator:latest
platforms: linux/amd64,linux/arm64,linux/arm/v7
7 changes: 5 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ on:
jobs:
package:
runs-on: ${{ matrix.os }}
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }}

strategy:
matrix:
Expand All @@ -19,15 +21,16 @@ jobs:
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v2
with:
node-version: 16
node-version: '18.10'

- name: Install Snapcraft
uses: samuelmeuli/action-snapcraft@v1
uses: samuelmeuli/action-snapcraft@v2
# Only install Snapcraft on Ubuntu
if: startsWith(matrix.os, 'ubuntu')
with:
# Log in to Snap Store
snapcraft_token: ${{ secrets.snapcraft_token }}
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.snapcraft_token }}

- name: Package Linux
if: startsWith(matrix.os, 'ubuntu')
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/winget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ jobs:
publish:
runs-on: windows-latest # action can only be run on windows
steps:
- uses: vedantmgoyal2009/winget-releaser@latest
- uses: vedantmgoyal2009/winget-releaser@v1
with:
identifier: 4gray.iptvnator
token: ${{ secrets.PAT }}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ src/**/*.js
data.db
preload.js
shared/*.js
playwright-report

# dependencies
/node_modules
Expand Down Expand Up @@ -55,6 +56,7 @@ package-lock.json
/e2e/*.js
!/e2e/protractor.conf.js
/e2e/*.map
/e2e/db

# System Files
.DS_Store
Expand Down
7 changes: 0 additions & 7 deletions .mocharc.json

This file was deleted.

4 changes: 1 addition & 3 deletions .stylelintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
true,
{
"ignoreTypes": [
"mat-selection-list",
"mat-nav-list",
"mat-list-item"
"/^mat-/"
]
}
],
Expand Down
60 changes: 60 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,63 @@
# [0.12.0](https://github.com/4gray/iptvnator/compare/v0.11.1...v0.12.0) (2023-03-11)


### Important change

The storage location of playlists has been changed, now everything is stored in IndexedDB. So after the update you will see a panel offering to migrate playlists.

### Bug Fixes

* macos related window management improvements ([b336680](https://github.com/4gray/iptvnator/commit/**b336680ec93b6c2a78af08bf1847f6e133895719**))
* set epgSource as not required field ([049ed6b](https://github.com/4gray/iptvnator/commit/049ed6be519df602fd8eb5071fb17efe1a850000)), closes [#175](https://github.com/4gray/iptvnator/issues/175)


### Features

* add cmd+q hotkey to close the app (macOS) ([f3e00e7](https://github.com/4gray/iptvnator/commit/f3e00e78aa65b64d058c27b616b0d11d1a374015)), closes [#181](https://github.com/4gray/iptvnator/issues/181)
* add dockerfile and docker-compose ([4b97e3d](https://github.com/4gray/iptvnator/commit/4b97e3d4b3b84a57c5c09cc25c0c362de341e2ba))
* add italian language ([3e3f18c](https://github.com/4gray/iptvnator/commit/3e3f18cabf3784bcfee17e54771ca0a5dbcbbf33))
* draggable channels in favorites list ([ba41c8d](https://github.com/4gray/iptvnator/commit/ba41c8dae5e82bd1f39fb9a6cd8518e25dcdb894))
* export playlist as m3u ([7e4d6b1](https://github.com/4gray/iptvnator/commit/7e4d6b171fa87ffb7084344a10d653dd2cb30ea2))
* persist window size ([2ce60e0](https://github.com/4gray/iptvnator/commit/2ce60e0a205dd8034626f35bfea1632fcac56529)), closes [#205](https://github.com/4gray/iptvnator/issues/205)
* **pwa:** load a m3u playlist as a URL parameter [#176](https://github.com/4gray/iptvnator/issues/176) ([344bd75](https://github.com/4gray/iptvnator/commit/344bd75c876ff3d26e5721e64e7b35cf7547950a))



## [0.11.1](https://github.com/4gray/iptvnator/compare/v0.11.0...v0.11.1) (2022-10-01)


### Bug Fixes

* allow file:// protocol for epg source ([c4e1076](https://github.com/4gray/iptvnator/commit/c4e107681e55ac168a86b57cf0c6bfd5a2b35c5c))
* disable service worker in electron app ([df4e99a](https://github.com/4gray/iptvnator/commit/df4e99a4ae7186322eddcab8b6a81a04bd4c2e1a))
* red screen in PIP window ([9756a76](https://github.com/4gray/iptvnator/commit/9756a76a90c05c008cd84c690c82b04c7ec56c87))
* service worker injection ([ba3dd88](https://github.com/4gray/iptvnator/commit/ba3dd88dde1129ac21ec6056b81f7ff8b569f5d6))


### Reverts

* Revert "Update release.yml" ([5ac1992](https://github.com/4gray/iptvnator/commit/5ac199281d0fa24998cf01dff148316f7684e46a))



# [0.11.0](https://github.com/4gray/iptvnator/compare/v0.10.0...v0.11.0) (2022-09-11)


### Bug Fixes

* set default value for video player ([ab1d0bf](https://github.com/4gray/iptvnator/commit/ab1d0bfec85dd8a43606c02a215c6654b809bb15))
* show notification after playlist refresh (PWA) ([b18e537](https://github.com/4gray/iptvnator/commit/b18e537ccb25c49002577a7aedd810c81eb981ea))


### Features

* check for available updates in PWA ([17b265f](https://github.com/4gray/iptvnator/commit/17b265f5a6bc4cae5c66532ccda3af580b52779c))
* implement multi epg view ([b4db751](https://github.com/4gray/iptvnator/commit/b4db751fb66353700dbc9e2285232da28ee655cb))
* import playlist as text ([6676fa0](https://github.com/4gray/iptvnator/commit/6676fa0a4267a5cb56697b47f24954581873f3e1))
* support multiple epg sources ([f8c6874](https://github.com/4gray/iptvnator/commit/f8c6874ad3734ef74e5de25e83626c7e8e77c55a))



# [0.10.0](https://github.com/4gray/iptvnator/compare/v0.9.0...v0.10.0) (2022-04-24)


Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<img src="https://raw.githubusercontent.com/4gray/iptvnator/electron/src/assets/icons/favicon.256x256.png" alt="IPTVnator icon" title="Free IPTV player application" />
</p>
<p align="center">
<a href="https://github.com/4gray/iptvnator/releases"><img src="https://img.shields.io/github/release/4gray/iptvnator.svg?style=for-the-badge&logo=github" alt="Release"></a> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/4gray/iptvnator/Build%20and%20release?style=for-the-badge"> <a href="https://github.com/4gray/iptvnator/releases"><img src="https://img.shields.io/github/downloads/4gray/iptvnator/total?style=for-the-badge&logo=github" alt="Releases"></a> <a href="https://codecov.io/gh/4gray/iptvnator"><img alt="Codecov" src="https://img.shields.io/codecov/c/github/4gray/iptvnator?style=for-the-badge"></a> <a href="https://twitter.com/iptvnator"><img src="https://img.shields.io/badge/twitter-iptvnator-blue?logo=twitter&style=for-the-badge" alt="Twitter"></a>
<a href="https://github.com/4gray/iptvnator/releases"><img src="https://img.shields.io/github/release/4gray/iptvnator.svg?style=for-the-badge&logo=github" alt="Release"></a> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/4gray/iptvnator/ci.yaml?style=for-the-badge"> <a href="https://github.com/4gray/iptvnator/releases"><img src="https://img.shields.io/github/downloads/4gray/iptvnator/total?style=for-the-badge&logo=github" alt="Releases"></a> <a href="https://codecov.io/gh/4gray/iptvnator"><img alt="Codecov" src="https://img.shields.io/codecov/c/github/4gray/iptvnator?style=for-the-badge"></a> <a href="https://twitter.com/iptvnator"><img src="https://img.shields.io/badge/twitter-iptvnator-blue?logo=twitter&style=for-the-badge" alt="Twitter"></a>
</p>

**IPTVnator** is a video player application that provides support for the playback of IPTV playlists (m3u, m3u8). The application allows to import playlists by using remote URLs or per file upload from the file system. Additionally there is a support of EPG information XMLTV-based which can be provided by URL.
Expand Down
Loading