diff --git a/.gh-pages/api/countries.json b/.gh-pages/api/countries.json deleted file mode 100644 index bc0e0a6b..00000000 --- a/.gh-pages/api/countries.json +++ /dev/null @@ -1,1102 +0,0 @@ -{ - "AF": { - "flag": "🇦🇫", - "name": "Afghanistan", - "code": "AF" - }, - "AL": { - "flag": "🇦🇱", - "name": "Albania", - "code": "AL" - }, - "DZ": { - "flag": "🇩🇿", - "name": "Algeria", - "code": "DZ" - }, - "AS": { - "flag": "🇦🇸", - "name": "American Samoa", - "code": "AS" - }, - "AD": { - "flag": "🇦🇩", - "name": "Andorra", - "code": "AD" - }, - "AO": { - "flag": "🇦🇴", - "name": "Angola", - "code": "AO" - }, - "AG": { - "flag": "🇦🇬", - "name": "Antigua & Barbuda", - "code": "AG" - }, - "AR": { - "flag": "🇦🇷", - "name": "Argentina", - "code": "AR" - }, - "AM": { - "flag": "🇦🇲", - "name": "Armenia", - "code": "AM" - }, - "AW": { - "flag": "🇦🇼", - "name": "Aruba", - "code": "AW" - }, - "AU": { - "flag": "🇦🇺", - "name": "Australia", - "code": "AU" - }, - "AT": { - "flag": "🇦🇹", - "name": "Austria", - "code": "AT" - }, - "AZ": { - "flag": "🇦🇿", - "name": "Azerbaijan", - "code": "AZ" - }, - "BS": { - "flag": "🇧🇸", - "name": "Bahamas", - "code": "BS" - }, - "BH": { - "flag": "🇧🇭", - "name": "Bahrain", - "code": "BH" - }, - "BD": { - "flag": "🇧🇩", - "name": "Bangladesh", - "code": "BD" - }, - "BB": { - "flag": "🇧🇧", - "name": "Barbados", - "code": "BB" - }, - "BY": { - "flag": "🇧🇾", - "name": "Belarus", - "code": "BY" - }, - "BE": { - "flag": "🇧🇪", - "name": "Belgium", - "code": "BE" - }, - "BJ": { - "flag": "🇧🇯", - "name": "Benin", - "code": "BJ" - }, - "BT": { - "flag": "🇧🇹", - "name": "Bhutan", - "code": "BT" - }, - "BO": { - "flag": "🇧🇴", - "name": "Bolivia", - "code": "BO" - }, - "BA": { - "flag": "🇧🇦", - "name": "Bosnia", - "code": "BA" - }, - "BW": { - "flag": "🇧🇼", - "name": "Botswana", - "code": "BW" - }, - "BR": { - "flag": "🇧🇷", - "name": "Brazil", - "code": "BR" - }, - "BN": { - "flag": "🇧🇳", - "name": "Brunei", - "code": "BN" - }, - "BG": { - "flag": "🇧🇬", - "name": "Bulgaria", - "code": "BG" - }, - "BF": { - "flag": "🇧🇫", - "name": "Burkina Faso", - "code": "BF" - }, - "BI": { - "flag": "🇧🇮", - "name": "Burundi", - "code": "BI" - }, - "KH": { - "flag": "🇰🇭", - "name": "Cambodia", - "code": "KH" - }, - "CM": { - "flag": "🇨🇲", - "name": "Cameroon", - "code": "CM" - }, - "CA": { - "flag": "🇨🇦", - "name": "Canada", - "code": "CA" - }, - "CV": { - "flag": "🇨🇻", - "name": "Cape Verde", - "code": "CV" - }, - "CF": { - "flag": "🇨🇫", - "name": "Central African Republic", - "code": "CF" - }, - "TD": { - "flag": "🇹🇩", - "name": "Chad", - "code": "TD" - }, - "CL": { - "flag": "🇨🇱", - "name": "Chile", - "code": "CL" - }, - "CN": { - "flag": "🇨🇳", - "name": "China", - "code": "CN" - }, - "CO": { - "flag": "🇨🇴", - "name": "Colombia", - "code": "CO" - }, - "KM": { - "flag": "🇰🇲", - "name": "Comoros", - "code": "KM" - }, - "CG": { - "flag": "🇨🇬", - "name": "Congo - Brazzaville", - "code": "CG" - }, - "CD": { - "flag": "🇨🇩", - "name": "Congo - Kinshasa", - "code": "CD" - }, - "CK": { - "flag": "🇨🇰", - "name": "Cook Islands", - "code": "CK" - }, - "CR": { - "flag": "🇨🇷", - "name": "Costa Rica", - "code": "CR" - }, - "HR": { - "flag": "🇭🇷", - "name": "Croatia", - "code": "HR" - }, - "CU": { - "flag": "🇨🇺", - "name": "Cuba", - "code": "CU" - }, - "CW": { - "flag": "🇨🇼", - "name": "Curaçao", - "code": "CW" - }, - "CY": { - "flag": "🇨🇾", - "name": "Cyprus", - "code": "CY" - }, - "CZ": { - "flag": "🇨🇿", - "name": "Czechia", - "code": "CZ" - }, - "CI": { - "flag": "🇨🇮", - "name": "Côte d’Ivoire", - "code": "CI" - }, - "DK": { - "flag": "🇩🇰", - "name": "Denmark", - "code": "DK" - }, - "DJ": { - "flag": "🇩🇯", - "name": "Djibouti", - "code": "DJ" - }, - "DO": { - "flag": "🇩🇴", - "name": "Dominican Republic", - "code": "DO" - }, - "EC": { - "flag": "🇪🇨", - "name": "Ecuador", - "code": "EC" - }, - "EG": { - "flag": "🇪🇬", - "name": "Egypt", - "code": "EG" - }, - "SV": { - "flag": "🇸🇻", - "name": "El Salvador", - "code": "SV" - }, - "GQ": { - "flag": "🇬🇶", - "name": "Equatorial Guinea", - "code": "GQ" - }, - "ER": { - "flag": "🇪🇷", - "name": "Eritrea", - "code": "ER" - }, - "EE": { - "flag": "🇪🇪", - "name": "Estonia", - "code": "EE" - }, - "SZ": { - "flag": "🇸🇿", - "name": "Eswatini", - "code": "SZ" - }, - "ET": { - "flag": "🇪🇹", - "name": "Ethiopia", - "code": "ET" - }, - "FO": { - "flag": "🇫🇴", - "name": "Faroe Islands", - "code": "FO" - }, - "FJ": { - "flag": "🇫🇯", - "name": "Fiji", - "code": "FJ" - }, - "FI": { - "flag": "🇫🇮", - "name": "Finland", - "code": "FI" - }, - "FR": { - "flag": "🇫🇷", - "name": "France", - "code": "FR" - }, - "GF": { - "flag": "🇬🇫", - "name": "French Guiana", - "code": "GF" - }, - "PF": { - "flag": "🇵🇫", - "name": "French Polynesia", - "code": "PF" - }, - "TF": { - "flag": "🇹🇫", - "name": "French Southern Territories", - "code": "TF" - }, - "GA": { - "flag": "🇬🇦", - "name": "Gabon", - "code": "GA" - }, - "GM": { - "flag": "🇬🇲", - "name": "Gambia", - "code": "GM" - }, - "GE": { - "flag": "🇬🇪", - "name": "Georgia", - "code": "GE" - }, - "DE": { - "flag": "🇩🇪", - "name": "Germany", - "code": "DE" - }, - "GH": { - "flag": "🇬🇭", - "name": "Ghana", - "code": "GH" - }, - "GR": { - "flag": "🇬🇷", - "name": "Greece", - "code": "GR" - }, - "GL": { - "flag": "🇬🇱", - "name": "Greenland", - "code": "GL" - }, - "GP": { - "flag": "🇬🇵", - "name": "Guadeloupe", - "code": "GP" - }, - "GU": { - "flag": "🇬🇺", - "name": "Guam", - "code": "GU" - }, - "GT": { - "flag": "🇬🇹", - "name": "Guatemala", - "code": "GT" - }, - "GN": { - "flag": "🇬🇳", - "name": "Guinea", - "code": "GN" - }, - "GW": { - "flag": "🇬🇼", - "name": "Guinea-Bissau", - "code": "GW" - }, - "HT": { - "flag": "🇭🇹", - "name": "Haiti", - "code": "HT" - }, - "HN": { - "flag": "🇭🇳", - "name": "Honduras", - "code": "HN" - }, - "HK": { - "flag": "🇭🇰", - "name": "Hong Kong", - "code": "HK" - }, - "HU": { - "flag": "🇭🇺", - "name": "Hungary", - "code": "HU" - }, - "IS": { - "flag": "🇮🇸", - "name": "Iceland", - "code": "IS" - }, - "IN": { - "flag": "🇮🇳", - "name": "India", - "code": "IN" - }, - "ID": { - "flag": "🇮🇩", - "name": "Indonesia", - "code": "ID" - }, - "IR": { - "flag": "🇮🇷", - "name": "Iran", - "code": "IR" - }, - "IQ": { - "flag": "🇮🇶", - "name": "Iraq", - "code": "IQ" - }, - "IE": { - "flag": "🇮🇪", - "name": "Ireland", - "code": "IE" - }, - "IL": { - "flag": "🇮🇱", - "name": "Israel", - "code": "IL" - }, - "IT": { - "flag": "🇮🇹", - "name": "Italy", - "code": "IT" - }, - "JM": { - "flag": "🇯🇲", - "name": "Jamaica", - "code": "JM" - }, - "JP": { - "flag": "🇯🇵", - "name": "Japan", - "code": "JP" - }, - "JO": { - "flag": "🇯🇴", - "name": "Jordan", - "code": "JO" - }, - "KZ": { - "flag": "🇰🇿", - "name": "Kazakhstan", - "code": "KZ" - }, - "KE": { - "flag": "🇰🇪", - "name": "Kenya", - "code": "KE" - }, - "KI": { - "flag": "🇰🇮", - "name": "Kiribati", - "code": "KI" - }, - "XK": { - "flag": "🇽🇰", - "name": "Kosovo", - "code": "XK" - }, - "KW": { - "flag": "🇰🇼", - "name": "Kuwait", - "code": "KW" - }, - "KG": { - "flag": "🇰🇬", - "name": "Kyrgyzstan", - "code": "KG" - }, - "LA": { - "flag": "🇱🇦", - "name": "Laos", - "code": "LA" - }, - "LV": { - "flag": "🇱🇻", - "name": "Latvia", - "code": "LV" - }, - "LB": { - "flag": "🇱🇧", - "name": "Lebanon", - "code": "LB" - }, - "LS": { - "flag": "🇱🇸", - "name": "Lesotho", - "code": "LS" - }, - "LR": { - "flag": "🇱🇷", - "name": "Liberia", - "code": "LR" - }, - "LY": { - "flag": "🇱🇾", - "name": "Libya", - "code": "LY" - }, - "LI": { - "flag": "🇱🇮", - "name": "Liechtenstein", - "code": "LI" - }, - "LT": { - "flag": "🇱🇹", - "name": "Lithuania", - "code": "LT" - }, - "LU": { - "flag": "🇱🇺", - "name": "Luxembourg", - "code": "LU" - }, - "MO": { - "flag": "🇲🇴", - "name": "Macao", - "code": "MO" - }, - "MG": { - "flag": "🇲🇬", - "name": "Madagascar", - "code": "MG" - }, - "MW": { - "flag": "🇲🇼", - "name": "Malawi", - "code": "MW" - }, - "MY": { - "flag": "🇲🇾", - "name": "Malaysia", - "code": "MY" - }, - "MV": { - "flag": "🇲🇻", - "name": "Maldives", - "code": "MV" - }, - "ML": { - "flag": "🇲🇱", - "name": "Mali", - "code": "ML" - }, - "MT": { - "flag": "🇲🇹", - "name": "Malta", - "code": "MT" - }, - "MH": { - "flag": "🇲🇭", - "name": "Marshall Islands", - "code": "MH" - }, - "MQ": { - "flag": "🇲🇶", - "name": "Martinique", - "code": "MQ" - }, - "MR": { - "flag": "🇲🇷", - "name": "Mauritania", - "code": "MR" - }, - "MU": { - "flag": "🇲🇺", - "name": "Mauritius", - "code": "MU" - }, - "YT": { - "flag": "🇾🇹", - "name": "Mayotte", - "code": "YT" - }, - "MX": { - "flag": "🇲🇽", - "name": "Mexico", - "code": "MX" - }, - "FM": { - "flag": "🇫🇲", - "name": "Micronesia", - "code": "FM" - }, - "MD": { - "flag": "🇲🇩", - "name": "Moldova", - "code": "MD" - }, - "MC": { - "flag": "🇲🇨", - "name": "Monaco", - "code": "MC" - }, - "MN": { - "flag": "🇲🇳", - "name": "Mongolia", - "code": "MN" - }, - "ME": { - "flag": "🇲🇪", - "name": "Montenegro", - "code": "ME" - }, - "MA": { - "flag": "🇲🇦", - "name": "Morocco", - "code": "MA" - }, - "MZ": { - "flag": "🇲🇿", - "name": "Mozambique", - "code": "MZ" - }, - "MM": { - "flag": "🇲🇲", - "name": "Myanmar", - "code": "MM" - }, - "NA": { - "flag": "🇳🇦", - "name": "Namibia", - "code": "NA" - }, - "NR": { - "flag": "🇳🇷", - "name": "Nauru", - "code": "NR" - }, - "NP": { - "flag": "🇳🇵", - "name": "Nepal", - "code": "NP" - }, - "NL": { - "flag": "🇳🇱", - "name": "Netherlands", - "code": "NL" - }, - "NC": { - "flag": "🇳🇨", - "name": "New Caledonia", - "code": "NC" - }, - "NZ": { - "flag": "🇳🇿", - "name": "New Zealand", - "code": "NZ" - }, - "NI": { - "flag": "🇳🇮", - "name": "Nicaragua", - "code": "NI" - }, - "NE": { - "flag": "🇳🇪", - "name": "Niger", - "code": "NE" - }, - "NG": { - "flag": "🇳🇬", - "name": "Nigeria", - "code": "NG" - }, - "NU": { - "flag": "🇳🇺", - "name": "Niue", - "code": "NU" - }, - "NF": { - "flag": "🇳🇫", - "name": "Norfolk Island", - "code": "NF" - }, - "KP": { - "flag": "🇰🇵", - "name": "North Korea", - "code": "KP" - }, - "MK": { - "flag": "🇲🇰", - "name": "North Macedonia", - "code": "MK" - }, - "MP": { - "flag": "🇲🇵", - "name": "Northern Mariana Islands", - "code": "MP" - }, - "NO": { - "flag": "🇳🇴", - "name": "Norway", - "code": "NO" - }, - "OM": { - "flag": "🇴🇲", - "name": "Oman", - "code": "OM" - }, - "PK": { - "flag": "🇵🇰", - "name": "Pakistan", - "code": "PK" - }, - "PW": { - "flag": "🇵🇼", - "name": "Palau", - "code": "PW" - }, - "PS": { - "flag": "🇵🇸", - "name": "Palestine", - "code": "PS" - }, - "PA": { - "flag": "🇵🇦", - "name": "Panama", - "code": "PA" - }, - "PG": { - "flag": "🇵🇬", - "name": "Papua New Guinea", - "code": "PG" - }, - "PY": { - "flag": "🇵🇾", - "name": "Paraguay", - "code": "PY" - }, - "PE": { - "flag": "🇵🇪", - "name": "Peru", - "code": "PE" - }, - "PH": { - "flag": "🇵🇭", - "name": "Philippines", - "code": "PH" - }, - "PN": { - "flag": "🇵🇳", - "name": "Pitcairn Islands", - "code": "PN" - }, - "PL": { - "flag": "🇵🇱", - "name": "Poland", - "code": "PL" - }, - "PT": { - "flag": "🇵🇹", - "name": "Portugal", - "code": "PT" - }, - "PR": { - "flag": "🇵🇷", - "name": "Puerto Rico", - "code": "PR" - }, - "QA": { - "flag": "🇶🇦", - "name": "Qatar", - "code": "QA" - }, - "RO": { - "flag": "🇷🇴", - "name": "Romania", - "code": "RO" - }, - "RU": { - "flag": "🇷🇺", - "name": "Russia", - "code": "RU" - }, - "RW": { - "flag": "🇷🇼", - "name": "Rwanda", - "code": "RW" - }, - "RE": { - "flag": "🇷🇪", - "name": "Réunion", - "code": "RE" - }, - "SX": { - "flag": "🇸🇽", - "name": "Sint Maarten", - "code": "SX" - }, - "WS": { - "flag": "🇼🇸", - "name": "Samoa", - "code": "WS" - }, - "SM": { - "flag": "🇸🇲", - "name": "San Marino", - "code": "SM" - }, - "SA": { - "flag": "🇸🇦", - "name": "Saudi Arabia", - "code": "SA" - }, - "SN": { - "flag": "🇸🇳", - "name": "Senegal", - "code": "SN" - }, - "RS": { - "flag": "🇷🇸", - "name": "Serbia", - "code": "RS" - }, - "SC": { - "flag": "🇸🇨", - "name": "Seychelles", - "code": "SC" - }, - "SL": { - "flag": "🇸🇱", - "name": "Sierra Leone", - "code": "SL" - }, - "SG": { - "flag": "🇸🇬", - "name": "Singapore", - "code": "SG" - }, - "SK": { - "flag": "🇸🇰", - "name": "Slovakia", - "code": "SK" - }, - "SI": { - "flag": "🇸🇮", - "name": "Slovenia", - "code": "SI" - }, - "SB": { - "flag": "🇸🇧", - "name": "Solomon Islands", - "code": "SB" - }, - "SO": { - "flag": "🇸🇴", - "name": "Somalia", - "code": "SO" - }, - "ZA": { - "flag": "🇿🇦", - "name": "South Africa", - "code": "ZA" - }, - "KR": { - "flag": "🇰🇷", - "name": "South Korea", - "code": "KR" - }, - "SS": { - "flag": "🇸🇸", - "name": "South Sudan", - "code": "SS" - }, - "ES": { - "flag": "🇪🇸", - "name": "Spain", - "code": "ES" - }, - "LK": { - "flag": "🇱🇰", - "name": "Sri Lanka", - "code": "LK" - }, - "BL": { - "flag": "🇧🇱", - "name": "St. Barthélemy", - "code": "BL" - }, - "SH": { - "flag": "🇸🇭", - "name": "St. Helena", - "code": "SH" - }, - "MF": { - "flag": "🇲🇫", - "name": "St. Martin", - "code": "MF" - }, - "SD": { - "flag": "🇸🇩", - "name": "Sudan", - "code": "SD" - }, - "SR": { - "flag": "🇸🇷", - "name": "Suriname", - "code": "SR" - }, - "SE": { - "flag": "🇸🇪", - "name": "Sweden", - "code": "SE" - }, - "CH": { - "flag": "🇨🇭", - "name": "Switzerland", - "code": "CH" - }, - "SY": { - "flag": "🇸🇾", - "name": "Syria", - "code": "SY" - }, - "ST": { - "flag": "🇸🇹", - "name": "São Tomé & Príncipe", - "code": "ST" - }, - "TW": { - "flag": "🇹🇼", - "name": "Taiwan", - "code": "TW" - }, - "TJ": { - "flag": "🇹🇯", - "name": "Tajikistan", - "code": "TJ" - }, - "TZ": { - "flag": "🇹🇿", - "name": "Tanzania", - "code": "TZ" - }, - "TH": { - "flag": "🇹🇭", - "name": "Thailand", - "code": "TH" - }, - "TL": { - "flag": "🇹🇱", - "name": "Timor-Leste", - "code": "TL" - }, - "TG": { - "flag": "🇹🇬", - "name": "Togo", - "code": "TG" - }, - "TK": { - "flag": "🇹🇰", - "name": "Tokelau", - "code": "TK" - }, - "TO": { - "flag": "🇹🇴", - "name": "Tonga", - "code": "TO" - }, - "TT": { - "flag": "🇹🇹", - "name": "Trinidad & Tobago", - "code": "TT" - }, - "TN": { - "flag": "🇹🇳", - "name": "Tunisia", - "code": "TN" - }, - "TR": { - "flag": "🇹🇷", - "name": "Turkey", - "code": "TR" - }, - "TM": { - "flag": "🇹🇲", - "name": "Turkmenistan", - "code": "TM" - }, - "TV": { - "flag": "🇹🇻", - "name": "Tuvalu", - "code": "TV" - }, - "VI": { - "flag": "🇻🇮", - "name": "U.S. Virgin Islands", - "code": "VI" - }, - "UG": { - "flag": "🇺🇬", - "name": "Uganda", - "code": "UG" - }, - "UA": { - "flag": "🇺🇦", - "name": "Ukraine", - "code": "UA" - }, - "AE": { - "flag": "🇦🇪", - "name": "United Arab Emirates", - "code": "AE" - }, - "UK": { - "flag": "🇬🇧", - "name": "United Kingdom", - "code": "UK" - }, - "US": { - "flag": "🇺🇸", - "name": "United States", - "code": "US" - }, - "UY": { - "flag": "🇺🇾", - "name": "Uruguay", - "code": "UY" - }, - "UZ": { - "flag": "🇺🇿", - "name": "Uzbekistan", - "code": "UZ" - }, - "VU": { - "flag": "🇻🇺", - "name": "Vanuatu", - "code": "VU" - }, - "VA": { - "flag": "🇻🇦", - "name": "Vatican City", - "code": "VA" - }, - "VE": { - "flag": "🇻🇪", - "name": "Venezuela", - "code": "VE" - }, - "VN": { - "flag": "🇻🇳", - "name": "Vietnam", - "code": "VN" - }, - "WF": { - "flag": "🇼🇫", - "name": "Wallis & Futuna", - "code": "WF" - }, - "EH": { - "flag": "🇪🇭", - "name": "Western Sahara", - "code": "EH" - }, - "YE": { - "flag": "🇾🇪", - "name": "Yemen", - "code": "YE" - }, - "ZM": { - "flag": "🇿🇲", - "name": "Zambia", - "code": "ZM" - }, - "ZW": { - "flag": "🇿🇼", - "name": "Zimbabwe", - "code": "ZW" - } -} diff --git a/.gh-pages/app.js b/.gh-pages/app.js index 224e920b..6d2ffb14 100644 --- a/.gh-pages/app.js +++ b/.gh-pages/app.js @@ -132,7 +132,7 @@ const App = { } }, async mounted() { - const guides = await fetch('https://iptv-org.github.io/epg/api/channels.json') + const guides = await fetch('api/guides.json') .then(response => response.json()) .catch(console.log) @@ -140,13 +140,13 @@ const App = { .then(response => response.json()) .then(arr => arr.map(c => { - const found = guides.find(g => g.id === c.id) + const found = guides.filter(g => g.channel === c.id) c.key = `${c.id}_${c.name}`.replace(/\s/g, '').toLowerCase() - c.guides = found ? found.guides : [] + c.guides = found.map(f => f.url) || [] return c }) ) - .then(arr => groupBy(arr, 'country')) + .then(arr => _.groupBy(arr, 'country')) .catch(console.log) const countries = await fetch('https://iptv-org.github.io/api/countries.json') diff --git a/.gh-pages/index.html b/.gh-pages/index.html index 7c57b516..faf642a1 100644 --- a/.gh-pages/index.html +++ b/.gh-pages/index.html @@ -6,7 +6,7 @@ iptv-org/epg - +
diff --git a/.github/workflows/auto-update.yml b/.github/workflows/auto-update.yml index 83c30cfe..3a048075 100644 --- a/.github/workflows/auto-update.yml +++ b/.github/workflows/auto-update.yml @@ -90,8 +90,8 @@ jobs: path: scripts/logs/errors.log - uses: actions/upload-artifact@v2 with: - name: channels.json - path: .gh-pages/api/channels.json + name: guides.json + path: .gh-pages/api/guides.json - uses: actions/upload-artifact@v2 with: name: programs.json diff --git a/.readme/template.md b/.readme/template.md index c939a437..19451813 100644 --- a/.readme/template.md +++ b/.readme/template.md @@ -21,64 +21,9 @@ To load a program guide, all you need to do is copy the link to one or more of t #include "./.readme/_ca-provinces.md" -## List of supported channels - -https://iptv-org.github.io/epg/index.html - ## API -### List of channels - -``` -https://iptv-org.github.io/epg/api/channels.json -``` - -``` -[ - ... - { - "id": "CNNUSA.us", - "name": [ - "CNN USA" - ], - "logo": "https://cdn.tvpassport.com/image/station/100x100/cnn.png", - "country": "US", - "guides": [ - "https://iptv-org.github.io/epg/guides/tvtv.us.guide.xml", - ... - ] - }, - ... -] -``` - - +The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository. ## Contribution diff --git a/scripts/commands/update-api.js b/scripts/commands/update-api.js index 41b5c5d9..506cf453 100644 --- a/scripts/commands/update-api.js +++ b/scripts/commands/update-api.js @@ -5,45 +5,35 @@ const DB_DIR = process.env.DB_DIR || 'scripts/database' const API_DIR = process.env.API_DIR || '.gh-pages/api' async function main() { - await saveToChannelsJson(await loadChannels()) + await saveToGuidesJson(await loadGuides()) await saveToProgramsJson(await loadPrograms()) } main() -async function loadChannels() { - logger.info('Loading channels from database...') +async function loadGuides() { + logger.info('Loading guides from database...') await db.channels.load() const channels = await db.channels.find({}).sort({ xmltv_id: 1 }) - const output = {} + const output = [] for (const channel of channels) { - if (!output[channel.xmltv_id]) { - output[channel.xmltv_id] = { - id: channel.xmltv_id, - name: [], - logo: channel.logo || null, - country: channel.country, - guides: [] - } - } else { - output[channel.xmltv_id].logo = output[channel.xmltv_id].logo || channel.logo - } - - output[channel.xmltv_id].name.push(channel.name) - output[channel.xmltv_id].name = _.uniq(output[channel.xmltv_id].name) channel.groups.forEach(group => { if (channel.programCount) { - output[channel.xmltv_id].guides.push( - `https://iptv-org.github.io/epg/guides/${group}.epg.xml` - ) + output.push({ + channel: channel.xmltv_id, + display_name: channel.name, + site: channel.site, + lang: channel.lang, + url: `https://iptv-org.github.io/epg/guides/${group}.epg.xml` + }) } }) } - return Object.values(output) + return output } async function loadPrograms() { @@ -76,10 +66,10 @@ async function loadPrograms() { return programs } -async function saveToChannelsJson(channels = []) { - const channelsPath = `${API_DIR}/channels.json` +async function saveToGuidesJson(guides = []) { + const channelsPath = `${API_DIR}/guides.json` logger.info(`Saving to "${channelsPath}"...`) - await file.create(channelsPath, JSON.stringify(channels)) + await file.create(channelsPath, JSON.stringify(guides)) } async function saveToProgramsJson(programs = []) { diff --git a/tests/__data__/expected/api/channels.json b/tests/__data__/expected/api/channels.json deleted file mode 100644 index d459d674..00000000 --- a/tests/__data__/expected/api/channels.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"BravoEast.us","name":["Bravo East"],"logo":"https://www.directv.com/images/logos/channels/dark/large/579.png","country":"US","guides":[]},{"id":"CNNInternationalEurope.us","name":["CNN International Europe","CNN Int"],"logo":"https://www.magticom.ge/images/channels/MjAxOC8wOS8xMC9lZmJhNWU5Yy0yMmNiLTRkMTAtOWY5Ny01ODM0MzY0ZTg0MmEuanBn.jpg","country":"US","guides":["https://iptv-org.github.io/epg/guides/fr/chaines-tv.orange.fr.epg.xml"]},{"id":"MNetMovies2.za","name":["M-Net Movies 2"],"logo":"https://rndcdn.dstv.com/dstvcms/2020/08/31/M-Net_Movies_2_Logo_4-3_lightbackground_xlrg.png","country":"ZA","guides":["https://iptv-org.github.io/epg/guides/zw/dstv.com.epg.xml"]}] \ No newline at end of file diff --git a/tests/__data__/expected/api/guides.json b/tests/__data__/expected/api/guides.json new file mode 100644 index 00000000..8c564fdd --- /dev/null +++ b/tests/__data__/expected/api/guides.json @@ -0,0 +1 @@ +[{"channel":"CNNInternationalEurope.us","display_name":"CNN International Europe","site":"chaines-tv.orange.fr","lang":"fr","url":"https://iptv-org.github.io/epg/guides/fr/chaines-tv.orange.fr.epg.xml"},{"channel":"CNNInternationalEurope.us","display_name":"CNN International Europe","site":"chaines-tv.orange.fr","lang":"fr","url":"https://iptv-org.github.io/epg/guides/bh/chaines-tv.orange.fr.epg.xml"},{"channel":"MNetMovies2.za","display_name":"M-Net Movies 2","site":"dstv.com","lang":"en","url":"https://iptv-org.github.io/epg/guides/zw/dstv.com.epg.xml"}] \ No newline at end of file diff --git a/tests/__data__/expected/guides/bh/chaines-tv.orange.fr.epg.xml b/tests/__data__/expected/guides/bh/chaines-tv.orange.fr.epg.xml new file mode 100644 index 00000000..9b28bc7d --- /dev/null +++ b/tests/__data__/expected/guides/bh/chaines-tv.orange.fr.epg.xml @@ -0,0 +1,35 @@ + +CNN International Europehttps://chaines-tv.orange.fr +CNN Newsroom SundayСвежая мировая информационная сводка от CNN. О политике, экономике, общественной жизни, культуре, спорте.Category1Category2 +Fareed Zakaria GPSИнтервью с главными игроками мировой политики.Category1 +African Voices Changemakers. 114-я серия114-я серия. Африка сегодня - люди, новости, события. +Marketplace Africa. 549-я серия549-я серия. Информационная передача об экономических событиях африканского региона. Анализируются проблемы, даются экономические прогнозы. +Marketplace Africa. 548-я серия548-я серия. Информационная передача об экономических событиях африканского региона. Анализируются проблемы, даются экономические прогнозы. +TBDИнформационно-познавательный проект CNN. +Inside Africa. 586-я серия586-я серия. Своеобразное "путешествие" по Африке - почувствуйте все разнообразие культур различных стран и регионов континента. +CNN Newsroom with Michael HolmesОбзор самых важных и актуальных новостей и событий из жизни страны и мира. +World SportВсе о главных спортивных событиях мира. Обзоры самых важных спортивных событий, аналитика, мнения экспертов. +CNN Newsroom with Michael HolmesОбзор самых важных и актуальных новостей и событий из жизни страны и мира. +CNN Newsroom with Robyn CurnowОбзор самых важных и актуальных новостей и событий из жизни страны и мира. +World SportВсе о главных спортивных событиях мира. Обзоры самых важных спортивных событий, аналитика, мнения экспертов. +CNN Newsroom with Rosemary ChurchСвежая мировая информационная сводка от CNN. О политике, экономике, общественной жизни, культуре, спорте. +Early StartНовости дня с Кристиной Романс и Дейвом Бриггсом. +New DayСвежий обзор событий в стране и мире. +World SportВсе о главных спортивных событиях мира. Обзоры самых важных спортивных событий, аналитика, мнения экспертов. +First Move with Julia ChatterleyНесколько больших историй, связанных с открытием рынков в США. +Connect the WorldАктуальная мировая информация с разных континентов. +World SportВсе о главных спортивных событиях мира. Обзоры самых важных спортивных событий, аналитика, мнения экспертов. +Connect the WorldАктуальная мировая информация с разных континентов. +One World with Zain AsherОсвещаются важные новости с каждого континента, от политики и текущих дел до социальных вопросов и многого другого. +Marketplace Africa. 549-я серия549-я серия. Информационная передача об экономических событиях африканского региона. Анализируются проблемы, даются экономические прогнозы. +AmanpourСводка новостей от знаменитой ведущей канала CNN. +Hala Gorani TonightИспользуя свой 25-летний журналистский опыт, Хала Горани будет освещать ключевые события в картине дня посредством диалога с гостями и экспертами-аналитиками. +Quest Means BusinessРичард Квест возглавляет группу экспертов и корреспондентов, чтобы предоставить актуальные факты, цифры и анализ из делового мира. +Connecting Africa. 114-я серия114-я серия. Проект, рассказывающий о людях и компаниях, которые совершают революцию в африканском бизнесе, и о тех, кто объединяет континент, выступая за свободную торговлю в Африке. +The Lead with Jake TapperОперативная сводка новостей страны и мира. +The Global Brief with Bianca NobiloGlobal Brief с Бьянкой Нобило проницательно исследует меняющийся мир для меняющейся аудитории, обеспечивая непревзойденную глубину и качество для занятых зрителей в быстро меняющемся мире. +World SportВсе о главных спортивных событиях мира. Обзоры самых важных спортивных событий, аналитика, мнения экспертов. +The Situation Room with Wolf BlitzerКомандный центр новостей, политики и неординарных репортажей со всего мира. +Erin Burnett OutFrontОбсуждение самых важных мировых тем в эфире канала CNN. +Anderson Cooper 360Уникальный взгляд Андерсона Купера на главные события мира. + \ No newline at end of file diff --git a/tests/__data__/expected/logs/update-guides.log b/tests/__data__/expected/logs/update-guides.log index 00aab1ff..f234831b 100644 --- a/tests/__data__/expected/logs/update-guides.log +++ b/tests/__data__/expected/logs/update-guides.log @@ -1,2 +1,3 @@ {"group":"fr/chaines-tv.orange.fr","count":1} +{"group":"bh/chaines-tv.orange.fr","count":1} {"group":"zw/dstv.com","count":1} diff --git a/tests/__data__/expected/readme.md b/tests/__data__/expected/readme.md index 9e1615ca..c408129f 100644 --- a/tests/__data__/expected/readme.md +++ b/tests/__data__/expected/readme.md @@ -46,64 +46,9 @@ To load a program guide, all you need to do is copy the link to one or more of t -## List of supported channels - -https://iptv-org.github.io/epg/index.html - ## API -### List of channels - -``` -https://iptv-org.github.io/epg/api/channels.json -``` - -``` -[ - ... - { - "id": "CNNUSA.us", - "name": [ - "CNN USA" - ], - "logo": "https://cdn.tvpassport.com/image/station/100x100/cnn.png", - "country": "US", - "guides": [ - "https://iptv-org.github.io/epg/guides/tvtv.us.guide.xml", - ... - ] - }, - ... -] -``` - - +The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository. ## Contribution diff --git a/tests/__data__/input/database/channels.db b/tests/__data__/input/database/channels.db index df828e7f..aae9e3ed 100644 --- a/tests/__data__/input/database/channels.db +++ b/tests/__data__/input/database/channels.db @@ -1,4 +1,4 @@ {"lang":"en","xmltv_id":"BravoEast.us","site_id":"237","logo":"https://www.directv.com/images/logos/channels/dark/large/579.png","name":"Bravo East","site":"directv.com","channelsPath":"sites/directv.com/directv.com_us.channels.xml","configPath":"sites/directv.com/directv.com.config.js","groups":["us/directv.com"],"cluster_id":84,"country":"US","programCount":0,"_id":"00AluKCrCnfgrl8W"} -{"lang":"fr","country":"US","xmltv_id":"CNNInternationalEurope.us","site_id":"53","logo":null,"name":"CNN International Europe","site":"chaines-tv.orange.fr","channelsPath":"sites/chaines-tv.orange.fr/chaines-tv.orange.fr_fr.channels.xml","configPath":"tests/__data__/input/sites/example.com.config.js","groups":["fr/chaines-tv.orange.fr"],"cluster_id":1,"programCount":32,"_id":"0Wefq0oMR3feCcuY"} +{"lang":"fr","country":"US","xmltv_id":"CNNInternationalEurope.us","site_id":"53","logo":null,"name":"CNN International Europe","site":"chaines-tv.orange.fr","channelsPath":"sites/chaines-tv.orange.fr/chaines-tv.orange.fr_fr.channels.xml","configPath":"tests/__data__/input/sites/example.com.config.js","groups":["fr/chaines-tv.orange.fr", "bh/chaines-tv.orange.fr"],"cluster_id":1,"programCount":32,"_id":"0Wefq0oMR3feCcuY"} {"lang":"ru","country":"US","xmltv_id":"CNNInternationalEurope.us","site_id":"140","logo":"https://www.magticom.ge/images/channels/MjAxOC8wOS8xMC9lZmJhNWU5Yy0yMmNiLTRkMTAtOWY5Ny01ODM0MzY0ZTg0MmEuanBn.jpg","name":"CNN Int","site":"magticom.ge","channelsPath":"sites/magticom.ge/magticom.ge_ge.channels.xml","configPath":"tests/__data__/input/sites/example.com.config.js","groups":["ge/magticom.ge"],"cluster_id":1,"programCount":0,"_id":"1XzrxNkSF2AQNBrT"} {"lang":"en","country":"ZA","xmltv_id":"MNetMovies2.za","site_id":"404a052b-3dea-4cac-a19c-de9a7d6f191d#MAP","logo":"https://rndcdn.dstv.com/dstvcms/2020/08/31/M-Net_Movies_2_Logo_4-3_lightbackground_xlrg.png","name":"M-Net Movies 2","site":"dstv.com","channelsPath":"sites/dstv.com/dstv.com_zw.channels.xml","configPath":"sites/dstv.com/dstv.com.config.js","groups":["zw/dstv.com"],"cluster_id":120,"programCount":14,"_id":"1lnhXpN7g0ER5XwN"} diff --git a/tests/commands/create-database.test.js b/tests/commands/create-database.test.js index 7a0bbeb5..7a0a6da8 100644 --- a/tests/commands/create-database.test.js +++ b/tests/commands/create-database.test.js @@ -15,32 +15,34 @@ beforeEach(() => { it('can create channels database', () => { const output = content('tests/__data__/output/database/channels.db') - expect(output).toMatchObject([ - { - lang: 'ru', - country: 'US', - xmltv_id: 'CNNInternationalEurope.us', - site_id: '140', - name: 'CNN International Europe', - site: 'example.com', - channelsPath: 'tests/__data__/input/sites/example.com_ca-nl.channels.xml', - configPath: 'tests/__data__/input/sites/example.com.config.js', - groups: ['ca-nl/example.com'], - cluster_id: 1 - }, - { - lang: 'en', - xmltv_id: 'CNNInternationalEurope2.us', - site_id: '141', - name: 'CNN International Europe 2', - site: 'example.com', - country: 'US', - channelsPath: 'tests/__data__/input/sites/example.com_ca-nl.channels.xml', - configPath: 'tests/__data__/input/sites/example.com.config.js', - groups: ['ca-nl/example.com'], - cluster_id: 1 - } - ]) + expect(output).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + lang: 'ru', + country: 'US', + xmltv_id: 'CNNInternationalEurope.us', + site_id: '140', + name: 'CNN International Europe', + site: 'example.com', + channelsPath: 'tests/__data__/input/sites/example.com_ca-nl.channels.xml', + configPath: 'tests/__data__/input/sites/example.com.config.js', + groups: ['ca-nl/example.com'], + cluster_id: 1 + }), + expect.objectContaining({ + lang: 'en', + xmltv_id: 'CNNInternationalEurope2.us', + site_id: '141', + name: 'CNN International Europe 2', + site: 'example.com', + country: 'US', + channelsPath: 'tests/__data__/input/sites/example.com_ca-nl.channels.xml', + configPath: 'tests/__data__/input/sites/example.com.config.js', + groups: ['ca-nl/example.com'], + cluster_id: 1 + }) + ]) + ) }) function content(filepath) { diff --git a/tests/commands/update-api.test.js b/tests/commands/update-api.test.js index 22bcec7b..cb7083df 100644 --- a/tests/commands/update-api.test.js +++ b/tests/commands/update-api.test.js @@ -15,7 +15,7 @@ beforeEach(() => { 'tests/__data__/temp/database/programs.db' ) - execSync( + const stdout = execSync( 'DB_DIR=tests/__data__/temp/database API_DIR=tests/__data__/output/api node scripts/commands/update-api.js', { encoding: 'utf8' } ) @@ -25,9 +25,9 @@ afterEach(() => { fs.rmdirSync('tests/__data__/temp', { recursive: true }) }) -it('can generate channels.json', () => { - const output = content('tests/__data__/output/api/channels.json') - const expected = content('tests/__data__/expected/api/channels.json') +it('can generate guides.json', () => { + const output = content('tests/__data__/output/api/guides.json') + const expected = content('tests/__data__/expected/api/guides.json') expect(output).toBe(expected) })