Merge branch 'iptv-org:master' into master

This commit is contained in:
AntiPontifex 2023-01-17 20:50:38 -05:00 committed by GitHub
commit cc0b06f353
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 288 additions and 247 deletions

View file

@ -34,7 +34,7 @@
| owners | List of channel owners separated by `;`. May contain any characters except `,` and `"`. | Optional | `China Central Television` | | owners | List of channel owners separated by `;`. May contain any characters except `,` and `"`. | Optional | `China Central Television` |
| country | Country code from which the channel is transmitted. A list of all supported countries and their codes can be found in [data/countries.csv](data/countries.csv) | Required | `CN` | | country | Country code from which the channel is transmitted. A list of all supported countries and their codes can be found in [data/countries.csv](data/countries.csv) | Required | `CN` |
| subdivision | Code of the subdivision (e.g., provinces or states) from which the broadcast is transmitted. A list of all supported subdivisions and their codes can be found in [data/subdivisions.csv](data/subdivisions.csv). | Optional | `CN-AH` | | subdivision | Code of the subdivision (e.g., provinces or states) from which the broadcast is transmitted. A list of all supported subdivisions and their codes can be found in [data/subdivisions.csv](data/subdivisions.csv). | Optional | `CN-AH` |
| city | Name of the city from which the channel is transmitted. May only contain `a-z`, `à-ÿ`, `0-9`, `space`, `-`, `'`. | Optional | `Hefei` | | city | The name of the city in English from which the channel is broadcast. May contain any characters except `,` and `"`. | Optional | `Hefei` |
| broadcast_area | List of codes describing the broadcasting area of the channel. Any combination of `r/<region_code>`, `c/<country_code>`, `s/<subdivision_code>`. | Required | `s/CN-AH` | | broadcast_area | List of codes describing the broadcasting area of the channel. Any combination of `r/<region_code>`, `c/<country_code>`, `s/<subdivision_code>`. | Required | `s/CN-AH` |
| languages | List of languages in which the channel is broadcast separated by `;`. A list of all supported languages and their codes can be found in [data/languages.csv](data/languages.csv). | Required | `zho` | | languages | List of languages in which the channel is broadcast separated by `;`. A list of all supported languages and their codes can be found in [data/languages.csv](data/languages.csv). | Required | `zho` |
| categories | List of categories to which this channel belongs separated by `;`. A list of all supported categories can be found in [data/categories.csv](data/categories.csv). | Optional | `general` | | categories | List of categories to which this channel belongs separated by `;`. A list of all supported categories can be found in [data/categories.csv](data/categories.csv). | Optional | `general` |

File diff suppressed because it is too large Load diff

View file

@ -2,63 +2,63 @@ const Joi = require('joi').extend(require('@joi/date'))
const path = require('path') const path = require('path')
module.exports = { module.exports = {
id: Joi.string() id: Joi.string()
.regex(/^[A-Za-z0-9]+\.[a-z]{2}$/) .regex(/^[A-Za-z0-9]+\.[a-z]{2}$/)
.required(), .required(),
name: Joi.string() name: Joi.string()
.regex(/^[a-z0-9-!:&.+'/»#%°$@?\s]+$/i) .regex(/^[a-z0-9-!:&.+'/»#%°$@?\s]+$/i)
.required(), .required(),
alt_names: Joi.array().items( alt_names: Joi.array().items(
Joi.string() Joi.string()
.regex(/^[^",]+$/) .regex(/^[^",]+$/)
.invalid(Joi.ref('name')) .invalid(Joi.ref('name'))
), ),
network: Joi.string() network: Joi.string()
.regex(/^[^",]+$/) .regex(/^[^",]+$/)
.allow(null), .allow(null),
owners: Joi.array().items(Joi.string().regex(/^[^",]+$/)), owners: Joi.array().items(Joi.string().regex(/^[^",]+$/)),
country: Joi.string() country: Joi.string()
.regex(/^[A-Z]{2}$/) .regex(/^[A-Z]{2}$/)
.required(), .required(),
subdivision: Joi.string() subdivision: Joi.string()
.regex(/^[A-Z]{2}-[A-Z0-9]{1,3}$/) .regex(/^[A-Z]{2}-[A-Z0-9]{1,3}$/)
.allow(null), .allow(null),
city: Joi.string() city: Joi.string()
.regex(/^[\sa-zA-Z\u00C0-\u00FF0-9'-]+$/) .regex(/^[^",]+$/)
.allow(null), .allow(null),
broadcast_area: Joi.array().items( broadcast_area: Joi.array().items(
Joi.string() Joi.string()
.regex(/^(s\/[A-Z]{2}-[A-Z0-9]{1,3}|c\/[A-Z]{2}|r\/[A-Z0-9]{3,7})$/) .regex(/^(s\/[A-Z]{2}-[A-Z0-9]{1,3}|c\/[A-Z]{2}|r\/[A-Z0-9]{3,7})$/)
.required() .required()
), ),
languages: Joi.array().items( languages: Joi.array().items(
Joi.string() Joi.string()
.regex(/^[a-z]{3}$/) .regex(/^[a-z]{3}$/)
.required() .required()
), ),
categories: Joi.array().items(Joi.string().regex(/^[a-z]+$/)), categories: Joi.array().items(Joi.string().regex(/^[a-z]+$/)),
is_nsfw: Joi.boolean().strict().required(), is_nsfw: Joi.boolean().strict().required(),
launched: Joi.date().format('YYYY-MM-DD').raw().allow(null), launched: Joi.date().format('YYYY-MM-DD').raw().allow(null),
closed: Joi.date().format('YYYY-MM-DD').raw().allow(null).greater(Joi.ref('launched')), closed: Joi.date().format('YYYY-MM-DD').raw().allow(null).greater(Joi.ref('launched')),
replaced_by: Joi.string() replaced_by: Joi.string()
.regex(/^[A-Za-z0-9]+\.[a-z]{2}$/) .regex(/^[A-Za-z0-9]+\.[a-z]{2}$/)
.allow(null), .allow(null),
website: Joi.string() website: Joi.string()
.uri({ .uri({
scheme: ['http', 'https'] scheme: ['http', 'https']
}) })
.allow(null), .allow(null),
logo: Joi.string() logo: Joi.string()
.uri({ .uri({
scheme: ['https'] scheme: ['https']
}) })
.custom((value, helper) => { .custom((value, helper) => {
const ext = path.extname(value) const ext = path.extname(value)
if (!ext || /(\.png|\.jpeg|\.jpg)/i.test(ext)) { if (!ext || /(\.png|\.jpeg|\.jpg)/i.test(ext)) {
return true return true
} else { } else {
return helper.message(`"logo" has an invalid file extension "${ext}"`) return helper.message(`"logo" has an invalid file extension "${ext}"`)
} }
}) })
.required() .required()
} }