Compare commits

...

2 Commits

Author SHA1 Message Date
joker acafbe4670 modified: package.json 3 years ago
joker 8392cf0c60 first commit 3 years ago
  1. 4
      .vscode/settings.json
  2. 288
      package-lock.json
  3. 7
      package.json
  4. 208
      src/app/page.tsx
  5. 29
      src/lib/generateRSS.js
  6. 13
      src/lib/posts.js
  7. 13
      src/pages/api/hello.ts
  8. 13
      src/pages/api/podcasts/all.ts
  9. 35
      src/pages/api/podcasts/hobbits/rss/index.ts
  10. 117
      src/pages/api/podcasts/lets-go/rss/index.ts
  11. 117
      src/pages/api/podcasts/like-to-listen/rss/index.ts
  12. 13
      src/server/db/connect.ts
  13. 14
      src/server/db/insert.ts
  14. 12
      src/server/db/select.ts
  15. 42
      src/сomponents/podcasts/Item.ts
  16. 61
      src/сomponents/podcasts/getRssXml.ts
  17. 2
      src/сomponents/podcasts/index.ts

@ -0,0 +1,4 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true
}

288
package-lock.json generated

@ -14,9 +14,14 @@
"@types/react-dom": "18.0.10",
"eslint": "8.33.0",
"eslint-config-next": "13.1.6",
"mysql2": "^3.1.2",
"next": "13.1.6",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-h5-audio-player": "^3.8.6",
"react-yandex-metrika": "^2.6.0",
"semantic-ui-css": "^2.5.0",
"semantic-ui-react": "^2.1.4",
"typescript": "4.9.5"
}
},
@ -53,6 +58,31 @@
"url": "https://opencollective.com/eslint"
}
},
"node_modules/@fluentui/react-component-event-listener": {
"version": "0.63.1",
"resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.63.1.tgz",
"integrity": "sha512-gSMdOh6tI3IJKZFqxfQwbTpskpME0CvxdxGM2tdglmf6ZPVDi0L4+KKIm+2dN8nzb8Ya1A8ZT+Ddq0KmZtwVQg==",
"dependencies": {
"@babel/runtime": "^7.10.4"
},
"peerDependencies": {
"react": "^16.8.0 || ^17 || ^18",
"react-dom": "^16.8.0 || ^17 || ^18"
}
},
"node_modules/@fluentui/react-component-ref": {
"version": "0.63.1",
"resolved": "https://registry.npmjs.org/@fluentui/react-component-ref/-/react-component-ref-0.63.1.tgz",
"integrity": "sha512-8MkXX4+R3i80msdbD4rFpEB4WWq2UDvGwG386g3ckIWbekdvN9z2kWAd9OXhRGqB7QeOsoAGWocp6gAMCivRlw==",
"dependencies": {
"@babel/runtime": "^7.10.4",
"react-is": "^16.6.3"
},
"peerDependencies": {
"react": "^16.8.0 || ^17 || ^18",
"react-dom": "^16.8.0 || ^17 || ^18"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.8",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
@ -83,6 +113,22 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
},
"node_modules/@iconify/icons-mdi": {
"version": "1.1.47",
"resolved": "https://registry.npmjs.org/@iconify/icons-mdi/-/icons-mdi-1.1.47.tgz",
"integrity": "sha512-6AZfvWru20Rl9pXULStkVvTWnua6VG56zOIKdkCzLh25XVeTDEp6f1dL7iX9w+way5+1hI0BBuqTQd61qYaKdg=="
},
"node_modules/@iconify/react": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@iconify/react/-/react-3.2.2.tgz",
"integrity": "sha512-z3+Jno3VcJzgNHsN5mEvYMsgCkOZkydqdIwOxjXh45+i2Vs9RGH68Y52vt39izwFSfuYUXhaW+1u7m7+IhCn/g==",
"funding": {
"url": "http://github.com/sponsors/cyberalien"
},
"peerDependencies": {
"react": ">=16"
}
},
"node_modules/@next/env": {
"version": "13.1.6",
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.1.6.tgz",
@ -347,11 +393,33 @@
"url": "https://opencollective.com/unts"
}
},
"node_modules/@popperjs/core": {
"version": "2.11.6",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@rushstack/eslint-patch": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
"integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
},
"node_modules/@semantic-ui-react/event-stack": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz",
"integrity": "sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ==",
"dependencies": {
"exenv": "^1.2.2",
"prop-types": "^15.6.2"
},
"peerDependencies": {
"react": "^16.0.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@swc/helpers": {
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
@ -747,6 +815,14 @@
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
"node_modules/clsx": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
"integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
"engines": {
"node": ">=6"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -862,6 +938,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
"engines": {
"node": ">=0.10"
}
},
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@ -1454,6 +1538,11 @@
"node": ">=0.10.0"
}
},
"node_modules/exenv": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
"integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw=="
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@ -1600,6 +1689,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/generate-function": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
"dependencies": {
"is-property": "^1.0.2"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
@ -1818,6 +1915,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@ -2048,6 +2156,11 @@
"node": ">=8"
}
},
"node_modules/is-property": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
},
"node_modules/is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@ -2180,6 +2293,11 @@
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"node_modules/jquery": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
"integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg=="
},
"node_modules/js-sdsl": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
@ -2238,6 +2356,11 @@
"node": ">=4.0"
}
},
"node_modules/keyboard-key": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.1.0.tgz",
"integrity": "sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ=="
},
"node_modules/language-subtag-registry": {
"version": "0.3.22",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
@ -2277,11 +2400,26 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
"node_modules/long": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
"integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@ -2348,6 +2486,51 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/mysql2": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.1.2.tgz",
"integrity": "sha512-NXz6sUvHSEOKz1jv3koSga7eb2dHrwD/mnPmqbbZzMRvjQcSpb0Eh0ectWyYt1U60CLlEbjoA3XYjjbbReRF5Q==",
"dependencies": {
"denque": "^2.1.0",
"generate-function": "^2.3.1",
"iconv-lite": "^0.6.3",
"long": "^5.2.1",
"lru-cache": "^7.14.1",
"named-placeholders": "^1.1.3",
"seq-queue": "^0.0.5",
"sqlstring": "^2.3.2"
},
"engines": {
"node": ">= 8.0"
}
},
"node_modules/mysql2/node_modules/lru-cache": {
"version": "7.14.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
"integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==",
"engines": {
"node": ">=12"
}
},
"node_modules/named-placeholders": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
"integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
"dependencies": {
"lru-cache": "^7.14.1"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/named-placeholders/node_modules/lru-cache": {
"version": "7.14.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
"integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==",
"engines": {
"node": ">=12"
}
},
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
@ -2751,11 +2934,53 @@
"react": "^18.2.0"
}
},
"node_modules/react-fast-compare": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
"integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
},
"node_modules/react-h5-audio-player": {
"version": "3.8.6",
"resolved": "https://registry.npmjs.org/react-h5-audio-player/-/react-h5-audio-player-3.8.6.tgz",
"integrity": "sha512-eyViI47jRRybCcCkGdoAMd6yfhg3UMyXp39mqOWCbNQfAYI8U6zC0+0DLZjhrB7//DJtHhZx8h1q99HMxYkMWQ==",
"dependencies": {
"@babel/runtime": "^7.10.2",
"@iconify/icons-mdi": "~1.1.0",
"@iconify/react": "^3.1.3"
},
"peerDependencies": {
"react": "^16.3.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/react-popper": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
"integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==",
"dependencies": {
"react-fast-compare": "^3.0.1",
"warning": "^4.0.2"
},
"peerDependencies": {
"@popperjs/core": "^2.0.0",
"react": "^16.8.0 || ^17 || ^18",
"react-dom": "^16.8.0 || ^17 || ^18"
}
},
"node_modules/react-yandex-metrika": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/react-yandex-metrika/-/react-yandex-metrika-2.6.0.tgz",
"integrity": "sha512-8K4wExsNZtY3DTxh1G8a+zWH9Pg8fw23MJcoJ4I/562qrHRnh7L5nteq3lnNL58dnNQbuuHIRoGgMjIo+r1GjA==",
"peerDependencies": {
"prop-types": "*",
"react": "*"
}
},
"node_modules/regenerator-runtime": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
@ -2870,6 +3095,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
@ -2878,6 +3108,38 @@
"loose-envify": "^1.1.0"
}
},
"node_modules/semantic-ui-css": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.5.0.tgz",
"integrity": "sha512-jIWn3WXXE2uSaWCcB+gVJVRG3masIKtTMNEP2X8Aw909H2rHpXGneYOxzO3hT8TpyvB5/dEEo9mBFCitGwoj1A==",
"dependencies": {
"jquery": "x.*"
}
},
"node_modules/semantic-ui-react": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-2.1.4.tgz",
"integrity": "sha512-7CxjBoFUfH7fUvtn+SPkkIocthUD9kV3niF1mUMa9TbeyPAf2brtRCZBlT2OpHaXmkscFzGjEfhbJo9gKfotzQ==",
"dependencies": {
"@babel/runtime": "^7.10.5",
"@fluentui/react-component-event-listener": "~0.63.0",
"@fluentui/react-component-ref": "~0.63.0",
"@popperjs/core": "^2.6.0",
"@semantic-ui-react/event-stack": "^3.1.3",
"clsx": "^1.1.1",
"keyboard-key": "^1.1.0",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"prop-types": "^15.7.2",
"react-is": "^16.8.6 || ^17.0.0 || ^18.0.0",
"react-popper": "^2.3.0",
"shallowequal": "^1.1.0"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@ -2892,6 +3154,16 @@
"node": ">=10"
}
},
"node_modules/seq-queue": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
},
"node_modules/shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@ -2940,6 +3212,14 @@
"node": ">=0.10.0"
}
},
"node_modules/sqlstring": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/stop-iteration-iterator": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
@ -3221,6 +3501,14 @@
"punycode": "^2.1.0"
}
},
"node_modules/warning": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
"integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",

