|
940 | 940 | } |
941 | 941 | } |
942 | 942 | } |
| 943 | + } else if (r.method.name === "getVars") { |
| 944 | + for(var key in r.data) { |
| 945 | + var v = r.data[key]; |
| 946 | + |
| 947 | + if (v !== '' && v !== null && ((typeof v === 'string' && !/^\s+$/.test(v)) || typeof v === 'number')) { |
| 948 | + |
| 949 | + // Check meta plugins order. |
| 950 | + allResults.vars._sources = allResults.vars._sources || {}; |
| 951 | + |
| 952 | + var prevOrder = null, nextOrder = null, pluginId = allResults.vars._sources[key]; |
| 953 | + |
| 954 | + if (pluginId && plugins[pluginId] && plugins[r.method.pluginId]) { |
| 955 | + prevOrder = plugins[pluginId].order; |
| 956 | + nextOrder = plugins[r.method.pluginId].order; |
| 957 | + } |
| 958 | + |
| 959 | + if (!prevOrder || !nextOrder || prevOrder < nextOrder) { |
| 960 | + allResults.vars[key] = v; |
| 961 | + allResults.vars._sources[key] = r.method.pluginId; |
| 962 | + } |
| 963 | + } |
| 964 | + } |
943 | 965 | } |
944 | 966 | } |
945 | 967 | } |
|
1072 | 1094 | delete result.h2; |
1073 | 1095 | delete result.allData; |
1074 | 1096 | delete result.meta._sources; |
| 1097 | + delete result.vars._sources; |
| 1098 | + } |
| 1099 | + |
| 1100 | + if (Object.keys(result.vars).length === 0) { |
| 1101 | + delete result.vars; |
1075 | 1102 | } |
1076 | 1103 |
|
1077 | 1104 | var links = result.links; |
|
1173 | 1200 | } |
1174 | 1201 |
|
1175 | 1202 | // Get message from plugin link. |
1176 | | - useMessage(result, link); |
| 1203 | + if (!link.error) { |
| 1204 | + useMessage(result, link); |
| 1205 | + } |
1177 | 1206 | } |
1178 | 1207 |
|
1179 | 1208 | if (result.meta.medium === 'link' && links.some( |
|
1217 | 1246 | result.vary = options._usedProviderOptions; |
1218 | 1247 | result.vary.sort && result.vary.sort(); |
1219 | 1248 | } |
| 1249 | + |
| 1250 | + if (options.returnFetchUsage) { |
| 1251 | + result.fetches = options._fetches; |
| 1252 | + } |
1220 | 1253 | } |
1221 | 1254 |
|
1222 | 1255 | export function sortLinks(links) { |
|
1411 | 1444 | } |
1412 | 1445 | } |
1413 | 1446 |
|
| 1447 | + function generateRegisterFetchFunc(url, options) { |
| 1448 | + if (options.returnFetchUsage) { |
| 1449 | + options._fetches = options._fetches || []; |
| 1450 | + } |
| 1451 | + |
| 1452 | + options.registerFetch = function(data) { |
| 1453 | + if (options.returnFetchUsage) { |
| 1454 | + options._fetches.push(data); |
| 1455 | + } |
| 1456 | + }; |
| 1457 | + options.registerFetchError = function(data) { |
| 1458 | + if (options.returnFetchUsage) { |
| 1459 | + |
| 1460 | + var fetch_data = {...data}; |
| 1461 | + |
| 1462 | + if (!data.error && !data.status_code) { |
| 1463 | + console.warn('No error param in registerFetchError data'); |
| 1464 | + } else if (data.error) { |
| 1465 | + // Convert runtime `error` to `error_code` and `error_message`. |
| 1466 | + if (typeof data.error === 'string') { |
| 1467 | + fetch_data.error_code = data.error |
| 1468 | + } else { |
| 1469 | + if (data.error.code) { |
| 1470 | + fetch_data.error_code = data.error.code; |
| 1471 | + } |
| 1472 | + if (data.error.message) { |
| 1473 | + fetch_data.error_message = data.error.message; |
| 1474 | + } |
| 1475 | + if (!data.error.code && !data.error.message) { |
| 1476 | + fetch_data.error_message = '' + data.error; |
| 1477 | + } |
| 1478 | + } |
| 1479 | + } |
| 1480 | + |
| 1481 | + fetch_data.error = true; |
| 1482 | + |
| 1483 | + options._fetches.push(fetch_data); |
| 1484 | + } |
| 1485 | + }; |
| 1486 | + } |
| 1487 | + |
1414 | 1488 | function generateProviderOptionsFunc(url, options) { |
1415 | 1489 | if (options.returnProviderOptionsUsage) { |
1416 | 1490 | options._usedProviderOptions = options._usedProviderOptions || []; |
|
1436 | 1510 |
|
1437 | 1511 | const urlOptions = getQueryOptionsFromUrl(url); |
1438 | 1512 |
|
1439 | | - options.getQueryOptions = function() { |
1440 | | - const requestOptions = getQueryOptionsFromEntries(new URLSearchParams(options.providerOptions || {})); |
1441 | | - var query = !options.getProviderOptions('app.disable_url_options', false) |
1442 | | - ? {...requestOptions, ...urlOptions} |
1443 | | - : {...requestOptions} |
1444 | | - |
1445 | | - if (query.autoplay && !query.mute && !query.muted) { |
1446 | | - delete query.autoplay; |
1447 | | - } |
1448 | | - return query; |
1449 | | - } |
1450 | | - |
1451 | 1513 | options.getProviderOptions = function(path, defaultValue) { |
1452 | 1514 | registerProviderOptionsUsage(path); |
1453 | 1515 |
|
|
1505 | 1567 | } |
1506 | 1568 | } |
1507 | 1569 | return value; |
1508 | | - } |
| 1570 | + }; |
1509 | 1571 |
|
| 1572 | + options.digitize = function(params) { |
| 1573 | + return Object.keys(params).reduce((acc, k) => { |
| 1574 | + acc[k] = typeof params[k] === 'boolean' ? (params[k] ? 1 : 0) : params[k]; |
| 1575 | + return acc; |
| 1576 | + }, {}); |
| 1577 | + } |
1510 | 1578 | } |
1511 | 1579 |
|
1512 | 1580 | function callbackWithErrorCode(code, options, cb) { |
|
1555 | 1623 |
|
1556 | 1624 | generateProviderOptionsFunc(uri, options); |
1557 | 1625 |
|
| 1626 | + generateRegisterFetchFunc(uri, options); |
| 1627 | + |
1558 | 1628 | if (utils.isBlocked(uri, options, cb)) { |
1559 | 1629 | if (options.v === '1.3') { |
1560 | 1630 | cb({ |
|
1641 | 1711 | allResults = { |
1642 | 1712 | meta: {}, |
1643 | 1713 | links: [], |
| 1714 | + vars: {}, |
1644 | 1715 | messages: [], |
1645 | 1716 | allData: [] |
1646 | 1717 | }, |
1647 | 1718 | usedMethods = {}, |
1648 | 1719 |
|
1649 | 1720 | aborted = false, |
1650 | 1721 |
|
| 1722 | + appendDataParams = function(result) { |
| 1723 | + if (options.dataParams) { |
| 1724 | + for(var i = 0; i < options.dataParams.length; i++) { |
| 1725 | + var param = options.dataParams[i]; |
| 1726 | + var value = context[param]; |
| 1727 | + if (value) { |
| 1728 | + var e = result.data = allResults.data || {}; |
| 1729 | + e[param] = value; |
| 1730 | + } |
| 1731 | + } |
| 1732 | + } |
| 1733 | + }, |
| 1734 | + |
1651 | 1735 | abortCurrentRequest = function() { |
1652 | 1736 | if (context.htmlparser && context.htmlparser.abortController) { |
1653 | 1737 | context.htmlparser.abortController.abort(); |
|
1676 | 1760 | } |
1677 | 1761 | } |
1678 | 1762 |
|
| 1763 | + appendDataParams(allResults); |
| 1764 | + |
1679 | 1765 | if (options.whitelist) { |
1680 | 1766 | allResults.whitelist = options.getWhitelistRecord && options.getWhitelistRecord(uri, {disableWildcard: true}); |
1681 | 1767 | } |
|
1717 | 1803 | return; |
1718 | 1804 | } |
1719 | 1805 |
|
| 1806 | + // Gather results. |
| 1807 | + // Run before `responseError` to collect data and send in error. |
| 1808 | + var hasNewData = useResult(usedMethods, context, pluginsContexts, allResults, result, options, asyncMethodCb); |
| 1809 | + |
1720 | 1810 | // Abort on error response code. |
1721 | 1811 | var responseError = findResponseError(result, uri); |
1722 | 1812 | if (responseError) { |
|
1743 | 1833 | error.messages = allResults.messages; |
1744 | 1834 | } |
1745 | 1835 |
|
| 1836 | + appendDataParams(error); |
| 1837 | + |
| 1838 | + if (options.returnFetchUsage) { |
| 1839 | + error.fetches = options._fetches; |
| 1840 | + } |
| 1841 | + |
1746 | 1842 | return cb(error); |
1747 | 1843 |
|
1748 | 1844 | } else { |
1749 | 1845 | return cb(responseError); |
1750 | 1846 | } |
1751 | 1847 | } |
1752 | 1848 |
|
1753 | | - // Gather results. |
1754 | | - var hasNewData = useResult(usedMethods, context, pluginsContexts, allResults, result, options, asyncMethodCb); |
1755 | | - |
1756 | 1849 | if (options.fetchParam && options.fetchParam in context) { |
1757 | 1850 | abortCurrentRequest(); |
1758 | 1851 | cb(null, context[options.fetchParam]); |
|
0 commit comments