diff --git a/.github/workflows/tv.vera.com.uy.yml b/.github/workflows/tv.vera.com.uy.yml new file mode 100644 index 00000000..5108eada --- /dev/null +++ b/.github/workflows/tv.vera.com.uy.yml @@ -0,0 +1,17 @@ +name: tv.vera.com.uy +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 }} diff --git a/package-lock.json b/package-lock.json index 029b33af..c9619368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "commander": "^8.2.0", "csv-parser": "^3.0.0", "dayjs": "^1.10.8", - "epg-grabber": "^0.30.2", + "epg-grabber": "^0.31.0", "epg-parser": "^0.2.0", "form-data": "^4.0.0", "fs-extra": "^10.0.1", @@ -1990,6 +1990,11 @@ } ] }, + "node_modules/cdata": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/cdata/-/cdata-0.1.3.tgz", + "integrity": "sha512-z0R4cT5357OEAVkP1CEFTHz1egpu2gYiWm2WJOY/sQDhojEXUYL4m3v2kYi5wER3PkMRL+GgfDhed2kGzrHSZA==" + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2438,6 +2443,14 @@ "ms": "^2.0.0" } }, + "node_modules/cwait": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cwait/-/cwait-1.1.2.tgz", + "integrity": "sha512-kIx8zE5jJ1iBgZytTr01aj57HdC+thPsg8W9Tw0gbf30/F7wfRRUS+BiXT90Dn+A0oGtF0xLT5293Ua4w/ZsNA==", + "dependencies": { + "cdata": "^0.1.1" + } + }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -2724,9 +2737,9 @@ } }, "node_modules/epg-grabber": { - "version": "0.30.2", - "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.30.2.tgz", - "integrity": "sha512-Ao8hM1yizk5tuNeskER0YmU3IWRFzBCjgKnRpCHpLNKCkst28AmicN/Bzi32EXE06hl8yXQnKKwKnp7/PCI/Xw==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.31.0.tgz", + "integrity": "sha512-DT58SsA9QOBB1qC4uKDabRdbOohUeO4jwUCXEDk9jvI8NVvk3lypnB2JUkwYv3Q1kQeFs+522E8pbcZLEa5oFQ==", "dependencies": { "axios": "^0.21.1", "axios-cache-interceptor": "^0.10.3", @@ -2734,6 +2747,7 @@ "axios-mock-adapter": "^1.20.0", "commander": "^7.1.0", "curl-generator": "^0.2.0", + "cwait": "^1.1.2", "dayjs": "^1.10.4", "epg-parser": "^0.1.6", "fs-extra": "^11.1.1", @@ -8446,6 +8460,11 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" }, + "cdata": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/cdata/-/cdata-0.1.3.tgz", + "integrity": "sha512-z0R4cT5357OEAVkP1CEFTHz1egpu2gYiWm2WJOY/sQDhojEXUYL4m3v2kYi5wER3PkMRL+GgfDhed2kGzrHSZA==" + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8796,6 +8815,14 @@ "ms": "^2.0.0" } }, + "cwait": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cwait/-/cwait-1.1.2.tgz", + "integrity": "sha512-kIx8zE5jJ1iBgZytTr01aj57HdC+thPsg8W9Tw0gbf30/F7wfRRUS+BiXT90Dn+A0oGtF0xLT5293Ua4w/ZsNA==", + "requires": { + "cdata": "^0.1.1" + } + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -9005,9 +9032,9 @@ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" }, "epg-grabber": { - "version": "0.30.2", - "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.30.2.tgz", - "integrity": "sha512-Ao8hM1yizk5tuNeskER0YmU3IWRFzBCjgKnRpCHpLNKCkst28AmicN/Bzi32EXE06hl8yXQnKKwKnp7/PCI/Xw==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.31.0.tgz", + "integrity": "sha512-DT58SsA9QOBB1qC4uKDabRdbOohUeO4jwUCXEDk9jvI8NVvk3lypnB2JUkwYv3Q1kQeFs+522E8pbcZLEa5oFQ==", "requires": { "axios": "^0.21.1", "axios-cache-interceptor": "^0.10.3", @@ -9015,6 +9042,7 @@ "axios-mock-adapter": "^1.20.0", "commander": "^7.1.0", "curl-generator": "^0.2.0", + "cwait": "^1.1.2", "dayjs": "^1.10.4", "epg-parser": "^0.1.6", "fs-extra": "^11.1.1", diff --git a/package.json b/package.json index 9063ca68..805b4b97 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "author": "Arhey", "license": "MIT", "jest": { - "testPathIgnorePatterns": [ - ".jenkins" + "modulePathIgnorePatterns": [ + "/.jenkins/" ], "testRegex": "(sites|tests)/(.*?/)?.*test.js$", "setupFilesAfterEnv": [ @@ -35,7 +35,7 @@ "commander": "^8.2.0", "csv-parser": "^3.0.0", "dayjs": "^1.10.8", - "epg-grabber": "^0.30.2", + "epg-grabber": "^0.31.0", "epg-parser": "^0.2.0", "form-data": "^4.0.0", "fs-extra": "^10.0.1", diff --git a/sites/tv.vera.com.uy/__data__/content.json b/sites/tv.vera.com.uy/__data__/content.json new file mode 100644 index 00000000..d0060cb7 --- /dev/null +++ b/sites/tv.vera.com.uy/__data__/content.json @@ -0,0 +1,3 @@ + + +{"count":23,"limit":500,"offset":0,"data":[{"id":530582,"id_canal":19047,"id_programa":null,"nombre_programa":"Canal 5 Noticias rep.","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-10 23:30:00","fecha_hora_fin":"2023-02-11 01:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530583,"id_canal":19047,"id_programa":19977,"nombre_programa":"Dise\u00f1o para habitar","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 01:00:00","fecha_hora_fin":"2023-02-11 01:30:00","public_id":"2stkd","nombre":"Dise\u00f1o para habitar","nombre_corto":"Dise\u00f1o para habitar","nombre_fantasia":null,"descripcion":"","descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":"HABILITADO","habilitado":1,"es_visible":1,"destacado":0,"eliminado":0,"clasificacion":"","apto_para_publico_infantil":1,"id_servicio":3,"id_proveedor":"165","monetizacion":"","billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530584,"id_canal":19047,"id_programa":24443,"nombre_programa":"Basta de ch\u00e1chara (rep. 11 a 12)","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 01:30:00","fecha_hora_fin":"2023-02-11 02:30:00","public_id":"2sndm","nombre":"Basta de ch\u00e1chara (rep. 11 a 12)","nombre_corto":"Basta de ch\u00e1chara (rep. 11 a 12)","nombre_fantasia":null,"descripcion":"","descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":"HABILITADO","habilitado":1,"es_visible":1,"destacado":0,"eliminado":0,"clasificacion":"","apto_para_publico_infantil":1,"id_servicio":3,"id_proveedor":"165","monetizacion":"","billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530585,"id_canal":19047,"id_programa":null,"nombre_programa":"Basta de ch\u00e1chara (rep. 13 a 14)","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 02:30:00","fecha_hora_fin":"2023-02-11 03:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530586,"id_canal":19047,"id_programa":null,"nombre_programa":"El living rep.","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 03:30:00","fecha_hora_fin":"2023-02-11 06:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530587,"id_canal":19047,"id_programa":22103,"nombre_programa":"Catadores ","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 06:30:00","fecha_hora_fin":"2023-02-11 07:00:00","public_id":"2s8ss","nombre":"Catadores ","nombre_corto":"Catadores ","nombre_fantasia":null,"descripcion":"","descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":"HABILITADO","habilitado":1,"es_visible":1,"destacado":0,"eliminado":0,"clasificacion":"","apto_para_publico_infantil":1,"id_servicio":3,"id_proveedor":"165","monetizacion":"","billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530589,"id_canal":19047,"id_programa":20231,"nombre_programa":"Agroinforme","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 07:30:00","fecha_hora_fin":"2023-02-11 08:30:00","public_id":"2s126","nombre":"Agroinforme","nombre_corto":"Agroinforme","nombre_fantasia":null,"descripcion":"","descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":"HABILITADO","habilitado":1,"es_visible":1,"destacado":0,"eliminado":0,"clasificacion":"","apto_para_publico_infantil":1,"id_servicio":3,"id_proveedor":"165","monetizacion":"","billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530590,"id_canal":19047,"id_programa":null,"nombre_programa":"DW. En forma ","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 08:30:00","fecha_hora_fin":"2023-02-11 09:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530591,"id_canal":19047,"id_programa":null,"nombre_programa":"Palabras mayores ","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 09:00:00","fecha_hora_fin":"2023-02-11 10:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530592,"id_canal":19047,"id_programa":null,"nombre_programa":"Tesoros del mundo ","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 10:00:00","fecha_hora_fin":"2023-02-11 10:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530593,"id_canal":19047,"id_programa":19930,"nombre_programa":"DW. Enlaces","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 10:30:00","fecha_hora_fin":"2023-02-11 11:00:00","public_id":"2stfg","nombre":"DW. Enlaces","nombre_corto":"DW. Enlaces","nombre_fantasia":null,"descripcion":"","descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":"HABILITADO","habilitado":1,"es_visible":1,"destacado":0,"eliminado":0,"clasificacion":"","apto_para_publico_infantil":1,"id_servicio":3,"id_proveedor":"165","monetizacion":"","billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530594,"id_canal":19047,"id_programa":null,"nombre_programa":"Uruguay por dentro","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 11:00:00","fecha_hora_fin":"2023-02-11 12:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530595,"id_canal":19047,"id_programa":null,"nombre_programa":"Quien es quien rep","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 12:00:00","fecha_hora_fin":"2023-02-11 12:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530596,"id_canal":19047,"id_programa":24443,"nombre_programa":"Basta de ch\u00e1chara (rep. 11 a 12)","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 12:30:00","fecha_hora_fin":"2023-02-11 13:30:00","public_id":"2sndm","nombre":"Basta de ch\u00e1chara (rep. 11 a 12)","nombre_corto":"Basta de ch\u00e1chara (rep. 11 a 12)","nombre_fantasia":null,"descripcion":"","descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":"HABILITADO","habilitado":1,"es_visible":1,"destacado":0,"eliminado":0,"clasificacion":"","apto_para_publico_infantil":1,"id_servicio":3,"id_proveedor":"165","monetizacion":"","billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530597,"id_canal":19047,"id_programa":null,"nombre_programa":"Basta de ch\u00e1chara (rep. 13 a 14)","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 13:30:00","fecha_hora_fin":"2023-02-11 14:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530598,"id_canal":19047,"id_programa":null,"nombre_programa":"El living rep.","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 14:30:00","fecha_hora_fin":"2023-02-11 17:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530599,"id_canal":19047,"id_programa":null,"nombre_programa":"DW. Cultura 21 ","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 17:30:00","fecha_hora_fin":"2023-02-11 18:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530600,"id_canal":19047,"id_programa":null,"nombre_programa":"El monitor pl\u00e1stico","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 18:00:00","fecha_hora_fin":"2023-02-11 18:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530601,"id_canal":19047,"id_programa":19977,"nombre_programa":"Dise\u00f1o para habitar","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 18:30:00","fecha_hora_fin":"2023-02-11 19:00:00","public_id":"2stkd","nombre":"Dise\u00f1o para habitar","nombre_corto":"Dise\u00f1o para habitar","nombre_fantasia":null,"descripcion":"","descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":"HABILITADO","habilitado":1,"es_visible":1,"destacado":0,"eliminado":0,"clasificacion":"","apto_para_publico_infantil":1,"id_servicio":3,"id_proveedor":"165","monetizacion":"","billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530603,"id_canal":19047,"id_programa":null,"nombre_programa":"EPA","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 19:30:00","fecha_hora_fin":"2023-02-11 20:30:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530604,"id_canal":19047,"id_programa":null,"nombre_programa":"Olas y vientos ","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 20:30:00","fecha_hora_fin":"2023-02-11 21:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530605,"id_canal":19047,"id_programa":null,"nombre_programa":"Patrimonio silencioso ciudad vieja","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 21:00:00","fecha_hora_fin":"2023-02-11 22:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"},{"id":530606,"id_canal":19047,"id_programa":null,"nombre_programa":"1973. Ac\u00e1 no va a pasar. El amargo febrero del 73","descripcion_programa":"","subtitle":"","fecha_hora_inicio":"2023-02-11 22:00:00","fecha_hora_fin":"2023-02-11 23:00:00","public_id":null,"nombre":null,"nombre_corto":null,"nombre_fantasia":null,"descripcion":null,"descripcion_corta":null,"imagen_por_defecto":null,"imagenes":null,"estado":null,"habilitado":null,"es_visible":null,"destacado":null,"eliminado":null,"clasificacion":null,"apto_para_publico_infantil":null,"id_servicio":3,"id_proveedor":null,"monetizacion":null,"billing_id_OLD":null,"imagenes_frontend":null,"created_at":"2023-02-06 11:15:15","updated_at":"2023-02-06 11:15:15","imagen_principal":null,"canal_nombre":"Canal 5","canal_nombre_corto":null,"canal_nombre_fantasia":"Canal 5","canal_public_id":"2s6nd"}]} \ No newline at end of file diff --git a/sites/tv.vera.com.uy/__data__/no_content.json b/sites/tv.vera.com.uy/__data__/no_content.json new file mode 100644 index 00000000..b5a62667 --- /dev/null +++ b/sites/tv.vera.com.uy/__data__/no_content.json @@ -0,0 +1,3 @@ + + +{"count":0,"limit":500,"offset":0,"data":[]} \ No newline at end of file diff --git a/sites/tv.vera.com.uy/__data__/no_session.json b/sites/tv.vera.com.uy/__data__/no_session.json new file mode 100644 index 00000000..94804990 --- /dev/null +++ b/sites/tv.vera.com.uy/__data__/no_session.json @@ -0,0 +1 @@ +{"message":"Error de validacion de los datos","name":"ValidationError","status":400,"src":"veratv-be","info":{"errors":[{"msg":"tipo puede ser usuario o anonima","param":"_error","nestedErrors":[{"value":"anonim","msg":"Invalid value","param":"tipo","location":"body"},{"msg":"Invalid value","param":"usuario","location":"body"},{"msg":"Invalid value","param":"dominio","location":"body"},{"value":"anonim","msg":"Invalid value","param":"tipo","location":"body"}]}]}} \ No newline at end of file diff --git a/sites/tv.vera.com.uy/__data__/session.json b/sites/tv.vera.com.uy/__data__/session.json new file mode 100644 index 00000000..0212abe9 --- /dev/null +++ b/sites/tv.vera.com.uy/__data__/session.json @@ -0,0 +1 @@ +{"id_sesion":494613071,"token":"MpDY52p1V6g511VSABp1015B","id_servicio":3,"id_frontend":1196,"id_dispositivo":0,"id_usuario":0,"dominio":"","usuario":"","id_referencia":"","tipo":"anonima","expiracion_inicial":"2023-02-08 06:37:36","ip":"179.27.154.242","ip_referenciada":"188.242.48.93","jwt":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOnsidGlwbyI6ImFub25pbWEifSwic3ViIjoiTXBEWTUycDFWNmc1MTFWU0FCcDEwMTVCIiwicHJuIjp7ImlkX3NlcnZpY2lvIjozLCJpZF9mcm9udGVuZCI6MTE5NiwiaXAiOiIxNzkuMjcuMTU0LjI0MiIsImlwX3JlZmVyZW5jaWFkYSI6IjE4OC4yNDIuNDguOTMiLCJpZF9kaXNwb3NpdGl2byI6MH0sImF1ZCI6IkFwcHNcL1dlYnMgRnJvbnRlbmRzIiwiaWF0IjoxNjc1ODI3NDU2LCJleHAiOjE2NzU4NDkwNTZ9.8bAQciQl5DOIZF7GgCl6ad-KJUSpqQREetozGv_IH5s","accesos":null} \ No newline at end of file diff --git a/sites/tv.vera.com.uy/tv.vera.com.uy.channels.xml b/sites/tv.vera.com.uy/tv.vera.com.uy.channels.xml new file mode 100644 index 00000000..49c41dae --- /dev/null +++ b/sites/tv.vera.com.uy/tv.vera.com.uy.channels.xml @@ -0,0 +1,58 @@ + + + + 1000XHora TV + Adu Live + ANPI TV + Antel Eventos + A + V + Artigas Televisión + Cámara de Representantes + Cámara de Senadores + Canal 11 Treinta y Tres + Canal 11 Las Piedras + Canal 12 Melo + Canal 23 Florida + Canal 26-Radio y Televisión de Aguascalientes + Canal 2 Lascano + Canal 2 HD San Carlos + Canal 2 Visión Canaria + Canal 4 Chuy + Canal 4 Juan Lacaze + Canal 4 Paysandú + Canal 4 Salto + Canal 4 Tacuarembó + Canal 5 + Canal 6 Durazno + Canal 7 Punta + Canal 8 Artigas + Canal 8 Durazno + Canal 8 Rivera + Canal 8 Salto + Canal 9 Telerocha + Canal M + Cardinal TV + Durazno TV + DW (Español) + El Canal de la Región - Noreste Canelones + Florida Televisora Color HD + Latina TV Paysandú + Maroñas Entertainment + MIEM + Mi Móvil TV + Pantalla IMPO + Plazacanal Treinta y Tres + RDTV 24HS + Rio Uruguay TV + Siemprecine + Tele R + Telesur + TV CIUDAD + TVL Pando + Canal UCL + Uruguay Presidencia + + + + + diff --git a/sites/tv.vera.com.uy/tv.vera.com.uy.config.js b/sites/tv.vera.com.uy/tv.vera.com.uy.config.js new file mode 100644 index 00000000..aacbf156 --- /dev/null +++ b/sites/tv.vera.com.uy/tv.vera.com.uy.config.js @@ -0,0 +1,108 @@ +const axios = require('axios') +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) + +const API_ENDPOINT = 'https://cds-frontend.vera.com.uy/api-contenidos' + +module.exports = { + site: 'tv.vera.com.uy', + days: 2, + async url({ date, channel }) { + const session = await loadSessionDetails() + if (!session || !session.token) return null + + return `${API_ENDPOINT}/canales/epg/${ + channel.site_id + }?limit=500&dias_siguientes=0&fecha=${date.format('YYYY-MM-DD')}&token=${session.token}` + }, + request: { + async headers() { + const session = await loadSessionDetails() + if (!session || !session.jwt) return null + + return { + authorization: `Bearer ${session.jwt}`, + 'x-frontend-id': 1196, + 'x-service-id': 3, + 'x-system-id': 1 + } + } + }, + parser({ content }) { + let programs = [] + let items = parseItems(content) + items.forEach(item => { + programs.push({ + title: item.nombre_programa, + sub_title: item.subtitle, + description: item.descripcion_programa, + start: parseStart(item), + stop: parseStop(item) + }) + }) + + return programs + }, + async channels({ lang }) { + const session = await loadSessionDetails() + if (!session || !session.jwt || !session.token) return null + + const data = await axios + .get(`${API_ENDPOINT}/listas/68?token=${session.token}`, { + headers: { + authorization: `Bearer ${session.jwt}`, + 'x-frontend-id': 1196, + 'x-service-id': 3, + 'x-system-id': 1 + } + }) + .then(r => r.data) + .catch(console.error) + + return data.contenidos.map(c => { + return { + lang: 'es', + site_id: c.public_id, + name: c.nombre + } + }) + } +} + +function parseStart(item) { + return dayjs.tz(item.fecha_hora_inicio, 'YYYY-MM-DD HH:mm:ss', 'America/Montevideo') +} + +function parseStop(item) { + return dayjs.tz(item.fecha_hora_fin, 'YYYY-MM-DD HH:mm:ss', 'America/Montevideo') +} + +function parseItems(content) { + const data = JSON.parse(content) + if (!data || !Array.isArray(data.data)) return [] + + return data.data +} + +function loadSessionDetails() { + return axios + .post( + 'https://veratv-be.vera.com.uy/api/sesiones', + { + tipo: 'anonima' + }, + { + headers: { + 'Content-Type': 'application/json' + } + } + ) + .then(r => r.data) + .catch(console.log) +} diff --git a/sites/tv.vera.com.uy/tv.vera.com.uy.test.js b/sites/tv.vera.com.uy/tv.vera.com.uy.test.js new file mode 100644 index 00000000..a8f0b9f6 --- /dev/null +++ b/sites/tv.vera.com.uy/tv.vera.com.uy.test.js @@ -0,0 +1,88 @@ +// npm run channels:parse -- --config=./sites/tv.vera.com.uy/tv.vera.com.uy.config.js --output=./sites/tv.vera.com.uy/tv.vera.com.uy.channels.xml +// npx epg-grabber --config=sites/tv.vera.com.uy/tv.vera.com.uy.config.js --channels=sites/tv.vera.com.uy/tv.vera.com.uy.channels.xml --output=guide.xml --days=2 + +const { parser, url, request } = require('./tv.vera.com.uy.config.js') +const fs = require('fs') +const axios = require('axios') +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) + +jest.mock('axios') + +axios.post.mockImplementation((url, data, opts) => { + if ( + url === 'https://veratv-be.vera.com.uy/api/sesiones' && + JSON.stringify(opts.headers) === + JSON.stringify({ + 'Content-Type': 'application/json' + }) && + JSON.stringify(data) === + JSON.stringify({ + tipo: 'anonima' + }) + ) { + return Promise.resolve({ + data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/session.json'))) + }) + } else { + return Promise.resolve({ + data: JSON.parse(fs.readFileSync(path.resolve(__dirname, '__data__/no_session.json'))) + }) + } +}) + +const date = dayjs.utc('2023-02-11', 'YYYY-MM-DD').startOf('d') +const channel = { + site_id: '2s6nd', + xmltv_id: 'Canal5.uy' +} + +it('can generate valid url', async () => { + const result = await url({ date, channel }) + + expect(result).toBe( + `https://cds-frontend.vera.com.uy/api-contenidos/canales/epg/2s6nd?limit=500&dias_siguientes=0&fecha=2023-02-11&token=MpDY52p1V6g511VSABp1015B` + ) +}) + +it('can generate valid request headers', async () => { + const result = await request.headers() + + expect(result).toMatchObject({ + authorization: + 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOnsidGlwbyI6ImFub25pbWEifSwic3ViIjoiTXBEWTUycDFWNmc1MTFWU0FCcDEwMTVCIiwicHJuIjp7ImlkX3NlcnZpY2lvIjozLCJpZF9mcm9udGVuZCI6MTE5NiwiaXAiOiIxNzkuMjcuMTU0LjI0MiIsImlwX3JlZmVyZW5jaWFkYSI6IjE4OC4yNDIuNDguOTMiLCJpZF9kaXNwb3NpdGl2byI6MH0sImF1ZCI6IkFwcHNcL1dlYnMgRnJvbnRlbmRzIiwiaWF0IjoxNjc1ODI3NDU2LCJleHAiOjE2NzU4NDkwNTZ9.8bAQciQl5DOIZF7GgCl6ad-KJUSpqQREetozGv_IH5s', + 'x-frontend-id': 1196, + 'x-service-id': 3, + 'x-system-id': 1 + }) +}) + +it('can parse response', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'), 'utf8') + let results = parser({ content }) + results = results.map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + return p + }) + + expect(results[0]).toMatchObject({ + start: '2023-02-11T02:30:00.000Z', + stop: '2023-02-11T04:00:00.000Z', + title: 'Canal 5 Noticias rep.', + sub_title: '', + description: '' + }) +}) + +it('can handle empty guide', () => { + const results = parser({ + content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'), 'utf8') + }) + + expect(results).toMatchObject([]) +}) diff --git a/yarn.lock b/yarn.lock index 0c5f14f8..393b526e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1250,6 +1250,11 @@ "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz" "version" "1.0.30001434" +"cdata@^0.1.1": + "integrity" "sha512-z0R4cT5357OEAVkP1CEFTHz1egpu2gYiWm2WJOY/sQDhojEXUYL4m3v2kYi5wER3PkMRL+GgfDhed2kGzrHSZA==" + "resolved" "https://registry.npmjs.org/cdata/-/cdata-0.1.3.tgz" + "version" "0.1.3" + "chalk-template@0.4.0": "integrity" "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==" "resolved" "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz" @@ -1588,6 +1593,13 @@ dependencies: "ms" "^2.0.0" +"cwait@^1.1.2": + "integrity" "sha512-kIx8zE5jJ1iBgZytTr01aj57HdC+thPsg8W9Tw0gbf30/F7wfRRUS+BiXT90Dn+A0oGtF0xLT5293Ua4w/ZsNA==" + "resolved" "https://registry.npmjs.org/cwait/-/cwait-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "cdata" "^0.1.1" + "data-urls@^2.0.0": "integrity" "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==" "resolved" "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" @@ -1783,10 +1795,10 @@ "resolved" "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" "version" "4.4.0" -"epg-grabber@^0.30.2": - "integrity" "sha512-Ao8hM1yizk5tuNeskER0YmU3IWRFzBCjgKnRpCHpLNKCkst28AmicN/Bzi32EXE06hl8yXQnKKwKnp7/PCI/Xw==" - "resolved" "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.30.2.tgz" - "version" "0.30.2" +"epg-grabber@^0.31.0": + "integrity" "sha512-DT58SsA9QOBB1qC4uKDabRdbOohUeO4jwUCXEDk9jvI8NVvk3lypnB2JUkwYv3Q1kQeFs+522E8pbcZLEa5oFQ==" + "resolved" "https://registry.npmjs.org/epg-grabber/-/epg-grabber-0.31.0.tgz" + "version" "0.31.0" dependencies: "axios" "^0.21.1" "axios-cache-interceptor" "^0.10.3" @@ -1794,6 +1806,7 @@ "axios-mock-adapter" "^1.20.0" "commander" "^7.1.0" "curl-generator" "^0.2.0" + "cwait" "^1.1.2" "dayjs" "^1.10.4" "epg-parser" "^0.1.6" "fs-extra" "^11.1.1"