@ -5,7 +5,7 @@
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"start": "next start -p 3002",
"lint": "next lint"
},
"dependencies": {
@ -15,9 +15,14 @@
"@types/react-dom": "18.0.10",
"eslint": "8.33.0",
"eslint-config-next": "13.1.6",
"mysql2": "^3.1.2",
"next": "13.1.6",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-h5-audio-player": "^3.8.6",
"react-yandex-metrika": "^2.6.0",
"semantic-ui-css": "^2.5.0",
"semantic-ui-react": "^2.1.4",
"typescript": "4.9.5"
}
}

@ -1,91 +1,137 @@
import Image from 'next/image'
import { Inter } from '@next/font/google'
import styles from './page.module.css'
"use client";
const inter = Inter({ subsets: ['latin'] })
import React, { useState, useEffect} from 'react';
import {
Container,
Grid,
Header,
List,
Segment,
Label,
} from 'semantic-ui-react';
import { Item } from 'semantic-ui-react';
import 'semantic-ui-css/semantic.min.css';
import AudioPlayer from 'react-h5-audio-player';
type Props = {
id: number;
audio: string;
description: string;
urlImg: string;
title: string;
children: Node;
}
export default function Home() {
return (
<main className={styles.main}>
<div className={styles.description}>
<p>
Get started by editing&nbsp;
<code className={styles.code}>src/app/page.tsx</code>
</p>
<div>
<a
href="https://vercel.com?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
By{' '}
<Image
src="/vercel.svg"
alt="Vercel Logo"
className={styles.vercelLogo}
width={100}
height={24}
priority
/>
</a>
</div>
</div>
<div className={styles.center}>
<Image
className={styles.logo}
src="/next.svg"
alt="Next.js Logo"
width={180}
height={37}
priority
const PodcastBlocks: React.FC<Props> = ({id, audio, description, urlImg, title}) => (
<>
<Item>
<Item.Image size='medium' src={'img/'+urlImg} />
<Item.Content>
<Item.Header as='a'>{title}</Item.Header>
<Item.Meta>
<span className='cinema'></span>
</Item.Meta>
<Item.Description>
{description}
</Item.Description>
<AudioPlayer
src={"audio/"+audio}
onPlay={e => console.log(id)}
// other props here
/>
<div className={styles.thirteen}>
<Image src="/thirteen.svg" alt="13" width={40} height={31} priority />
</div>
</div>
<Item.Extra>
<Label icon='globe' content='-' />
</Item.Extra>
</Item.Content>
</Item>
</>
)
<div className={styles.grid}>
<a
href="https://beta.nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
className={styles.card}
target="_blank"
rel="noopener noreferrer"
>
<h2 className={inter.className}>
Docs <span>-&gt;</span>
</h2>
<p className={inter.className}>
Find in-depth information about Next.js features and API.
</p>
</a>
<a
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
className={styles.card}
target="_blank"
rel="noopener noreferrer"
>
<h2 className={inter.className}>
Templates <span>-&gt;</span>
</h2>
<p className={inter.className}>Explore the Next.js 13 playground.</p>
</a>
export default function Home() {
interface IUser {
[x: string]: any;
name: string;
};
const [data, setData] = useState<IUser>();
const [isLoading, setLoading] = useState(false)
<a
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
className={styles.card}
target="_blank"
rel="noopener noreferrer"
>
<h2 className={inter.className}>
Deploy <span>-&gt;</span>
</h2>
<p className={inter.className}>
Instantly deploy your Next.js site to a shareable URL with Vercel.
useEffect(() => {
setLoading(true)
fetch('/api/podcasts/all')
.then((res) => res.json())
.then((data) => {
setData(data);
setLoading(false);
})
}, [])
if (isLoading) return <p>Загрузка...</p>
if (!data) return <p>Нет интернета</p>
const podcasts = data.map((obj: JSX.IntrinsicAttributes & Props, index: React.Key | null | undefined) => <PodcastBlocks key={index} {...obj}/> );
return (
<>
<Segment style={{ padding: '8em 0em' }} vertical>
<Grid container stackable verticalAlign='middle'>
<Grid.Row>
<Grid.Column width={8} textAlign='center'>
<Header as='h3' style={{ fontSize: '4em' }}>
BlogBaster
</Header>
<Header as='h3' style={{ fontSize: '2em' }}>
Увлечены. Качественно.
За новое звучание.
</Header>
<p style={{ fontSize: '1.33em' }}>
Если вы хотите стать нашим партнером или рекламодателем пишите на podcast@blogbaster.xyz
</p>
</Grid.Column>
</Grid.Row>
</Grid>
</Segment>
<Segment style={{ padding: '8em 0em' }} vertical>
<Container textAlign='left'>
<Item.Group>
{podcasts}
</Item.Group>
</Container>
</Segment>
<Segment inverted vertical style={{ padding: '5em 0em' }}>
<Container>
<Grid divided inverted stackable>
<Grid.Row>
<Grid.Column width={3}>
<Header inverted as='h4' content='Социальные сети' />
<List link inverted>
<List.Item as='a'>Вконтакте</List.Item>
<List.Item as='a'>Telegram</List.Item>
</List>
</Grid.Column>
<Grid.Column width={3}>
<Header inverted as='h4' content='Платформы' />
<List link inverted>
<List.Item as='a'>Яндекс музыка</List.Item>
<List.Item as='a'>Google подкасты</List.Item>
<List.Item as='a'>Apple подкасты</List.Item>
</List>
</Grid.Column>
<Grid.Column width={7}>
<Header as='h4' inverted>
О нас
</Header>
<p>
BlogBaster 2022
</p>
</a>
</div>
</main>
</Grid.Column>
</Grid.Row>
</Grid>
</Container>
</Segment>
</>
)
}

@ -0,0 +1,29 @@
import { writeFileSync } from "fs";
import { getAllPosts } from "./posts";
import RSS from "rss";
const post = [{title:'ddee', url:'dfdf', date:'12.12.22', description:'dfdf dfdf dfdf'}]
export default async function getRSS() {
const siteURL = "https://yourdomain.com";
const allBlogs = getAllPosts();
const feed = new RSS({
title: "Your Name",
description: "your description",
site_url: siteURL,
feed_url: `${siteURL}/feed.xml`,
language: "en",
pubDate: new Date(),
copyright: `All rights reserved ${new Date().getFullYear()}, Your Name`,
});
post.map((post) => {
feed.item({
title: post.title,
url: `${siteURL}/blogs/${post.slug}`,
date: post.date,
description: post.excerpt,
});
});
writeFileSync("../../public/feed.xml", feed.xml({ indent: true }));
}

@ -0,0 +1,13 @@
export function getAllPosts() {
const posts = getSlugs()
.map((slug) => {
return getFrontMatter(slug);
})
.filter((post) => post != null || post != undefined) // Filter post if it is not published
.sort((a, b) => {
if (new Date(a.date) > new Date(b.date)) return -1;
if (new Date(a.date) < new Date(b.date)) return 1;
return 0;
});
return posts;
}

@ -1,13 +0,0 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
type Data = {
name: string
}
export default function handler(
req: NextApiRequest,
res: NextApiResponse<Data>
) {
res.status(200).json({ name: 'John Doe' })
}

@ -0,0 +1,13 @@
import Select from "../../../server/db/select";
import type { NextApiRequest, NextApiResponse } from 'next';
const sql = "SELECT * FROM podcasts WHERE status=1";
export default function handler(
req: NextApiRequest,
res: NextApiResponse
) {
Select(sql, function(data){
res.status(200).json(data);
})
}

@ -0,0 +1,35 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
import Select from "../../../../../server/db/select";
import Insert from "../../../../../server/db/insert";
import { getRssXml, Items } from '../../../../../сomponents/podcasts';
const id = 1;
const sql_company = "SELECT * FROM podcasts, company WHERE podcasts.id="+id;
const sql_items = "SELECT * FROM `podcasts`, items, company WHERE podcasts.id=items.id_podcasts and podcasts.id="+id;
const sql_userAgent = "INSERT INTO views (id_podcasts, userAgent,ip) VALUES (?,?,?)";
export default function handler(
req: NextApiRequest,
res: NextApiResponse
) {
const views = [id, req.headers['user-agent'], req.socket.remoteAddress]
console.log(views);
Select(sql_company, function(data_company : any){
Select(sql_items, function(data_items : any){
res.setHeader('Content-Type', 'text/xml');
res.status(200).send(getRssXml(data_company[0])+data_items.map((rows : any) => Items(rows))+'</channel> </rss>');
})
})
Insert(sql_userAgent, views as string[], function(message){
console.log(message);
})
}

@ -0,0 +1,117 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
import Select from "../../../../../server/db/select";
const sql = "SELECT * FROM podcasts WHERE status=1 and podcasts='Поуехали'";
const title ='Поуехали';
const atom_link = 'https://blogbaster.xyz/api/podcasts/lets-go/';
const email = 'crapsh@gmail.com';
const nameCompanies= 'BlogBaster';
const description = 'Интервью с людьми, которые переехали за границу на ПМЖ. Аргентина, Америка, Турция, Грузия, Израиль… зачем, сколько и почему?';
const webSite = 'https://blogbaster.xyz';
const urlImg = 'https://blogbaster.xyz/img/poyexali.jpg';
const lastBuildDate = 'Fri, 06 May 2022 15:30:47 +0000';
interface Rows {
episode: number;
podcasts: string;
title: string;
description: string;
guid: string;
pubDate: string;
duration: number;
urlImg: string;
fileSize: number;
audio: string;
}
const item = (data: Rows) => {
let items =`
<item>
<itunes:episodeType>full</itunes:episodeType>
<itunes:episode>`+data.episode+`</itunes:episode>
<itunes:season>1</itunes:season>
<title><![CDATA[`+data.podcasts+': '+data.title+`]]></title>
<description><![CDATA[`+data.description+`]]></description>
<googleplay:description>`+data.description+`</googleplay:description>
<itunes:summary>`+data.description+`</itunes:summary>
<guid isPermaLink="false">`+data.guid+`</guid>
<pubDate>`+data.pubDate+`</pubDate>
<itunes:duration>`+data.duration+`</itunes:duration>
<link>`+webSite+'/podcast/'+data.guid+`</link>
<googleplay:image href="/img/`+data.urlImg+`"/>
<itunes:image href="/img/`+data.urlImg+`"/>
<googleplay:explicit>no</googleplay:explicit>
<itunes:explicit>false</itunes:explicit>
<enclosure url="'https://blogbaster.xyz/audio/`+data.audio+`" length="`+data.fileSize+`" type="audio/mpeg"/>
<media:title>`+data.podcasts+': '+data.title+`</media:title>
<media:content url="https://blogbaster.xyz/audio/`+data.audio+`" fileSize="`+data.fileSize+`" type="audio/mpeg" medium="audio" isDefault="true" expression="full" bitrate="320" channels="2" duration="`+data.duration+`" lang="ru"/>
<media:thumbnail url="/img/`+data.urlImg+`" width="150" height="150"/>
<media:copyright url="`+webSite+`">© 2022 `+nameCompanies+`</media:copyright>
<creativeCommons:license>https://creativecommons.org/licenses/by/4.0/</creativeCommons:license>
</item>`;
return(items)
}
const getRssXml = (data: Array<string>) =>
`<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0/play-podcasts.xsd"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>
<channel>
<title>`+title+`</title>
<atom:link href="`+atom_link+`" rel="self" type="application/rss+xml"/>
<googleplay:owner>`+email+`</googleplay:owner>
<itunes:owner>
<itunes:name>`+nameCompanies+`</itunes:name>
<itunes:email>`+email+`</itunes:email>
</itunes:owner>
<googleplay:author>`+nameCompanies+`</googleplay:author>
<itunes:author>`+nameCompanies+`</itunes:author>
<description>`+description+`</description>
<googleplay:description>`+description+`</googleplay:description>
<itunes:summary>`+description+`</itunes:summary>
<image>
<link>`+webSite+`</link>
<title>`+nameCompanies+`</title>
<url>`+urlImg+`</url>
</image>
<googleplay:image href="`+urlImg+`"/>
<itunes:image href="`+urlImg+`"/>
<itunes:category text="Society &amp; Culture">
<itunes:category text="Places &amp; Travel"/>
</itunes:category>
<itunes:category text="Science">
<itunes:category text="Social Sciences"/>
</itunes:category>
<language>ru</language>
<link>`+webSite+`</link>
<copyright>© 2023 `+nameCompanies+`</copyright>
<itunes:type>episodic</itunes:type>
<googleplay:explicit>no</googleplay:explicit>
<itunes:explicit>no</itunes:explicit>
<lastBuildDate>`+lastBuildDate+`</lastBuildDate>
<googleplay:block>yes</googleplay:block>
`+data.map((rows : any) => item(rows))+`
</channel>
</rss>`;
export default function handler(
req: NextApiRequest,
res: NextApiResponse
) {
const userAgent = req.headers['user-agent'];
console.log(userAgent);
Select(sql, function(data : any){
res.setHeader('Content-Type', 'text/xml');
res.status(200).send(getRssXml(data));
})
}

@ -0,0 +1,117 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
import Select from "../../../../../server/db/select";
const sql = "SELECT * FROM podcasts WHERE status=1 and podcasts='Нравится слушать'";
const title ='Нравится слушать';
const atom_link = 'https://blogbaster.xyz/api/podcasts/like-to-listen/';
const email = 'crapsh@gmail.com';
const nameCompanies= 'BlogBaster';
const description = 'Мы молодая команда из Краснодара, создаем подкасты для молодежи';
const webSite = 'https://blogbaster.xyz';
const urlImg = 'https://blogbaster.xyz/img/Like-to-listen.jpg';
const lastBuildDate = 'Fri, 06 May 2022 15:30:47 +0000';
interface Rows {
episode: number;
podcasts: string;
title: string;
description: string;
guid: string;
pubDate: string;
duration: number;
urlImg: string;
fileSize: number;
audio: string;
}
const item = (data: Rows) => {
let items =`
<item>
<itunes:episodeType>full</itunes:episodeType>
<itunes:episode>`+data.episode+`</itunes:episode>
<itunes:season>1</itunes:season>
<title>`+data.podcasts+': '+data.title+`</title>
<description>`+data.description+`</description>
<googleplay:description>`+data.description+`</googleplay:description>
<itunes:summary>`+data.description+`</itunes:summary>
<guid isPermaLink="false">`+data.guid+`</guid>
<pubDate>`+data.pubDate+`</pubDate>
<itunes:duration>`+data.duration+`</itunes:duration>
<link>`+webSite+'/podcast/'+data.guid+`</link>
<googleplay:image href="/img/`+data.urlImg+`"/>
<itunes:image href="/img/`+data.urlImg+`"/>
<googleplay:explicit>no</googleplay:explicit>
<itunes:explicit>false</itunes:explicit>
<enclosure url="'https://blogbaster.xyz/audio/`+data.audio+`" length="`+data.fileSize+`" type="audio/mpeg"/>
<media:title>`+data.podcasts+': '+data.title+`</media:title>
<media:content url="https://blogbaster.xyz/audio/`+data.audio+`" fileSize="`+data.fileSize+`" type="audio/mpeg" medium="audio" isDefault="true" expression="full" bitrate="320" channels="2" duration="`+data.duration+`" lang="ru"/>
<media:thumbnail url="/img/`+data.urlImg+`" width="150" height="150"/>
<media:copyright url="`+webSite+`">© 2022 `+nameCompanies+`</media:copyright>
<creativeCommons:license>https://creativecommons.org/licenses/by/4.0/</creativeCommons:license>
</item>`;
return(items)
}
const getRssXml = (data: Array<string>) =>
`<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0/play-podcasts.xsd"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>
<channel>
<title>`+title+`</title>
<atom:link href="`+atom_link+`" rel="self" type="application/rss+xml"/>
<googleplay:owner>`+email+`</googleplay:owner>
<itunes:owner>
<itunes:name>`+nameCompanies+`</itunes:name>
<itunes:email>`+email+`</itunes:email>
</itunes:owner>
<googleplay:author>`+nameCompanies+`</googleplay:author>
<itunes:author>`+nameCompanies+`</itunes:author>
<description>`+description+`</description>
<googleplay:description>`+description+`</googleplay:description>
<itunes:summary>`+description+`</itunes:summary>
<image>
<link>`+webSite+'/'+webSite+`</link>
<title>`+nameCompanies+`</title>
<url>`+webSite+'/'+urlImg+`</url>
</image>
<googleplay:image href="`+webSite+'/'+urlImg+`"/>
<itunes:image href="`+webSite+'/'+urlImg+`"/>
<itunes:category text="Society &amp; Culture">
<itunes:category text="Places &amp; Travel"/>
</itunes:category>
<itunes:category text="Science">
<itunes:category text="Social Sciences"/>
</itunes:category>
<language>ru</language>
<link>`+webSite+`</link>
<copyright>© 2022 `+nameCompanies+`</copyright>
<itunes:type>episodic</itunes:type>
<googleplay:explicit>no</googleplay:explicit>
<itunes:explicit>no</itunes:explicit>
<lastBuildDate>`+lastBuildDate+`</lastBuildDate>
<googleplay:block>yes</googleplay:block>
`+data.map((rows : any) => item(rows))+`
</channel>
</rss>`;
export default function handler(
req: NextApiRequest,
res: NextApiResponse
) {
const userAgent = req.headers['user-agent'];
console.log(userAgent);
Select(sql, function(data : any){
res.setHeader('Content-Type', 'text/xml');
res.status(200).send(getRssXml(data));
})
}

@ -0,0 +1,13 @@
import mysql from "mysql2";
const pool = mysql.createPool({
host: process.env.HOST,
user: process.env.DATABASE,
database: process.env.DATABASE,
password: process.env.PASSWORD,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
module.exports = pool;

@ -0,0 +1,14 @@
const pool = require("./connect");
import {QueryError} from 'mysql2';
interface definitionInterface{
(message:string):void;
}
export default function Insert(sql: string, argument: string[], callback: definitionInterface) {
pool.query(sql, argument, (err: QueryError, rows: string) => {
if (err) {
return console.error(err.message);
}
pool.releaseConnection(pool);
});
}

@ -0,0 +1,12 @@
const pool = require("./connect");
import {QueryError} from 'mysql2';
interface definitionInterface{
(message:string):void;
}
export default function Select(sql: string, callback: definitionInterface) {
pool.query(sql, (err: QueryError, rows: string) => {
callback(rows);
pool.releaseConnection(pool);
});
}

@ -0,0 +1,42 @@
interface Props {
episode: number;
title: string;
title_items : string;
description: string;
guid: string;
pubDate: string;
duration: number;
urlImg: string;
fileSize: number;
audio: string;
webSite: string;
nameCompanies: string;
}
export const Items = (data: Props) => {
let item =`
<item>
<itunes:episodeType>full</itunes:episodeType>
<itunes:episode>`+data.episode+`</itunes:episode>
<itunes:season>1</itunes:season>
<title><![CDATA[`+data.title+': '+data.title_items +`]]></title>
<description><![CDATA[`+data.description+`]]></description>
<googleplay:description>`+data.description+`</googleplay:description>
<itunes:summary>`+data.description+`</itunes:summary>
<guid isPermaLink="false">`+data.guid+`</guid>
<pubDate>`+data.pubDate+`</pubDate>
<itunes:duration>`+data.duration+`</itunes:duration>
<link>`+data.webSite+'/podcast/'+data.guid+`</link>
<googleplay:image href="`+data.webSite+'/img/'+data.urlImg+`"/>
<itunes:image href="`+data.webSite+'/img/'+data.urlImg+`"/>
<googleplay:explicit>no</googleplay:explicit>
<itunes:explicit>false</itunes:explicit>
<enclosure url="`+data.webSite+'/audio/'+data.audio+`" length="`+data.fileSize+`" type="audio/mpeg"/>
<media:title>`+data.title+': '+data.title_items +`</media:title>
<media:content url="`+data.webSite+'/audio/'+data.audio+`" fileSize="`+data.fileSize+`" type="audio/mpeg" medium="audio" isDefault="true" expression="full" bitrate="320" channels="2" duration="`+data.duration+`" lang="ru"/>
<media:thumbnail url="`+data.webSite+'/img/'+data.urlImg+`" width="150" height="150"/>
<media:copyright url="`+data.webSite+`">© 2022 `+data.nameCompanies+`</media:copyright>
<creativeCommons:license>https://creativecommons.org/licenses/by/4.0/</creativeCommons:license>
</item>`;
return(item)
};

@ -0,0 +1,61 @@
import { Items } from './Item'
interface Props {
map(arg0: (rows: any) => string): unknown;
title: string,
atom_link: string,
email: string,
nameCompanies: string,
description: string,
webSite: string,
urlImg: string,
lastBuildDate: string
}
export const getRssXml = (data: Props) => {
let item =`
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0/play-podcasts.xsd"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>
<channel>
<title>`+data.title+`</title>
<atom:link href="`+data.atom_link+`" rel="self" type="application/rss+xml"/>
<googleplay:owner>`+data.email+`</googleplay:owner>
<itunes:owner>
<itunes:name>`+data.nameCompanies+`</itunes:name>
<itunes:email>`+data.email+`</itunes:email>
</itunes:owner>
<googleplay:author>`+data.nameCompanies+`</googleplay:author>
<itunes:author>`+data.nameCompanies+`</itunes:author>
<description>`+data.description+`</description>
<googleplay:description>`+data.description+`</googleplay:description>
<itunes:summary>`+data.description+`</itunes:summary>
<image>
<link>`+data.webSite+`</link>
<title>`+data.nameCompanies+`</title>
<url>`+data.webSite+'/'+data.urlImg+`</url>
</image>
<googleplay:image href="`+data.webSite+'/'+data.urlImg+`"/>
<itunes:image href="`+data.webSite+'/'+data.urlImg+`"/>
<itunes:category text="Society &amp; Culture">
<itunes:category text="Places &amp; Travel"/>
</itunes:category>
<itunes:category text="Science">
<itunes:category text="Social Sciences"/>
</itunes:category>
<language>ru</language>
<link>`+data.webSite+`</link>
<copyright>© 2022 `+data.nameCompanies+`</copyright>
<itunes:type>episodic</itunes:type>
<googleplay:explicit>no</googleplay:explicit>
<itunes:explicit>no</itunes:explicit>
<lastBuildDate>`+data.lastBuildDate+`</lastBuildDate>
<googleplay:block>yes</googleplay:block>`;
return(item)
};

@ -0,0 +1,2 @@
export * from './Item'
export * from './getRssXml'
Loading…
Cancel
Save