{"version":3,"sources":["webpack://_N_E/./public/static/car-bg-l.png","webpack://_N_E/./public/static/play-arrow.png","webpack://_N_E/./components/view-image/constant.ts","webpack://_N_E/./components/view-image/decode.ts","webpack://_N_E/./components/view-image/utils.ts","webpack://_N_E/./components/view-image/image-zoom.tsx","webpack://_N_E/./components/view-image/index.tsx","webpack://_N_E/./lib/format-time.ts","webpack://_N_E/./public/static/user-loading.png","webpack://_N_E/./node_modules/core-js/modules/es.array.some.js","webpack://_N_E/./node_modules/core-js/modules/es.string.match.js","webpack://_N_E/./lib/format-duration.ts","webpack://_N_E/./components/video/video-stats.tsx","webpack://_N_E/./public/static/dongchedi-logo.svg","webpack://_N_E/./components/view-image/style.ts","webpack://_N_E/./components/video/video-duration.tsx"],"names":["module","exports","domainWhiteList","domainBlackList","decodeUri","originStr","origin","some","domain","includes","logger","warn","metrics","counter","url","split","objUrlRegex","test","matches","match","legacyUrlRegex0","legacyUrlRegex1","legacyUrlRegex2","legacyUrlRegex3","canUseWebp","document","elem","createElement","getContext","toDataURL","indexOf","getOptimizedImage","params","src","unoptimized","width","height","autoPixelRatio","applyHttpsImage","uri","domainList","Math","floor","random","length","getDomain","size","pixelRatio","window","devicePixelRatio","abs","getSize","ext","getExt","ImageZoom","zoomHeight","children","className","loadImg","restProps","styles","display","position","Object","assign","paddingBottom","style","userLoading","require","carLoading","Image","props","lazy","rootMargin","useTransition","hoverTransition","alt","cusDefaultImg","errorImg","isBase64","startsWith","isLazy","notUseWebp","useInView","threshold","triggerOnce","setRef","isIntersected","inView","imgStyle","visibility","realSrc","React","imgRef","retryTimesRef","undefined","setRefCallbck","ele","current","ref","classnames","onError","error","setAttribute","formatTime","millisecondTimestamp","now","Date","nowTimestamp","getTime","fakeDate","getFullYear","getMonth","getDate","d","Number","delta","ONE_MINUTE","_hm","fixNumber","getHours","getMinutes","i","setDate","num","secToMin","seconds","min","sec","$","$some","arrayMethodIsStrict","arrayMethodUsesToLength","STRICT_METHOD","USES_TO_LENGTH","target","proto","forced","callbackfn","this","arguments","fixRegExpWellKnownSymbolLogic","anObject","toLength","requireObjectCoercible","advanceStringIndex","regExpExec","MATCH","nativeMatch","maybeCallNative","regexp","O","matcher","call","RegExp","String","res","done","value","rx","S","global","fullUnicode","unicode","lastIndex","result","A","n","matchStr","formatDuration","second","join","replace","VideoStats","playNums","publishTime","postUnit","marginTop","formatNumber","imageStyles","VideoDuration","duration"],"mappings":"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","file":"static/chunks/0c12a778149fb8e4d1abc5a7d2d605f1070ff14c.44373e244f50ba106fb9.js","sourcesContent":["module.exports = \"https://sf6-scmcdn2-tos.pstatp.com/motor/pc/_next/static/images/car-bg-l-689a3d2d87af79b668d1626c6fd9aad3.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAhCAYAAABX5MJvAAAAAXNSR0IArs4c6QAAAVNJREFUWAljYBgFoyEwGgIUhMD///9ZgdgUiGUoMIZ8rUCLlYD4BhDDwEEgQ4d8E8nQCbRwE8x2JPoXkN0OxJxkGEm6FqBFb5AsR2feBQq4k24qiTqAlnxGtxkLfxlQTJxEo4lXTqQjQO56D8RpQMxIvOlEqgQaSkxIAJXBwREgS5tI44lTBjSQVEeAXANKuK1AzEGcLQRUAQ36AsTkgjtAjWYErGAgGH9AQ74ADeEmZBAeeZB+TUZGxie41DDhkqCiOA/QrGB85tHDESD7fw20I0DRsHogHXEEaLkdMD28wecIgnLAhElOFn0H1JcCxAQTPkEHgBSQ4YilQD1iRBlOrCISHAEqE1yJNZckdUQ4AlQ6tgEx7ap1oOGPgRgXoH49gS2IgLbPxuIC2tWYOBwhCHTEXqhDQEG/CIhp13bA5giYGNBiUSDmh/FH6dEQGPYhAAANpqlQN0JVqgAAAABJRU5ErkJggg==\"","const domainWhiteList = [\n 'pstatp.com',\n 'byteimg.com',\n 'toutiaoimg.com',\n 'bytexservice.com',\n]\n\nconst domainBlackList = ['qlogo.cn', '58cdn.com.cn']\n\nlet domainList = [\n 'sf1-ttcdn-tos.pstatp.com',\n 'sf3-ttcdn-tos.pstatp.com',\n 'sf6-ttcdn-tos.pstatp.com',\n]\n/**\n * 增加域名白名单\n * @param list\n */\nexport function addDomainWhiteList(list: string[]) {\n domainWhiteList.push(...list)\n}\n/**\n * 获取域名白名单\n */\nexport function getDomainWhiteList() {\n return domainWhiteList\n}\n/**\n * 增加域名黑名单\n * @param list\n */\nexport function addDomainBlackList(list: string[]) {\n domainBlackList.push(...list)\n}\n/**\n * 获取域名黑名单\n */\nexport function getDomainBlackList() {\n return domainBlackList\n}\n\nexport function setDomainList(list: string[]) {\n domainList = list\n}\nexport function getDomainList() {\n return domainList\n}\n","import { logger, metrics } from 'lib/slardar-utils'\n\nimport { getDomainBlackList, getDomainWhiteList } from './constant'\n\n/* eslint-disable complexity */\nexport function decodeUri(originStr: string): string | null {\n let origin = originStr\n if (!origin) {\n return null\n }\n const blackList = getDomainBlackList()\n // 匹配到黑名单,不进行打点\n if (blackList.some(domain => origin.includes(`${domain}/`))) {\n return null\n }\n const whiteList = getDomainWhiteList()\n if (!whiteList.some(domain => origin.includes(`.${domain}/`))) {\n logger.warn(`[motor/pc/view-image] not in domain white list url=${origin}`)\n metrics.counter('tosUri.decode.ignore', { url: origin })\n return null\n }\n\n /* eslint-disable prefer-destructuring */\n origin = origin.split('?')[0]\n // 原格式,如:https://sf1-ttcdn-tos.pstatp.com/obj/developer-baas/baas/ttcqr5/de057af34f101a4e_1605090421476.png\n const objUrlRegex = /\\/obj\\/(.*)/\n\n if (objUrlRegex.test(origin)) {\n const matches = origin.match(objUrlRegex)\n if (matches?.[1]) {\n return matches[1]\n }\n }\n // 遗留的图片格式0,如:https://p3.pstatp.com/large/1bf6000409257e13550d\n const legacyUrlRegex0 = /\\/(?:origin|large|medium|thumb|img)\\/([0-9a-f]{9,})/\n if (legacyUrlRegex0.test(origin)) {\n const matches = origin.match(legacyUrlRegex0)\n if (matches?.[1]) {\n return `mosaic-legacy/${matches[1]}`\n }\n }\n // 遗留的图片格式,如:https://p3.pstatp.com/avatar/100x100/1dd5000048d6334c26b4.png\n const legacyUrlRegex1 = /\\d+x\\d+\\/([0-9a-f]{9,})/\n if (legacyUrlRegex1.test(origin)) {\n const matches = origin.match(legacyUrlRegex1)\n if (matches?.[1]) {\n return `mosaic-legacy/${matches[1]}`\n }\n }\n\n // 遗留的图片格式2,如:https://p7.pstatp.com/large/pgc-image/a8c9c8f743174b259f21915df49f19a7\n const legacyUrlRegex2 = /[a-z]+\\/([0-9a-z-]+)\\/([0-9a-f]{9,})/\n if (legacyUrlRegex2.test(origin)) {\n const matches = origin.match(legacyUrlRegex2)\n if (matches && matches[1] && matches[2]) {\n return `${matches[1]}/${matches[2]}`\n }\n }\n\n // 遗留图片格式3,'https://p7.pstatp.com/list/300x196/pgc-image/123432866b864bc295ac12102aaf395f'\n const legacyUrlRegex3 = /list\\/\\d+x\\d+\\/([0-9a-z-]+)\\/([0-9a-f]{9,})/\n if (legacyUrlRegex3.test(origin)) {\n const matches = origin.match(legacyUrlRegex3)\n if (matches && matches[1] && matches[2]) {\n return `${matches[1]}/${matches[2]}`\n }\n }\n\n // 常见的图片格式,如:https://p7.pstatp.com/large/pgc-image/a8c9c8f743174b259f21915df49f19a7\n const normalUrlRegex = /(?:img)\\/([0-9a-z-]+)\\/([0-9a-f]{9,})/\n const matches = origin.match(normalUrlRegex)\n if (matches && matches[1] && matches[2]) {\n return `${matches[1]}/${matches[2]}`\n }\n logger.warn(`[motor/pc/view-image] can not decode url=${origin}`)\n metrics.counter('tosUri.decode.miss', { url: origin })\n return null\n}\n","import { decodeUri } from './decode'\nimport applyHttpsImage from 'lib/apply-https-img'\n/**\n * 是否支持webp格式\n * @type {boolean}\n */\nconst canUseWebp = (() => {\n if (typeof document === 'undefined') {\n return false\n }\n const elem = document.createElement('canvas')\n if (elem && elem.getContext && elem.getContext('2d')) {\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0\n }\n return false\n})()\n\nfunction getDomain() {\n const domainList = [\n 'sf1-ttcdn-tos.pstatp.com',\n 'sf3-ttcdn-tos.pstatp.com',\n 'sf6-ttcdn-tos.pstatp.com',\n ]\n return domainList[Math.floor(Math.random() * domainList.length)]\n}\n\nfunction getSize(width = 0, height = 0, autoPixelRatio = false) {\n if (!width && !height) {\n return 'noop'\n }\n\n // 服务器端默认2倍大小,客户端根据实际的window?.devicePixelRatio\n if (autoPixelRatio) {\n let pixelRatio = 2\n if (typeof window !== 'undefined' && window?.devicePixelRatio) {\n pixelRatio = window?.devicePixelRatio\n }\n return `${Math.abs(width * pixelRatio)}x${Math.abs(height * pixelRatio)}`\n }\n return `${Math.abs(width)}x${Math.abs(height)}`\n}\n\nfunction getExt(src: string): string {\n if (canUseWebp) {\n return 'webp'\n }\n const matches = src.match(/(?:\\.)(\\w+)$/)\n if (!matches || !matches[1]) {\n return 'image'\n }\n return matches[1]\n}\n\ntype GenImgAttrsData = {\n src: string\n unoptimized: boolean\n width?: number\n height?: number\n autoPixelRatio?: boolean\n}\n\nexport function getOptimizedImage(params: GenImgAttrsData): string {\n const { src, unoptimized, width, height, autoPixelRatio } = params\n if (unoptimized) {\n return applyHttpsImage(src)\n }\n // 获取uri,如果不是tos地址,就不匹配\n const uri = decodeUri(src)\n if (!uri) {\n return applyHttpsImage(src)\n }\n\n const domain = getDomain()\n const size = getSize(width, height, autoPixelRatio)\n const ext = getExt(src)\n return `//${domain}/img/${uri}~${size}.${ext}`\n}\n","import React from 'react'\n\ninterface IProps {\n zoomHeight: string\n children: React.ReactNode\n className?: string\n loadImg?: boolean\n [key: string]: any\n}\n\nconst ImageZoom: React.FC = ({\n zoomHeight,\n children,\n className = '',\n loadImg = true,\n ...restProps\n}) => {\n const styles: any = {\n display: 'inline-block',\n position: 'relative',\n }\n\n if (zoomHeight) {\n Object.assign(styles, {\n paddingBottom: zoomHeight,\n width: '100%',\n })\n }\n\n return (\n \n {children}\n\n \n \n )\n}\n\nexport default ImageZoom\n","import * as React from 'react'\nimport classnames from 'classnames'\nimport { useInView } from 'react-intersection-observer'\nimport { getOptimizedImage } from './utils'\nimport { logger, metrics } from 'lib/slardar-utils'\nimport ImageStyles from './style'\nexport { default as ImageZoom } from './image-zoom'\n\n// 常用的一些图片\nexport const userLoading = require('static/user-loading.png')\nexport const carLoading = require('static/car-bg-l.png')\nexport const logoLoading = require('static/dongchedi-logo.svg')\n\nexport type ImageProps = {\n /**\n * 图片宽度\n */\n width: number\n /**\n * 图片高度\n */\n height: number\n /**\n * 图片资源地址\n */\n src: string\n /**\n * className\n */\n className?: string\n /**\n * alt\n */\n alt?: string\n /**\n * 是否懒加载\n */\n lazy?: boolean\n /**\n * 不使用图片格式优化,主要是webp\n * @default false\n */\n unoptimized?: boolean\n /**\n * 是否开启加载完毕后的动画,默认开启\n */\n useTransition?: boolean\n /**\n * hover动画\n */\n hoverTransition?: boolean\n /**\n * intersection observer的rootMargin\n * @default 0px 100px\n */\n rootMargin?: string\n /**\n * 自定义图片的行内样式\n */\n style?: React.CSSProperties\n /**\n * 自定义默认图片\n */\n cusDefaultImg?: string\n /**\n * 自定义错误图片\n */\n errorImg?: string\n /**\n * 是否自动适配 设备像素比 服务器端默认2倍,客户端根据实际的devicePixelRatio\n */\n autoPixelRatio?: boolean\n}\n\ntype ImgElementStyle = NonNullable\n\nconst classNamePrefix = 'motor-pc-image'\n\nconst defaultImg =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIvPg=='\n\nexport const Image: React.FC = props => {\n const {\n src,\n style,\n lazy = false,\n className,\n rootMargin = '500px 100px',\n unoptimized = false,\n useTransition = true,\n hoverTransition = false,\n width,\n height,\n alt = '',\n cusDefaultImg = defaultImg,\n errorImg,\n autoPixelRatio = false,\n } = props\n\n const isBase64 = src?.startsWith('data:')\n // 为data:时,不进行预加载和优化\n const isLazy = isBase64 ? false : lazy\n\n const notUseWebp = isBase64 ? true : unoptimized\n\n const [setRef, isIntersected] = useInView({\n rootMargin,\n threshold: 0,\n triggerOnce: true,\n })\n const inView = !isLazy || isIntersected\n\n let imgStyle: ImgElementStyle | undefined = {\n visibility: inView ? 'inherit' : 'hidden',\n }\n\n const realSrc = React.useMemo(() => {\n if (!inView) {\n // 不可见时,设置一个透明的背景图\n return cusDefaultImg\n }\n return getOptimizedImage({\n src,\n unoptimized: notUseWebp,\n width,\n height,\n autoPixelRatio,\n })\n }, [inView, src, width, height, notUseWebp, autoPixelRatio])\n\n const imgRef = React.useRef(null)\n\n // 图片加载错误重试的次数\n const retryTimesRef = React.useRef(0)\n\n if (unoptimized) {\n imgStyle = undefined\n }\n\n const setRefCallbck = React.useCallback(\n ele => {\n imgRef.current = ele\n setRef(ele)\n },\n [setRef, imgRef]\n )\n React.useEffect(() => {\n retryTimesRef.current = 0\n }, [src, width, height, notUseWebp])\n return (\n {\n logger.error(\n `[motor-fe/pc/image onError] error message: src=${realSrc}`,\n {\n src,\n }\n )\n metrics.counter('motor-fe/pc.image.onerror', { realSrc, src })\n if (retryTimesRef.current > 0) {\n /* eslint-disable no-unused-expressions */\n imgRef.current?.setAttribute('src', errorImg || cusDefaultImg)\n return\n }\n retryTimesRef.current += 1\n if (src === realSrc) {\n /* eslint-disable no-unused-expressions */\n imgRef.current?.setAttribute('src', errorImg || cusDefaultImg)\n return\n }\n /* eslint-disable no-unused-expressions */\n imgRef.current?.setAttribute('src', src)\n }}\n />\n )\n}\n\nexport { ImageStyles }\n","/**\n * 将服务端传过来的时间戳(毫秒)转为格式化的字符串\n * @param {string|number} millisecondTimestamp 毫秒级时间戳\n * @return {string} 格式化时间\n */\nexport default function formatTime(millisecondTimestamp: string | number) {\n const ONE_MINUTE = 1000 * 60\n const ONE_HOUR = ONE_MINUTE * 60\n // var ONE_DAY = ONE_HOUR * 24;\n\n const now = new Date()\n const nowTimestamp = now.getTime()\n const fakeDate = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n const d = new Date(Number(millisecondTimestamp))\n if (!Number(d.getTime())) {\n return ''\n }\n\n const delta = nowTimestamp - Number(millisecondTimestamp)\n\n if (delta < 0) {\n return ''\n } else if (delta < ONE_MINUTE) {\n return '刚刚'\n } else if (delta < ONE_HOUR) {\n return `${Math.floor(delta / ONE_MINUTE)}分钟前`\n } else if (delta < 24 * ONE_HOUR) {\n return `${Math.floor(delta / ONE_HOUR)}小时前`\n } else {\n const _hm = `${fixNumber(d.getHours())}:${fixNumber(d.getMinutes())}`\n let i = 0\n while (i++ <= 8) {\n fakeDate.setDate(fakeDate.getDate() - 1)\n if (millisecondTimestamp > fakeDate.getTime()) {\n if (i === 1) {\n return `昨天 ${_hm}`\n } else if (i === 2) {\n return `前天 ${_hm}`\n } else {\n return `${i}天前`\n }\n }\n }\n\n return `${(d.getFullYear() < now.getFullYear()\n ? `${d.getFullYear()}-`\n : '') + fixNumber(d.getMonth() + 1)}-${fixNumber(d.getDate())}`\n }\n}\n\nfunction fixNumber(num: number): string {\n if (num < 10) {\n return `0${num}`\n }\n return `${num}`\n}\n\nexport function secToMin(seconds: number) {\n const min = Math.floor(seconds / 60)\n const sec = seconds % 60\n return `${fixNumber(min)}:${fixNumber(sec)}`\n}\n","module.exports = \"https://sf6-scmcdn2-tos.pstatp.com/motor/pc/_next/static/images/user-loading-56fd747778e1578a5112cca26875b9e7.png\";","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","/**\n * 将服务端传过来的时长(秒)格式化为时分秒\n * @param {number} 秒级\n * @return {string} 格式化为时分秒\n */\nexport default function formatDuration(second: number) {\n if (second < 3600) {\n return [Math.floor((second / 60) % 60), Math.floor(second % 60)]\n .join(':')\n .replace(/\\b(\\d)\\b/g, '0$1')\n } else {\n return [\n Math.floor(second / 60 / 60),\n Math.floor((second / 60) % 60),\n Math.floor(second % 60),\n ]\n .join(':')\n .replace(/\\b(\\d)\\b/g, '0$1')\n }\n}\n","import React from 'react'\nimport formatNumber from '@arsenal/arsenal/modules/formatNumber'\nimport formatTime from 'lib/format-time'\n\ninterface IProps {\n playNums: number\n publishTime: number\n postUnit?: string\n className?: string\n}\n\nconst VideoStats: React.FC = ({\n playNums,\n publishTime,\n postUnit = '次阅读',\n className = '',\n}) => {\n const publishTimeStr = publishTime\n\n return (\n
\n \n {formatNumber(playNums)}\n {postUnit}\n \n \n {formatTime(publishTime * 1000)}\n \n \n
\n )\n}\n\nexport default VideoStats\n","module.exports = \"https://sf6-scmcdn2-tos.pstatp.com/motor/pc/_next/static/images/dongchedi-logo-db4472fc50bcddce0766b6de60aec985.svg\";","import css from 'styled-jsx/css'\n\nconst imageStyles = css.global`\n .motor-pc-image {\n position: relative;\n display: inline-block;\n max-width: 100%;\n }\n .motor-pc-image-holder img {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n .motor-pc-image-auto img {\n max-width: 100%;\n }\n .motor-pc-image-fade {\n opacity: 0;\n transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1),\n transform 0.3s ease-in-out;\n }\n .motor-pc-image-in {\n opacity: 1;\n }\n\n .motor-pc-image-hover {\n transition: opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1),\n transform 0.3s ease-in-out;\n }\n .motor-pc-image-hover:hover {\n transform: scale(1.1);\n }\n`\nexport default imageStyles\n","import React from 'react'\n\ninterface IProps {\n duration: string\n [key: string]: any\n}\n\nconst VideoDuration: React.FC = ({ duration = '', ...props }) => {\n return (\n
\n {duration}\n \n
\n )\n}\n\nexport default VideoDuration\n"],"sourceRoot":""}