mirror of
				https://github.com/bolucat/Archive.git
				synced 2025-10-31 11:57:05 +08:00 
			
		
		
		
	Update On Mon Jan 20 19:32:49 CET 2025
This commit is contained in:
		
							
								
								
									
										1
									
								
								.github/update.log
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/update.log
									
									
									
									
										vendored
									
									
								
							| @@ -888,3 +888,4 @@ Update On Thu Jan 16 19:32:38 CET 2025 | ||||
| Update On Fri Jan 17 19:33:42 CET 2025 | ||||
| Update On Sat Jan 18 19:31:11 CET 2025 | ||||
| Update On Sun Jan 19 19:31:01 CET 2025 | ||||
| Update On Mon Jan 20 19:32:40 CET 2025 | ||||
|   | ||||
| @@ -153,11 +153,11 @@ func (b *Base) DialOptions(opts ...dialer.Option) []dialer.Option { | ||||
| } | ||||
|  | ||||
| type BasicOption struct { | ||||
| 	TFO         bool   `proxy:"tfo,omitempty" group:"tfo,omitempty"` | ||||
| 	MPTCP       bool   `proxy:"mptcp,omitempty" group:"mptcp,omitempty"` | ||||
| 	TFO         bool   `proxy:"tfo,omitempty"` | ||||
| 	MPTCP       bool   `proxy:"mptcp,omitempty"` | ||||
| 	Interface   string `proxy:"interface-name,omitempty" group:"interface-name,omitempty"` | ||||
| 	RoutingMark int    `proxy:"routing-mark,omitempty" group:"routing-mark,omitempty"` | ||||
| 	IPVersion   string `proxy:"ip-version,omitempty" group:"ip-version,omitempty"` | ||||
| 	IPVersion   string `proxy:"ip-version,omitempty"` | ||||
| 	DialerProxy string `proxy:"dialer-proxy,omitempty"` // don't apply this option into groups, but can set a group name in a proxy | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -46,6 +46,13 @@ type GroupBaseOption struct { | ||||
| } | ||||
|  | ||||
| func NewGroupBase(opt GroupBaseOption) *GroupBase { | ||||
| 	if opt.RoutingMark != 0 { | ||||
| 		log.Warnln("The group [%s] with routing-mark configuration is deprecated, please set it directly on the proxy instead", opt.Name) | ||||
| 	} | ||||
| 	if opt.Interface != "" { | ||||
| 		log.Warnln("The group [%s] with interface-name configuration is deprecated, please set it directly on the proxy instead", opt.Name) | ||||
| 	} | ||||
|  | ||||
| 	var excludeFilterReg *regexp2.Regexp | ||||
| 	if opt.excludeFilter != "" { | ||||
| 		excludeFilterReg = regexp2.MustCompile(opt.excludeFilter, regexp2.None) | ||||
|   | ||||
| @@ -17,7 +17,6 @@ import ( | ||||
| 	C "github.com/metacubex/mihomo/constant" | ||||
| ) | ||||
|  | ||||
| var trustCerts []*x509.Certificate | ||||
| var globalCertPool *x509.CertPool | ||||
| var mutex sync.RWMutex | ||||
| var errNotMatch = errors.New("certificate fingerprints do not match") | ||||
| @@ -30,11 +29,19 @@ var DisableSystemCa, _ = strconv.ParseBool(os.Getenv("DISABLE_SYSTEM_CA")) | ||||
| func AddCertificate(certificate string) error { | ||||
| 	mutex.Lock() | ||||
| 	defer mutex.Unlock() | ||||
|  | ||||
| 	if certificate == "" { | ||||
| 		return fmt.Errorf("certificate is empty") | ||||
| 	} | ||||
| 	if cert, err := x509.ParseCertificate([]byte(certificate)); err == nil { | ||||
| 		trustCerts = append(trustCerts, cert) | ||||
|  | ||||
| 	if globalCertPool == nil { | ||||
| 		initializeCertPool() | ||||
| 	} | ||||
|  | ||||
| 	if globalCertPool.AppendCertsFromPEM([]byte(certificate)) { | ||||
| 		return nil | ||||
| 	} else if cert, err := x509.ParseCertificate([]byte(certificate)); err == nil { | ||||
| 		globalCertPool.AddCert(cert) | ||||
| 		return nil | ||||
| 	} else { | ||||
| 		return fmt.Errorf("add certificate failed") | ||||
| @@ -51,9 +58,6 @@ func initializeCertPool() { | ||||
| 			globalCertPool = x509.NewCertPool() | ||||
| 		} | ||||
| 	} | ||||
| 	for _, cert := range trustCerts { | ||||
| 		globalCertPool.AddCert(cert) | ||||
| 	} | ||||
| 	if !DisableEmbedCa { | ||||
| 		globalCertPool.AppendCertsFromPEM(_CaCertificates) | ||||
| 	} | ||||
| @@ -62,7 +66,6 @@ func initializeCertPool() { | ||||
| func ResetCertificate() { | ||||
| 	mutex.Lock() | ||||
| 	defer mutex.Unlock() | ||||
| 	trustCerts = nil | ||||
| 	initializeCertPool() | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										62
									
								
								clash-nyanpasu/backend/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										62
									
								
								clash-nyanpasu/backend/Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -963,7 +963,7 @@ dependencies = [ | ||||
|  "boa_interner", | ||||
|  "boa_macros", | ||||
|  "boa_string", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "num-bigint", | ||||
|  "rustc-hash 2.1.0", | ||||
| ] | ||||
| @@ -989,7 +989,7 @@ dependencies = [ | ||||
|  "fast-float2", | ||||
|  "hashbrown 0.15.2", | ||||
|  "icu_normalizer", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "intrusive-collections", | ||||
|  "itertools 0.13.0", | ||||
|  "num-bigint", | ||||
| @@ -1035,7 +1035,7 @@ dependencies = [ | ||||
|  "boa_gc", | ||||
|  "boa_macros", | ||||
|  "hashbrown 0.15.2", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "once_cell", | ||||
|  "phf 0.11.3", | ||||
|  "rustc-hash 2.1.0", | ||||
| @@ -1293,7 +1293,7 @@ checksum = "8769706aad5d996120af43197bf46ef6ad0fda35216b4505f926a365a232d924" | ||||
| dependencies = [ | ||||
|  "camino", | ||||
|  "cargo-platform", | ||||
|  "semver 1.0.24", | ||||
|  "semver 1.0.25", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "thiserror 2.0.11", | ||||
| @@ -1515,7 +1515,7 @@ dependencies = [ | ||||
|  "hex", | ||||
|  "humansize", | ||||
|  "image", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "itertools 0.14.0", | ||||
|  "log", | ||||
|  "md-5", | ||||
| @@ -1552,7 +1552,7 @@ dependencies = [ | ||||
|  "runas", | ||||
|  "rust-i18n", | ||||
|  "rustc_version", | ||||
|  "semver 1.0.24", | ||||
|  "semver 1.0.25", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "serde_yaml_ng", | ||||
| @@ -3676,7 +3676,7 @@ dependencies = [ | ||||
|  "futures-core", | ||||
|  "futures-sink", | ||||
|  "http 1.2.0", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "slab", | ||||
|  "tokio", | ||||
|  "tokio-util", | ||||
| @@ -4244,9 +4244,9 @@ dependencies = [ | ||||
|  | ||||
| [[package]] | ||||
| name = "indexmap" | ||||
| version = "2.7.0" | ||||
| version = "2.7.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" | ||||
| checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" | ||||
| dependencies = [ | ||||
|  "equivalent", | ||||
|  "hashbrown 0.15.2", | ||||
| @@ -5105,7 +5105,7 @@ dependencies = [ | ||||
|  "cfg_aliases 0.1.1", | ||||
|  "codespan-reporting", | ||||
|  "hexf-parse", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "log", | ||||
|  "rustc-hash 1.1.0", | ||||
|  "spirv", | ||||
| @@ -6251,7 +6251,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" | ||||
| dependencies = [ | ||||
|  "fixedbitset", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| @@ -6460,7 +6460,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" | ||||
| dependencies = [ | ||||
|  "base64 0.22.1", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "quick-xml 0.32.0", | ||||
|  "serde", | ||||
|  "time", | ||||
| @@ -7299,7 +7299,7 @@ version = "0.4.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" | ||||
| dependencies = [ | ||||
|  "semver 1.0.24", | ||||
|  "semver 1.0.25", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| @@ -7519,9 +7519,9 @@ dependencies = [ | ||||
|  | ||||
| [[package]] | ||||
| name = "semver" | ||||
| version = "1.0.24" | ||||
| version = "1.0.25" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" | ||||
| checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" | ||||
| dependencies = [ | ||||
|  "serde", | ||||
| ] | ||||
| @@ -7595,9 +7595,9 @@ dependencies = [ | ||||
|  | ||||
| [[package]] | ||||
| name = "serde_json" | ||||
| version = "1.0.136" | ||||
| version = "1.0.137" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "336a0c23cf42a38d9eaa7cd22c7040d04e1228a19a933890805ffd00a16437d2" | ||||
| checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" | ||||
| dependencies = [ | ||||
|  "itoa 1.0.14", | ||||
|  "memchr", | ||||
| @@ -7657,7 +7657,7 @@ dependencies = [ | ||||
|  "chrono", | ||||
|  "hex", | ||||
|  "indexmap 1.9.3", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "serde", | ||||
|  "serde_derive", | ||||
|  "serde_json", | ||||
| @@ -7682,7 +7682,7 @@ name = "serde_yaml_ng" | ||||
| version = "0.10.0" | ||||
| source = "git+https://github.com/libnyanpasu/serde-yaml-ng.git#39cfdee3ab2a9bf220bc285e8004bb1950fa317f" | ||||
| dependencies = [ | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "itoa 1.0.14", | ||||
|  "ryu", | ||||
|  "serde", | ||||
| @@ -7695,7 +7695,7 @@ version = "0.0.11" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "48e76bab63c3fd98d27c17f9cbce177f64a91f5e69ac04cafe04e1bb25d1dc3c" | ||||
| dependencies = [ | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "itoa 1.0.14", | ||||
|  "libyml", | ||||
|  "log", | ||||
| @@ -8463,7 +8463,7 @@ dependencies = [ | ||||
|  "heck 0.5.0", | ||||
|  "json-patch", | ||||
|  "schemars", | ||||
|  "semver 1.0.24", | ||||
|  "semver 1.0.25", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "tauri-utils", | ||||
| @@ -8486,7 +8486,7 @@ dependencies = [ | ||||
|  "png", | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "semver 1.0.24", | ||||
|  "semver 1.0.25", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "sha2 0.10.8", | ||||
| @@ -8699,7 +8699,7 @@ dependencies = [ | ||||
|  "minisign-verify", | ||||
|  "percent-encoding", | ||||
|  "reqwest", | ||||
|  "semver 1.0.24", | ||||
|  "semver 1.0.25", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "tar", | ||||
| @@ -8782,7 +8782,7 @@ dependencies = [ | ||||
|  "quote", | ||||
|  "regex", | ||||
|  "schemars", | ||||
|  "semver 1.0.24", | ||||
|  "semver 1.0.25", | ||||
|  "serde", | ||||
|  "serde-untagged", | ||||
|  "serde_json", | ||||
| @@ -9230,7 +9230,7 @@ version = "0.19.15" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" | ||||
| dependencies = [ | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "serde", | ||||
|  "serde_spanned", | ||||
|  "toml_datetime", | ||||
| @@ -9243,7 +9243,7 @@ version = "0.20.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" | ||||
| dependencies = [ | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "toml_datetime", | ||||
|  "winnow 0.5.40", | ||||
| ] | ||||
| @@ -9254,7 +9254,7 @@ version = "0.22.22" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" | ||||
| dependencies = [ | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "serde", | ||||
|  "serde_spanned", | ||||
|  "toml_datetime", | ||||
| @@ -9781,9 +9781,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" | ||||
|  | ||||
| [[package]] | ||||
| name = "uuid" | ||||
| version = "1.11.1" | ||||
| version = "1.12.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b913a3b5fe84142e269d63cc62b64319ccaf89b748fc31fe025177f767a756c4" | ||||
| checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" | ||||
| dependencies = [ | ||||
|  "getrandom 0.2.15", | ||||
|  "serde", | ||||
| @@ -10311,7 +10311,7 @@ dependencies = [ | ||||
|  "bitflags 2.6.0", | ||||
|  "cfg_aliases 0.1.1", | ||||
|  "document-features", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "log", | ||||
|  "naga", | ||||
|  "once_cell", | ||||
| @@ -11607,7 +11607,7 @@ dependencies = [ | ||||
|  "displaydoc", | ||||
|  "flate2", | ||||
|  "hmac", | ||||
|  "indexmap 2.7.0", | ||||
|  "indexmap 2.7.1", | ||||
|  "lzma-rs", | ||||
|  "memchr", | ||||
|  "pbkdf2", | ||||
|   | ||||
| @@ -85,7 +85,7 @@ | ||||
|     "unplugin-auto-import": "19.0.0", | ||||
|     "unplugin-icons": "22.0.0", | ||||
|     "validator": "13.12.0", | ||||
|     "vite": "6.0.7", | ||||
|     "vite": "6.0.9", | ||||
|     "vite-plugin-html": "3.2.2", | ||||
|     "vite-plugin-sass-dts": "1.3.30", | ||||
|     "vite-plugin-svgr": "4.3.0", | ||||
|   | ||||
| @@ -34,7 +34,7 @@ | ||||
|     "react-error-boundary": "5.0.0", | ||||
|     "react-i18next": "15.4.0", | ||||
|     "react-use": "17.6.0", | ||||
|     "vite": "6.0.7", | ||||
|     "vite": "6.0.9", | ||||
|     "vite-tsconfig-paths": "5.1.4" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   "manifest_version": 1, | ||||
|   "latest": { | ||||
|     "mihomo": "v1.19.1", | ||||
|     "mihomo_alpha": "alpha-192d769", | ||||
|     "mihomo_alpha": "alpha-fc23318", | ||||
|     "clash_rs": "v0.7.4", | ||||
|     "clash_premium": "2023-09-05-gdcc8d87", | ||||
|     "clash_rs_alpha": "0.7.4-alpha+sha.63aec82" | ||||
| @@ -69,5 +69,5 @@ | ||||
|       "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" | ||||
|     } | ||||
|   }, | ||||
|   "updated_at": "2025-01-16T22:20:32.490Z" | ||||
|   "updated_at": "2025-01-19T22:20:36.800Z" | ||||
| } | ||||
|   | ||||
							
								
								
									
										84
									
								
								clash-nyanpasu/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										84
									
								
								clash-nyanpasu/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @@ -331,7 +331,7 @@ importers: | ||||
|         version: 1.97.3(@tanstack/react-router@1.97.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) | ||||
|       '@tanstack/router-plugin': | ||||
|         specifier: 1.97.3 | ||||
|         version: 1.97.3(@tanstack/react-router@1.97.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 1.97.3(@tanstack/react-router@1.97.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       '@tauri-apps/plugin-clipboard-manager': | ||||
|         specifier: 2.2.0 | ||||
|         version: 2.2.0 | ||||
| @@ -367,13 +367,13 @@ importers: | ||||
|         version: 13.12.2 | ||||
|       '@vitejs/plugin-legacy': | ||||
|         specifier: 6.0.0 | ||||
|         version: 6.0.0(terser@5.36.0)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 6.0.0(terser@5.36.0)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       '@vitejs/plugin-react': | ||||
|         specifier: 4.3.4 | ||||
|         version: 4.3.4(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 4.3.4(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       '@vitejs/plugin-react-swc': | ||||
|         specifier: 3.7.2 | ||||
|         version: 3.7.2(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 3.7.2(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       change-case: | ||||
|         specifier: 5.4.4 | ||||
|         version: 5.4.4 | ||||
| @@ -414,20 +414,20 @@ importers: | ||||
|         specifier: 13.12.0 | ||||
|         version: 13.12.0 | ||||
|       vite: | ||||
|         specifier: 6.0.7 | ||||
|         version: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|         specifier: 6.0.9 | ||||
|         version: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite-plugin-html: | ||||
|         specifier: 3.2.2 | ||||
|         version: 3.2.2(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 3.2.2(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       vite-plugin-sass-dts: | ||||
|         specifier: 1.3.30 | ||||
|         version: 1.3.30(postcss@8.5.1)(prettier@3.4.2)(sass-embedded@1.83.4)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 1.3.30(postcss@8.5.1)(prettier@3.4.2)(sass-embedded@1.83.4)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       vite-plugin-svgr: | ||||
|         specifier: 4.3.0 | ||||
|         version: 4.3.0(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 4.3.0(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       vite-tsconfig-paths: | ||||
|         specifier: 5.1.4 | ||||
|         version: 5.1.4(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 5.1.4(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       zod: | ||||
|         specifier: 3.24.1 | ||||
|         version: 3.24.1 | ||||
| @@ -463,7 +463,7 @@ importers: | ||||
|         version: 19.0.7 | ||||
|       '@vitejs/plugin-react': | ||||
|         specifier: 4.3.4 | ||||
|         version: 4.3.4(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 4.3.4(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|       ahooks: | ||||
|         specifier: 3.8.4 | ||||
|         version: 3.8.4(react@19.0.0) | ||||
| @@ -489,11 +489,11 @@ importers: | ||||
|         specifier: 17.6.0 | ||||
|         version: 17.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) | ||||
|       vite: | ||||
|         specifier: 6.0.7 | ||||
|         version: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|         specifier: 6.0.9 | ||||
|         version: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite-tsconfig-paths: | ||||
|         specifier: 5.1.4 | ||||
|         version: 5.1.4(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 5.1.4(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|     devDependencies: | ||||
|       '@emotion/react': | ||||
|         specifier: 11.14.0 | ||||
| @@ -518,7 +518,7 @@ importers: | ||||
|         version: 5.1.0(typescript@5.7.3) | ||||
|       vite-plugin-dts: | ||||
|         specifier: 4.5.0 | ||||
|         version: 4.5.0(@types/node@22.10.7)(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|         version: 4.5.0(@types/node@22.10.7)(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) | ||||
|  | ||||
|   scripts: | ||||
|     dependencies: | ||||
| @@ -6549,10 +6549,6 @@ packages: | ||||
|     resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} | ||||
|     engines: {node: ^10 || ^12 || >=14} | ||||
|  | ||||
|   postcss@8.4.49: | ||||
|     resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} | ||||
|     engines: {node: ^10 || ^12 || >=14} | ||||
|  | ||||
|   postcss@8.5.1: | ||||
|     resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} | ||||
|     engines: {node: ^10 || ^12 || >=14} | ||||
| @@ -7999,8 +7995,8 @@ packages: | ||||
|       vite: | ||||
|         optional: true | ||||
|  | ||||
|   vite@6.0.7: | ||||
|     resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} | ||||
|   vite@6.0.9: | ||||
|     resolution: {integrity: sha512-MSgUxHcaXLtnBPktkbUSoQUANApKYuxZ6DrbVENlIorbhL2dZydTLaZ01tjUoE3szeFzlFk9ANOKk0xurh4MKA==} | ||||
|     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} | ||||
|     hasBin: true | ||||
|     peerDependencies: | ||||
| @@ -10545,7 +10541,7 @@ snapshots: | ||||
|     optionalDependencies: | ||||
|       '@tanstack/react-router': 1.97.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) | ||||
|  | ||||
|   '@tanstack/router-plugin@1.97.3(@tanstack/react-router@1.97.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|   '@tanstack/router-plugin@1.97.3(@tanstack/react-router@1.97.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|     dependencies: | ||||
|       '@babel/core': 7.26.0 | ||||
|       '@babel/generator': 7.26.3 | ||||
| @@ -10569,7 +10565,7 @@ snapshots: | ||||
|       unplugin: 1.16.0 | ||||
|       zod: 3.24.1 | ||||
|     optionalDependencies: | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - '@tanstack/react-router' | ||||
|       - supports-color | ||||
| @@ -11062,7 +11058,7 @@ snapshots: | ||||
|  | ||||
|   '@ungap/structured-clone@1.2.0': {} | ||||
|  | ||||
|   '@vitejs/plugin-legacy@6.0.0(terser@5.36.0)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|   '@vitejs/plugin-legacy@6.0.0(terser@5.36.0)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|     dependencies: | ||||
|       '@babel/core': 7.26.0 | ||||
|       '@babel/preset-env': 7.26.0(@babel/core@7.26.0) | ||||
| @@ -11073,25 +11069,25 @@ snapshots: | ||||
|       regenerator-runtime: 0.14.1 | ||||
|       systemjs: 6.15.1 | ||||
|       terser: 5.36.0 | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
|   '@vitejs/plugin-react-swc@3.7.2(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|   '@vitejs/plugin-react-swc@3.7.2(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|     dependencies: | ||||
|       '@swc/core': 1.7.26 | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - '@swc/helpers' | ||||
|  | ||||
|   '@vitejs/plugin-react@4.3.4(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|   '@vitejs/plugin-react@4.3.4(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': | ||||
|     dependencies: | ||||
|       '@babel/core': 7.26.0 | ||||
|       '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) | ||||
|       '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) | ||||
|       '@types/babel__core': 7.20.5 | ||||
|       react-refresh: 0.14.2 | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
| @@ -14880,12 +14876,6 @@ snapshots: | ||||
|       picocolors: 1.1.1 | ||||
|       source-map-js: 1.2.1 | ||||
|  | ||||
|   postcss@8.4.49: | ||||
|     dependencies: | ||||
|       nanoid: 3.3.7 | ||||
|       picocolors: 1.1.1 | ||||
|       source-map-js: 1.2.1 | ||||
|  | ||||
|   postcss@8.5.1: | ||||
|     dependencies: | ||||
|       nanoid: 3.3.8 | ||||
| @@ -16453,7 +16443,7 @@ snapshots: | ||||
|       - rollup | ||||
|       - supports-color | ||||
|  | ||||
|   vite-plugin-dts@4.5.0(@types/node@22.10.7)(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|   vite-plugin-dts@4.5.0(@types/node@22.10.7)(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|     dependencies: | ||||
|       '@microsoft/api-extractor': 7.49.1(@types/node@22.10.7) | ||||
|       '@rollup/pluginutils': 5.1.4(rollup@4.27.4) | ||||
| @@ -16466,13 +16456,13 @@ snapshots: | ||||
|       magic-string: 0.30.17 | ||||
|       typescript: 5.7.3 | ||||
|     optionalDependencies: | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - '@types/node' | ||||
|       - rollup | ||||
|       - supports-color | ||||
|  | ||||
|   vite-plugin-html@3.2.2(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|   vite-plugin-html@3.2.2(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|     dependencies: | ||||
|       '@rollup/pluginutils': 4.2.1 | ||||
|       colorette: 2.0.20 | ||||
| @@ -16486,42 +16476,42 @@ snapshots: | ||||
|       html-minifier-terser: 6.1.0 | ||||
|       node-html-parser: 5.4.2 | ||||
|       pathe: 0.2.0 | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|  | ||||
|   vite-plugin-sass-dts@1.3.30(postcss@8.5.1)(prettier@3.4.2)(sass-embedded@1.83.4)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|   vite-plugin-sass-dts@1.3.30(postcss@8.5.1)(prettier@3.4.2)(sass-embedded@1.83.4)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|     dependencies: | ||||
|       postcss: 8.5.1 | ||||
|       postcss-js: 4.0.1(postcss@8.5.1) | ||||
|       prettier: 3.4.2 | ||||
|       sass-embedded: 1.83.4 | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|  | ||||
|   vite-plugin-svgr@4.3.0(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|   vite-plugin-svgr@4.3.0(rollup@4.27.4)(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|     dependencies: | ||||
|       '@rollup/pluginutils': 5.1.3(rollup@4.27.4) | ||||
|       '@svgr/core': 8.1.0(typescript@5.7.3) | ||||
|       '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3)) | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - rollup | ||||
|       - supports-color | ||||
|       - typescript | ||||
|  | ||||
|   vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|   vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): | ||||
|     dependencies: | ||||
|       debug: 4.3.7 | ||||
|       globrex: 0.1.2 | ||||
|       tsconfck: 3.0.3(typescript@5.7.3) | ||||
|     optionalDependencies: | ||||
|       vite: 6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|       vite: 6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|       - typescript | ||||
|  | ||||
|   vite@6.0.7(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1): | ||||
|   vite@6.0.9(@types/node@22.10.7)(jiti@2.4.2)(less@4.2.0)(sass-embedded@1.83.4)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1): | ||||
|     dependencies: | ||||
|       esbuild: 0.24.2 | ||||
|       postcss: 8.4.49 | ||||
|       postcss: 8.5.1 | ||||
|       rollup: 4.27.4 | ||||
|     optionalDependencies: | ||||
|       '@types/node': 22.10.7 | ||||
|   | ||||
| @@ -1,3 +1,11 @@ | ||||
| Package/ath11k-firmware-qca2066 = $(call Package/firmware-default,QCA2066 ath11k firmware) | ||||
| define Package/ath11k-firmware-qca2066/install | ||||
| 	$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCA2066/hw2.1 | ||||
| 	$(INSTALL_DATA) \ | ||||
| 		$(PKG_BUILD_DIR)/ath11k/QCA2066/hw2.1/* $(1)/lib/firmware/ath11k/QCA2066/hw2.1/ | ||||
| endef | ||||
| $(eval $(call BuildPackage,ath11k-firmware-qca2066)) | ||||
|  | ||||
| Package/ath11k-firmware-qca6390 = $(call Package/firmware-default,QCA6390 ath11k firmware) | ||||
| define Package/ath11k-firmware-qca6390/install | ||||
| 	$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCA6390/hw2.0 | ||||
|   | ||||
| @@ -0,0 +1,53 @@ | ||||
| From 400ece6c7f346b0a30867bd00b03b5b2563d4357 Mon Sep 17 00:00:00 2001 | ||||
| From: Sven Eckelmann <sven@narfation.org> | ||||
| Date: Tue, 22 Aug 2023 16:42:24 +0300 | ||||
| Subject: [PATCH] wifi: ath11k: Don't drop tx_status when peer cannot be found | ||||
|  | ||||
| When a station idles for a long time, hostapd will try to send a QoS Null | ||||
| frame to the station as "poll". NL80211_CMD_PROBE_CLIENT is used for this | ||||
| purpose. And the skb will be added to ack_status_frame - waiting for a | ||||
| completion via ieee80211_report_ack_skb(). | ||||
|  | ||||
| But when the peer was already removed before the tx_complete arrives, the | ||||
| peer will be missing. And when using dev_kfree_skb_any (instead of going | ||||
| through mac80211), the entry will stay inside ack_status_frames. This IDR | ||||
| will therefore run full after 8K request were generated for such clients. | ||||
| At this point, the access point will then just stall and not allow any new | ||||
| clients because idr_alloc() for ack_status_frame will fail. | ||||
|  | ||||
| ieee80211_free_txskb() on the other hand will (when required) call | ||||
| ieee80211_report_ack_skb() and make sure that (when required) remove the | ||||
| entry from the ack_status_frame. | ||||
|  | ||||
| Tested-on: IPQ6018 hw1.0 WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 | ||||
|  | ||||
| Fixes: 6257c702264c ("wifi: ath11k: fix tx status reporting in encap offload mode") | ||||
| Fixes: 94739d45c388 ("ath11k: switch to using ieee80211_tx_status_ext()") | ||||
| Cc: stable@vger.kernel.org | ||||
| Signed-off-by: Sven Eckelmann <sven@narfation.org> | ||||
| Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> | ||||
| Link: https://lore.kernel.org/r/20230802-ath11k-ack_status_leak-v2-1-c0af729d6229@narfation.org | ||||
| --- | ||||
|  drivers/net/wireless/ath/ath11k/dp_tx.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
|  | ||||
| --- a/drivers/net/wireless/ath/ath11k/dp_tx.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/dp_tx.c | ||||
| @@ -369,7 +369,7 @@ ath11k_dp_tx_htt_tx_complete_buf(struct | ||||
|  			   "dp_tx: failed to find the peer with peer_id %d\n", | ||||
|  			    ts->peer_id); | ||||
|  		spin_unlock_bh(&ab->base_lock); | ||||
| -		dev_kfree_skb_any(msdu); | ||||
| +		ieee80211_free_txskb(ar->hw, msdu); | ||||
|  		return; | ||||
|  	} | ||||
|  	spin_unlock_bh(&ab->base_lock); | ||||
| @@ -624,7 +624,7 @@ static void ath11k_dp_tx_complete_msdu(s | ||||
|  			   "dp_tx: failed to find the peer with peer_id %d\n", | ||||
|  			    ts->peer_id); | ||||
|  		spin_unlock_bh(&ab->base_lock); | ||||
| -		dev_kfree_skb_any(msdu); | ||||
| +		ieee80211_free_txskb(ar->hw, msdu); | ||||
|  		return; | ||||
|  	} | ||||
|  	arsta = (struct ath11k_sta *)peer->sta->drv_priv; | ||||
| @@ -0,0 +1,96 @@ | ||||
| From 515bcdf587f9911f2d5de51524cb7e048d295052 Mon Sep 17 00:00:00 2001 | ||||
| From: Baochen Qiang <quic_bqiang@quicinc.com> | ||||
| Date: Tue, 9 Jan 2024 10:13:35 +0800 | ||||
| Subject: [PATCH] wifi: ath11k: move pci.ops registration ahead | ||||
|  | ||||
| In ath11k_pci_probe() there is a switch statement that, based | ||||
| upon the PCI device ID, assigns pci_ops. After the switch, | ||||
| ath11k_pcic_register_pci_ops() is called to register the pci_ops. | ||||
|  | ||||
| Unfortunately, this registration is too late if any of the cases | ||||
| in the switch need to perform operations that require the pci_ops | ||||
| to already be registered. In particular, an upcoming patch for | ||||
| QCA2066 needs to call ath11k_pcic_read32(). | ||||
|  | ||||
| To address this issue, call ath11k_pcic_register_pci_ops() from | ||||
| each case instead of doing so after the switch. That way the ops | ||||
| will be registered if any subsequent operations within the case | ||||
| processing require the ops to be present. | ||||
|  | ||||
| Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 | ||||
|  | ||||
| Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com> | ||||
| Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> | ||||
| Link: https://msgid.link/20240109021336.4143-2-quic_bqiang@quicinc.com | ||||
| --- | ||||
|  drivers/net/wireless/ath/ath11k/pci.c | 26 ++++++++++++++++---------- | ||||
|  1 file changed, 16 insertions(+), 10 deletions(-) | ||||
|  | ||||
| --- a/drivers/net/wireless/ath/ath11k/pci.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/pci.c | ||||
| @@ -729,7 +729,6 @@ static int ath11k_pci_probe(struct pci_d | ||||
|  	struct ath11k_base *ab; | ||||
|  	struct ath11k_pci *ab_pci; | ||||
|  	u32 soc_hw_version_major, soc_hw_version_minor, addr; | ||||
| -	const struct ath11k_pci_ops *pci_ops; | ||||
|  	int ret; | ||||
|   | ||||
|  	ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI); | ||||
| @@ -775,6 +774,12 @@ static int ath11k_pci_probe(struct pci_d | ||||
|   | ||||
|  	switch (pci_dev->device) { | ||||
|  	case QCA6390_DEVICE_ID: | ||||
| +		ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qca6390); | ||||
| +		if (ret) { | ||||
| +			ath11k_err(ab, "failed to register PCI ops: %d\n", ret); | ||||
| +			goto err_pci_free_region; | ||||
| +		} | ||||
| + | ||||
|  		ath11k_pci_read_hw_version(ab, &soc_hw_version_major, | ||||
|  					   &soc_hw_version_minor); | ||||
|  		switch (soc_hw_version_major) { | ||||
| @@ -788,13 +793,21 @@ static int ath11k_pci_probe(struct pci_d | ||||
|  			goto err_pci_free_region; | ||||
|  		} | ||||
|   | ||||
| -		pci_ops = &ath11k_pci_ops_qca6390; | ||||
|  		break; | ||||
|  	case QCN9074_DEVICE_ID: | ||||
| -		pci_ops = &ath11k_pci_ops_qcn9074; | ||||
| +		ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qcn9074); | ||||
| +		if (ret) { | ||||
| +			ath11k_err(ab, "failed to register PCI ops: %d\n", ret); | ||||
| +			goto err_pci_free_region; | ||||
| +		} | ||||
|  		ab->hw_rev = ATH11K_HW_QCN9074_HW10; | ||||
|  		break; | ||||
|  	case WCN6855_DEVICE_ID: | ||||
| +		ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qca6390); | ||||
| +		if (ret) { | ||||
| +			ath11k_err(ab, "failed to register PCI ops: %d\n", ret); | ||||
| +			goto err_pci_free_region; | ||||
| +		} | ||||
|  		ab->id.bdf_search = ATH11K_BDF_SEARCH_BUS_AND_BOARD; | ||||
|  		ath11k_pci_read_hw_version(ab, &soc_hw_version_major, | ||||
|  					   &soc_hw_version_minor); | ||||
| @@ -821,7 +834,6 @@ unsupported_wcn6855_soc: | ||||
|  			goto err_pci_free_region; | ||||
|  		} | ||||
|   | ||||
| -		pci_ops = &ath11k_pci_ops_qca6390; | ||||
|  		break; | ||||
|  	default: | ||||
|  		dev_err(&pdev->dev, "Unknown PCI device found: 0x%x\n", | ||||
| @@ -830,12 +842,6 @@ unsupported_wcn6855_soc: | ||||
|  		goto err_pci_free_region; | ||||
|  	} | ||||
|   | ||||
| -	ret = ath11k_pcic_register_pci_ops(ab, pci_ops); | ||||
| -	if (ret) { | ||||
| -		ath11k_err(ab, "failed to register PCI ops: %d\n", ret); | ||||
| -		goto err_pci_free_region; | ||||
| -	} | ||||
| - | ||||
|  	ret = ath11k_pcic_init_msi_config(ab); | ||||
|  	if (ret) { | ||||
|  		ath11k_err(ab, "failed to init msi config: %d\n", ret); | ||||
| @@ -0,0 +1,219 @@ | ||||
| From f019f4dff2e4cb8704dc608496e3f2829de3e919 Mon Sep 17 00:00:00 2001 | ||||
| From: Carl Huang <quic_cjhuang@quicinc.com> | ||||
| Date: Wed, 14 Feb 2024 10:38:10 +0200 | ||||
| Subject: [PATCH] wifi: ath11k: support 2 station interfaces | ||||
|  | ||||
| Add hardware parameter support_dual_stations to indicate whether 2 station | ||||
| interfaces are supported. For chips which support this feature, limit total | ||||
| number of AP interface and mesh point to 1. The max interfaces are 3 for such | ||||
| chips. | ||||
|  | ||||
| The chips affected are: | ||||
|  | ||||
|  QCA6390 hw2.0 | ||||
|  WCN6855 hw2.0 | ||||
|  WCN6855 hw2.1 | ||||
|  | ||||
| Other chips are not affected. | ||||
|  | ||||
| For affected chips, remove radar_detect_widths because now | ||||
| num_different_channels is set to 2. radar_detect_widths can be set only when | ||||
| num_different_channels is 1, see mac80211 function wiphy_verify_combinations | ||||
| for details. This means that in affectected chips DFS cannot be enabled in AP | ||||
| mode. | ||||
|  | ||||
| Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 | ||||
|  | ||||
| Signed-off-by: Carl Huang <quic_cjhuang@quicinc.com> | ||||
| Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> | ||||
| Link: https://msgid.link/20230714023801.2621802-2-quic_cjhuang@quicinc.com | ||||
| --- | ||||
|  drivers/net/wireless/ath/ath11k/core.c | 14 ++++-- | ||||
|  drivers/net/wireless/ath/ath11k/hw.c   |  2 +- | ||||
|  drivers/net/wireless/ath/ath11k/hw.h   |  1 + | ||||
|  drivers/net/wireless/ath/ath11k/mac.c  | 62 +++++++++++++++++--------- | ||||
|  4 files changed, 53 insertions(+), 26 deletions(-) | ||||
|  | ||||
| --- a/drivers/net/wireless/ath/ath11k/core.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/core.c | ||||
| @@ -121,6 +121,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tcl_ring_retry = true, | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
|  		.smp2p_wow_exit = false, | ||||
| +		.support_dual_stations = false, | ||||
|  	}, | ||||
|  	{ | ||||
|  		.hw_rev = ATH11K_HW_IPQ6018_HW10, | ||||
| @@ -204,6 +205,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
|  		.smp2p_wow_exit = false, | ||||
|  		.support_fw_mac_sequence = false, | ||||
| +		.support_dual_stations = false, | ||||
|  	}, | ||||
|  	{ | ||||
|  		.name = "qca6390 hw2.0", | ||||
| @@ -254,7 +256,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.coldboot_cal_ftm = false, | ||||
|  		.cbcal_restart_fw = false, | ||||
|  		.fw_mem_mode = 0, | ||||
| -		.num_vdevs = 16 + 1, | ||||
| +		.num_vdevs = 2 + 1, | ||||
|  		.num_peers = 512, | ||||
|  		.supports_suspend = true, | ||||
|  		.hal_desc_sz = sizeof(struct hal_rx_desc_ipq8074), | ||||
| @@ -289,6 +291,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
|  		.smp2p_wow_exit = false, | ||||
|  		.support_fw_mac_sequence = true, | ||||
| +		.support_dual_stations = true, | ||||
|  	}, | ||||
|  	{ | ||||
|  		.name = "qcn9074 hw1.0", | ||||
| @@ -371,6 +374,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
|  		.smp2p_wow_exit = false, | ||||
|  		.support_fw_mac_sequence = false, | ||||
| +		.support_dual_stations = false, | ||||
|  	}, | ||||
|  	{ | ||||
|  		.name = "wcn6855 hw2.0", | ||||
| @@ -421,7 +425,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.coldboot_cal_ftm = false, | ||||
|  		.cbcal_restart_fw = false, | ||||
|  		.fw_mem_mode = 0, | ||||
| -		.num_vdevs = 16 + 1, | ||||
| +		.num_vdevs = 2 + 1, | ||||
|  		.num_peers = 512, | ||||
|  		.supports_suspend = true, | ||||
|  		.hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855), | ||||
| @@ -456,6 +460,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
|  		.smp2p_wow_exit = false, | ||||
|  		.support_fw_mac_sequence = true, | ||||
| +		.support_dual_stations = true, | ||||
|  	}, | ||||
|  	{ | ||||
|  		.name = "wcn6855 hw2.1", | ||||
| @@ -504,7 +509,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.coldboot_cal_ftm = false, | ||||
|  		.cbcal_restart_fw = false, | ||||
|  		.fw_mem_mode = 0, | ||||
| -		.num_vdevs = 16 + 1, | ||||
| +		.num_vdevs = 2 + 1, | ||||
|  		.num_peers = 512, | ||||
|  		.supports_suspend = true, | ||||
|  		.hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855), | ||||
| @@ -539,6 +544,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
|  		.smp2p_wow_exit = false, | ||||
|  		.support_fw_mac_sequence = true, | ||||
| +		.support_dual_stations = true, | ||||
|  	}, | ||||
|  	{ | ||||
|  		.name = "wcn6750 hw1.0", | ||||
| @@ -620,6 +626,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, | ||||
|  		.smp2p_wow_exit = true, | ||||
|  		.support_fw_mac_sequence = true, | ||||
| +		.support_dual_stations = false, | ||||
|  	}, | ||||
|  	{ | ||||
|  		.hw_rev = ATH11K_HW_IPQ5018_HW10, | ||||
| @@ -701,6 +708,7 @@ static const struct ath11k_hw_params ath | ||||
|  		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
|  		.smp2p_wow_exit = false, | ||||
|  		.support_fw_mac_sequence = false, | ||||
| +		.support_dual_stations = false, | ||||
|  	}, | ||||
|  }; | ||||
|   | ||||
| --- a/drivers/net/wireless/ath/ath11k/hw.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/hw.c | ||||
| @@ -58,7 +58,7 @@ static void ath11k_hw_wcn6855_tx_mesh_en | ||||
|  static void ath11k_init_wmi_config_qca6390(struct ath11k_base *ab, | ||||
|  					   struct target_resource_config *config) | ||||
|  { | ||||
| -	config->num_vdevs = 4; | ||||
| +	config->num_vdevs = ab->hw_params.num_vdevs; | ||||
|  	config->num_peers = 16; | ||||
|  	config->num_tids = 32; | ||||
|   | ||||
| --- a/drivers/net/wireless/ath/ath11k/hw.h | ||||
| +++ b/drivers/net/wireless/ath/ath11k/hw.h | ||||
| @@ -226,6 +226,7 @@ struct ath11k_hw_params { | ||||
|  	u32 tx_ring_size; | ||||
|  	bool smp2p_wow_exit; | ||||
|  	bool support_fw_mac_sequence; | ||||
| +	bool support_dual_stations; | ||||
|  }; | ||||
|   | ||||
|  struct ath11k_hw_ops { | ||||
| --- a/drivers/net/wireless/ath/ath11k/mac.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/mac.c | ||||
| @@ -9287,28 +9287,46 @@ static int ath11k_mac_setup_iface_combin | ||||
|  		return -ENOMEM; | ||||
|  	} | ||||
|   | ||||
| -	limits[0].max = 1; | ||||
| -	limits[0].types |= BIT(NL80211_IFTYPE_STATION); | ||||
| +	if (ab->hw_params.support_dual_stations) { | ||||
| +		limits[0].max = 2; | ||||
| +		limits[0].types |= BIT(NL80211_IFTYPE_STATION); | ||||
|   | ||||
| -	limits[1].max = 16; | ||||
| -	limits[1].types |= BIT(NL80211_IFTYPE_AP); | ||||
| +		limits[1].max = 1; | ||||
| +		limits[1].types |= BIT(NL80211_IFTYPE_AP); | ||||
| +		if (IS_ENABLED(CPTCFG_MAC80211_MESH) && | ||||
| +		    ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) | ||||
| +			limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); | ||||
|   | ||||
| -	if (IS_ENABLED(CPTCFG_MAC80211_MESH) && | ||||
| -	    ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) | ||||
| -		limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); | ||||
| - | ||||
| -	combinations[0].limits = limits; | ||||
| -	combinations[0].n_limits = n_limits; | ||||
| -	combinations[0].max_interfaces = 16; | ||||
| -	combinations[0].num_different_channels = 1; | ||||
| -	combinations[0].beacon_int_infra_match = true; | ||||
| -	combinations[0].beacon_int_min_gcd = 100; | ||||
| -	combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | | ||||
| -						BIT(NL80211_CHAN_WIDTH_20) | | ||||
| -						BIT(NL80211_CHAN_WIDTH_40) | | ||||
| -						BIT(NL80211_CHAN_WIDTH_80) | | ||||
| -						BIT(NL80211_CHAN_WIDTH_80P80) | | ||||
| -						BIT(NL80211_CHAN_WIDTH_160); | ||||
| +		combinations[0].limits = limits; | ||||
| +		combinations[0].n_limits = 2; | ||||
| +		combinations[0].max_interfaces = ab->hw_params.num_vdevs; | ||||
| +		combinations[0].num_different_channels = 2; | ||||
| +		combinations[0].beacon_int_infra_match = true; | ||||
| +		combinations[0].beacon_int_min_gcd = 100; | ||||
| +	} else { | ||||
| +		limits[0].max = 1; | ||||
| +		limits[0].types |= BIT(NL80211_IFTYPE_STATION); | ||||
| + | ||||
| +		limits[1].max = 16; | ||||
| +		limits[1].types |= BIT(NL80211_IFTYPE_AP); | ||||
| + | ||||
| +		if (IS_ENABLED(CPTCFG_MAC80211_MESH) && | ||||
| +		    ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT)) | ||||
| +			limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT); | ||||
| + | ||||
| +		combinations[0].limits = limits; | ||||
| +		combinations[0].n_limits = 2; | ||||
| +		combinations[0].max_interfaces = 16; | ||||
| +		combinations[0].num_different_channels = 1; | ||||
| +		combinations[0].beacon_int_infra_match = true; | ||||
| +		combinations[0].beacon_int_min_gcd = 100; | ||||
| +		combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | | ||||
| +							BIT(NL80211_CHAN_WIDTH_20) | | ||||
| +							BIT(NL80211_CHAN_WIDTH_40) | | ||||
| +							BIT(NL80211_CHAN_WIDTH_80) | | ||||
| +							BIT(NL80211_CHAN_WIDTH_80P80) | | ||||
| +							BIT(NL80211_CHAN_WIDTH_160); | ||||
| +	} | ||||
|   | ||||
|  	ar->hw->wiphy->iface_combinations = combinations; | ||||
|  	ar->hw->wiphy->n_iface_combinations = 1; | ||||
| @@ -0,0 +1,202 @@ | ||||
| From 5dc9d1a55e953d9059ecbdd8fe6ec81e9edd349e Mon Sep 17 00:00:00 2001 | ||||
| From: Baochen Qiang <quic_bqiang@quicinc.com> | ||||
| Date: Tue, 9 Jan 2024 10:13:36 +0800 | ||||
| Subject: [PATCH] wifi: ath11k: add support for QCA2066 | ||||
|  | ||||
| QCA2066 is a PCI based DBS device. It is very similar to WCN6855 | ||||
| overall: they share the same PCI device ID, the same major and | ||||
| minor version numbers, the same register address, and same HAL | ||||
| descriptors etc. The most significant difference is that QCA2066 | ||||
| supports 3-antenna configuration while WCN6855 does not. To differentiate | ||||
| them, subversion numbers are used. Currently four numbers are used | ||||
| by QCA2066: 0x1019A0E1, 0x1019B0E1, 0x1019C0E1 and 0x1019D0E1. | ||||
|  | ||||
| Tested-on: QCA2066 hw2.1 PCI WLAN.HSP.1.1-03737-QCAHSPSWPL_V2_SILICONZ_CE-1 | ||||
| Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 | ||||
|  | ||||
| Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com> | ||||
| Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> | ||||
| Link: https://msgid.link/20240109021336.4143-3-quic_bqiang@quicinc.com | ||||
| --- | ||||
|  drivers/net/wireless/ath/ath11k/core.c | 86 ++++++++++++++++++++++++++ | ||||
|  drivers/net/wireless/ath/ath11k/core.h |  1 + | ||||
|  drivers/net/wireless/ath/ath11k/mhi.c  |  1 + | ||||
|  drivers/net/wireless/ath/ath11k/pci.c  | 17 ++++- | ||||
|  drivers/net/wireless/ath/ath11k/pcic.c | 11 ++++ | ||||
|  5 files changed, 115 insertions(+), 1 deletion(-) | ||||
|  | ||||
| --- a/drivers/net/wireless/ath/ath11k/core.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/core.c | ||||
| @@ -710,6 +710,92 @@ static const struct ath11k_hw_params ath | ||||
|  		.support_fw_mac_sequence = false, | ||||
|  		.support_dual_stations = false, | ||||
|  	}, | ||||
| +	{ | ||||
| +		.name = "qca2066 hw2.1", | ||||
| +		.hw_rev = ATH11K_HW_QCA2066_HW21, | ||||
| +		.fw = { | ||||
| +			.dir = "QCA2066/hw2.1", | ||||
| +			.board_size = 256 * 1024, | ||||
| +			.cal_offset = 128 * 1024, | ||||
| +		}, | ||||
| +		.max_radios = 3, | ||||
| +		.bdf_addr = 0x4B0C0000, | ||||
| +		.hw_ops = &wcn6855_ops, | ||||
| +		.ring_mask = &ath11k_hw_ring_mask_qca6390, | ||||
| +		.internal_sleep_clock = true, | ||||
| +		.regs = &wcn6855_regs, | ||||
| +		.qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390, | ||||
| +		.host_ce_config = ath11k_host_ce_config_qca6390, | ||||
| +		.ce_count = 9, | ||||
| +		.target_ce_config = ath11k_target_ce_config_wlan_qca6390, | ||||
| +		.target_ce_count = 9, | ||||
| +		.svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, | ||||
| +		.svc_to_ce_map_len = 14, | ||||
| +		.ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, | ||||
| +		.single_pdev_only = true, | ||||
| +		.rxdma1_enable = false, | ||||
| +		.num_rxmda_per_pdev = 2, | ||||
| +		.rx_mac_buf_ring = true, | ||||
| +		.vdev_start_delay = true, | ||||
| +		.htt_peer_map_v2 = false, | ||||
| + | ||||
| +		.spectral = { | ||||
| +			.fft_sz = 0, | ||||
| +			.fft_pad_sz = 0, | ||||
| +			.summary_pad_sz = 0, | ||||
| +			.fft_hdr_len = 0, | ||||
| +			.max_fft_bins = 0, | ||||
| +			.fragment_160mhz = false, | ||||
| +		}, | ||||
| + | ||||
| +		.interface_modes = BIT(NL80211_IFTYPE_STATION) | | ||||
| +					BIT(NL80211_IFTYPE_AP), | ||||
| +		.supports_monitor = false, | ||||
| +		.full_monitor_mode = false, | ||||
| +		.supports_shadow_regs = true, | ||||
| +		.idle_ps = true, | ||||
| +		.supports_sta_ps = true, | ||||
| +		.coldboot_cal_mm = false, | ||||
| +		.coldboot_cal_ftm = false, | ||||
| +		.cbcal_restart_fw = false, | ||||
| +		.fw_mem_mode = 0, | ||||
| +		.num_vdevs = 2 + 1, | ||||
| +		.num_peers = 512, | ||||
| +		.supports_suspend = true, | ||||
| +		.hal_desc_sz = sizeof(struct hal_rx_desc_wcn6855), | ||||
| +		.supports_regdb = true, | ||||
| +		.fix_l1ss = false, | ||||
| +		.credit_flow = true, | ||||
| +		.max_tx_ring = DP_TCL_NUM_RING_MAX_QCA6390, | ||||
| +		.hal_params = &ath11k_hw_hal_params_qca6390, | ||||
| +		.supports_dynamic_smps_6ghz = false, | ||||
| +		.alloc_cacheable_memory = false, | ||||
| +		.supports_rssi_stats = true, | ||||
| +		.fw_wmi_diag_event = true, | ||||
| +		.current_cc_support = true, | ||||
| +		.dbr_debug_support = false, | ||||
| +		.global_reset = true, | ||||
| +		.bios_sar_capa = &ath11k_hw_sar_capa_wcn6855, | ||||
| +		.m3_fw_support = true, | ||||
| +		.fixed_bdf_addr = false, | ||||
| +		.fixed_mem_region = false, | ||||
| +		.static_window_map = false, | ||||
| +		.hybrid_bus_type = false, | ||||
| +		.fixed_fw_mem = false, | ||||
| +		.support_off_channel_tx = true, | ||||
| +		.supports_multi_bssid = true, | ||||
| + | ||||
| +		.sram_dump = { | ||||
| +			.start = 0x01400000, | ||||
| +			.end = 0x0177ffff, | ||||
| +		}, | ||||
| + | ||||
| +		.tcl_ring_retry = true, | ||||
| +		.tx_ring_size = DP_TCL_DATA_RING_SIZE, | ||||
| +		.smp2p_wow_exit = false, | ||||
| +		.support_fw_mac_sequence = true, | ||||
| +		.support_dual_stations = true, | ||||
| +	}, | ||||
|  }; | ||||
|   | ||||
|  static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab) | ||||
| --- a/drivers/net/wireless/ath/ath11k/core.h | ||||
| +++ b/drivers/net/wireless/ath/ath11k/core.h | ||||
| @@ -144,6 +144,7 @@ enum ath11k_hw_rev { | ||||
|  	ATH11K_HW_WCN6855_HW21, | ||||
|  	ATH11K_HW_WCN6750_HW10, | ||||
|  	ATH11K_HW_IPQ5018_HW10, | ||||
| +	ATH11K_HW_QCA2066_HW21, | ||||
|  }; | ||||
|   | ||||
|  enum ath11k_firmware_mode { | ||||
| --- a/drivers/net/wireless/ath/ath11k/mhi.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/mhi.c | ||||
| @@ -437,6 +437,7 @@ int ath11k_mhi_register(struct ath11k_pc | ||||
|  	case ATH11K_HW_QCA6390_HW20: | ||||
|  	case ATH11K_HW_WCN6855_HW20: | ||||
|  	case ATH11K_HW_WCN6855_HW21: | ||||
| +	case ATH11K_HW_QCA2066_HW21: | ||||
|  		ath11k_mhi_config = &ath11k_mhi_config_qca6390; | ||||
|  		break; | ||||
|  	default: | ||||
| --- a/drivers/net/wireless/ath/ath11k/pci.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/pci.c | ||||
| @@ -28,6 +28,8 @@ | ||||
|  #define QCN9074_DEVICE_ID		0x1104 | ||||
|  #define WCN6855_DEVICE_ID		0x1103 | ||||
|   | ||||
| +#define TCSR_SOC_HW_SUB_VER	0x1910010 | ||||
| + | ||||
|  static const struct pci_device_id ath11k_pci_id_table[] = { | ||||
|  	{ PCI_VDEVICE(QCOM, QCA6390_DEVICE_ID) }, | ||||
|  	{ PCI_VDEVICE(QCOM, WCN6855_DEVICE_ID) }, | ||||
| @@ -730,6 +732,7 @@ static int ath11k_pci_probe(struct pci_d | ||||
|  	struct ath11k_pci *ab_pci; | ||||
|  	u32 soc_hw_version_major, soc_hw_version_minor, addr; | ||||
|  	int ret; | ||||
| +	u32 sub_version; | ||||
|   | ||||
|  	ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI); | ||||
|   | ||||
| @@ -820,7 +823,19 @@ static int ath11k_pci_probe(struct pci_d | ||||
|  				break; | ||||
|  			case 0x10: | ||||
|  			case 0x11: | ||||
| -				ab->hw_rev = ATH11K_HW_WCN6855_HW21; | ||||
| +				sub_version = ath11k_pcic_read32(ab, TCSR_SOC_HW_SUB_VER); | ||||
| +				ath11k_dbg(ab, ATH11K_DBG_PCI, "sub_version 0x%x\n", | ||||
| +					   sub_version); | ||||
| +				switch (sub_version) { | ||||
| +				case 0x1019A0E1: | ||||
| +				case 0x1019B0E1: | ||||
| +				case 0x1019C0E1: | ||||
| +				case 0x1019D0E1: | ||||
| +					ab->hw_rev = ATH11K_HW_QCA2066_HW21; | ||||
| +					break; | ||||
| +				default: | ||||
| +					ab->hw_rev = ATH11K_HW_WCN6855_HW21; | ||||
| +				} | ||||
|  				break; | ||||
|  			default: | ||||
|  				goto unsupported_wcn6855_soc; | ||||
| --- a/drivers/net/wireless/ath/ath11k/pcic.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/pcic.c | ||||
| @@ -115,6 +115,17 @@ static const struct ath11k_msi_config at | ||||
|  		}, | ||||
|  		.hw_rev = ATH11K_HW_WCN6750_HW10, | ||||
|  	}, | ||||
| +	{ | ||||
| +		.total_vectors = 32, | ||||
| +		.total_users = 4, | ||||
| +		.users = (struct ath11k_msi_user[]) { | ||||
| +			{ .name = "MHI", .num_vectors = 3, .base_vector = 0 }, | ||||
| +			{ .name = "CE", .num_vectors = 10, .base_vector = 3 }, | ||||
| +			{ .name = "WAKE", .num_vectors = 1, .base_vector = 13 }, | ||||
| +			{ .name = "DP", .num_vectors = 18, .base_vector = 14 }, | ||||
| +		}, | ||||
| +		.hw_rev = ATH11K_HW_QCA2066_HW21, | ||||
| +	}, | ||||
|  }; | ||||
|   | ||||
|  int ath11k_pcic_init_msi_config(struct ath11k_base *ab) | ||||
| @@ -138,7 +138,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com> | ||||
|  int ath11k_mhi_register(struct ath11k_pci *ar_pci); | ||||
| --- a/drivers/net/wireless/ath/ath11k/pci.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/pci.c | ||||
| @@ -371,13 +371,20 @@ static void ath11k_pci_sw_reset(struct a | ||||
| @@ -373,13 +373,20 @@ static void ath11k_pci_sw_reset(struct a | ||||
|  static void ath11k_pci_init_qmi_ce_config(struct ath11k_base *ab) | ||||
|  { | ||||
|  	struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; | ||||
|   | ||||
| @@ -15,7 +15,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com> | ||||
|  | ||||
| --- a/drivers/net/wireless/ath/ath11k/pci.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/pci.c | ||||
| @@ -459,7 +459,11 @@ static int ath11k_pci_alloc_msi(struct a | ||||
| @@ -461,7 +461,11 @@ static int ath11k_pci_alloc_msi(struct a | ||||
|  	pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_LO, | ||||
|  			      &ab->pci.msi.addr_lo); | ||||
|   | ||||
|   | ||||
| @@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com> | ||||
|  	{ | ||||
|  		.hw_rev = ATH11K_HW_IPQ8074, | ||||
|  		.name = "ipq8074 hw2.0", | ||||
| @@ -2040,7 +2040,8 @@ static void ath11k_core_reset(struct wor | ||||
| @@ -2134,7 +2134,8 @@ static void ath11k_core_reset(struct wor | ||||
|  static int ath11k_init_hw_params(struct ath11k_base *ab) | ||||
|  { | ||||
|  	const struct ath11k_hw_params *hw_params = NULL; | ||||
| @@ -41,7 +41,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com> | ||||
|   | ||||
|  	for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) { | ||||
|  		hw_params = &ath11k_hw_params[i]; | ||||
| @@ -2056,7 +2057,31 @@ static int ath11k_init_hw_params(struct | ||||
| @@ -2150,7 +2151,31 @@ static int ath11k_init_hw_params(struct | ||||
|   | ||||
|  	ab->hw_params = *hw_params; | ||||
|   | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| --- a/drivers/net/wireless/ath/ath11k/core.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/core.c | ||||
| @@ -168,8 +168,8 @@ static struct ath11k_hw_params ath11k_hw | ||||
| @@ -169,8 +169,8 @@ static struct ath11k_hw_params ath11k_hw | ||||
|  		.supports_shadow_regs = false, | ||||
|  		.idle_ps = false, | ||||
|  		.supports_sta_ps = false, | ||||
|   | ||||
| @@ -1,25 +0,0 @@ | ||||
| --- a/drivers/net/wireless/ath/ath11k/mhi.c | ||||
| +++ b/drivers/net/wireless/ath/ath11k/mhi.c | ||||
| @@ -343,8 +343,10 @@ | ||||
|  		return "MHI_CB_FATAL_ERROR"; | ||||
|  	case MHI_CB_BW_REQ: | ||||
|  		return "MHI_CB_BW_REQ"; | ||||
| +#if LINUX_VERSION_IS_LESS(6,11,0) | ||||
|  	case MHI_CB_EE_SBL_MODE: | ||||
|  		return "MHI_CB_EE_SBL_MODE"; | ||||
| +#endif | ||||
|  	default: | ||||
|  		return "UNKNOWN"; | ||||
|  	} | ||||
| @@ -367,9 +369,11 @@ | ||||
|  		if (!(test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags))) | ||||
|  			queue_work(ab->workqueue_aux, &ab->reset_work); | ||||
|  		break; | ||||
| +#if LINUX_VERSION_IS_LESS(6,11,0) | ||||
|  	case MHI_CB_EE_SBL_MODE: | ||||
|  		ath11k_mhi_qrtr_instance_set(mhi_cntrl); | ||||
|  		break; | ||||
| +#endif | ||||
|  	default: | ||||
|  		break; | ||||
|  	} | ||||
| @@ -69,7 +69,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org> | ||||
|  | ||||
| --- a/backport-include/net/genetlink.h | ||||
| +++ b/backport-include/net/genetlink.h | ||||
| @@ -150,7 +150,7 @@ int genlmsg_multicast(const struct genl_ | ||||
| @@ -199,7 +199,7 @@ int genlmsg_multicast(const struct genl_ | ||||
|  #define genlmsg_multicast_allns LINUX_BACKPORT(genlmsg_multicast_allns) | ||||
|  int backport_genlmsg_multicast_allns(const struct genl_family *family, | ||||
|  				     struct sk_buff *skb, u32 portid, | ||||
| @@ -80,7 +80,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org> | ||||
|  static inline struct nlattr **genl_family_attrbuf(struct genl_family *family) | ||||
| --- a/compat/backport-genetlink.c | ||||
| +++ b/compat/backport-genetlink.c | ||||
| @@ -198,23 +198,23 @@ int genlmsg_multicast(const struct genl_ | ||||
| @@ -364,23 +364,23 @@ int genlmsg_multicast(const struct genl_ | ||||
|  } | ||||
|  EXPORT_SYMBOL_GPL(genlmsg_multicast); | ||||
|   | ||||
| @@ -108,7 +108,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org> | ||||
|  			if (!err) | ||||
|  				delivered = true; | ||||
|  			else if (err != -ESRCH) | ||||
| @@ -223,25 +223,29 @@ static int genlmsg_mcast(struct sk_buff | ||||
| @@ -389,25 +389,29 @@ static int genlmsg_mcast(struct sk_buff | ||||
|   | ||||
|  		prev = net; | ||||
|  	} | ||||
| @@ -143,7 +143,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org> | ||||
|  EXPORT_SYMBOL_GPL(backport_genlmsg_multicast_allns); | ||||
| --- a/net/wireless/nl80211.c | ||||
| +++ b/net/wireless/nl80211.c | ||||
| @@ -17596,10 +17596,15 @@ | ||||
| @@ -17567,10 +17567,15 @@ void nl80211_common_reg_change_event(enu | ||||
|   | ||||
|  	genlmsg_end(msg, hdr); | ||||
|   | ||||
| @@ -159,7 +159,7 @@ Signed-off-by: Sasha Levin <sashal@kernel.org> | ||||
|   | ||||
|  	return; | ||||
|   | ||||
| @@ -18217,10 +18222,15 @@ | ||||
| @@ -18188,10 +18193,15 @@ void nl80211_send_beacon_hint_event(stru | ||||
|   | ||||
|  	genlmsg_end(msg, hdr); | ||||
|   | ||||
|   | ||||
| @@ -113,7 +113,7 @@ | ||||
|  	u8 rx_flags; | ||||
| --- a/drivers/net/wireless/mac80211_hwsim.c | ||||
| +++ b/drivers/net/wireless/mac80211_hwsim.c | ||||
| @@ -5750,7 +5750,11 @@ | ||||
| @@ -5749,7 +5749,11 @@ static int __init init_mac80211_hwsim(vo | ||||
|  	if (err) | ||||
|  		goto out_exit_netlink; | ||||
|   | ||||
|   | ||||
| @@ -14,7 +14,7 @@ | ||||
|  static inline u32 __get_unaligned_be24(const u8 *p) | ||||
| --- a/net/wireless/core.c | ||||
| +++ b/net/wireless/core.c | ||||
| @@ -164,11 +164,19 @@ | ||||
| @@ -164,11 +164,19 @@ int cfg80211_switch_netns(struct cfg8021 | ||||
|  	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { | ||||
|  		if (!wdev->netdev) | ||||
|  			continue; | ||||
| @@ -34,7 +34,7 @@ | ||||
|  	} | ||||
|   | ||||
|  	if (err) { | ||||
| @@ -180,11 +188,19 @@ | ||||
| @@ -180,11 +188,19 @@ int cfg80211_switch_netns(struct cfg8021 | ||||
|  						     list) { | ||||
|  			if (!wdev->netdev) | ||||
|  				continue; | ||||
| @@ -54,7 +54,7 @@ | ||||
|  		} | ||||
|   | ||||
|  		return err; | ||||
| @@ -1413,7 +1429,11 @@ | ||||
| @@ -1428,7 +1444,11 @@ static int cfg80211_netdev_notifier_call | ||||
|  		SET_NETDEV_DEVTYPE(dev, &wiphy_type); | ||||
|  		wdev->netdev = dev; | ||||
|  		/* can only change netns with wiphy */ | ||||
| @@ -67,8 +67,8 @@ | ||||
|  		cfg80211_init_wdev(wdev); | ||||
|  		break; | ||||
| --- a/net/mac80211/rc80211_minstrel_ht_debugfs.c | ||||
| +++ a/net/mac80211/rc80211_minstrel_ht_debugfs.c | ||||
| @@ -187,7 +187,9 @@ | ||||
| +++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c | ||||
| @@ -187,7 +187,9 @@ static const struct file_operations mins | ||||
|  	.open = minstrel_ht_stats_open, | ||||
|  	.read = minstrel_stats_read, | ||||
|  	.release = minstrel_stats_release, | ||||
| @@ -78,7 +78,7 @@ | ||||
|  }; | ||||
|   | ||||
|  static char * | ||||
| @@ -323,7 +325,9 @@ | ||||
| @@ -323,7 +325,9 @@ static const struct file_operations mins | ||||
|  	.open = minstrel_ht_stats_csv_open, | ||||
|  	.read = minstrel_stats_read, | ||||
|  	.release = minstrel_stats_release, | ||||
|   | ||||
| @@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
| --- a/net/mac80211/tx.c | ||||
| +++ b/net/mac80211/tx.c | ||||
| @@ -3984,7 +3984,7 @@ struct ieee80211_txq *ieee80211_next_txq | ||||
| @@ -3988,7 +3988,7 @@ struct ieee80211_txq *ieee80211_next_txq | ||||
|   | ||||
|  		if (deficit < 0) | ||||
|  			sta->airtime[txqi->txq.ac].deficit += | ||||
| @@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  		if (deficit < 0 || !aql_check) { | ||||
|  			list_move_tail(&txqi->schedule_order, | ||||
| @@ -4127,7 +4127,8 @@ bool ieee80211_txq_may_transmit(struct i | ||||
| @@ -4131,7 +4131,8 @@ bool ieee80211_txq_may_transmit(struct i | ||||
|  		} | ||||
|  		sta = container_of(iter->txq.sta, struct sta_info, sta); | ||||
|  		if (ieee80211_sta_deficit(sta, ac) < 0) | ||||
| @@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  		list_move_tail(&iter->schedule_order, &local->active_txqs[ac]); | ||||
|  	} | ||||
|   | ||||
| @@ -4135,7 +4136,7 @@ bool ieee80211_txq_may_transmit(struct i | ||||
| @@ -4139,7 +4140,7 @@ bool ieee80211_txq_may_transmit(struct i | ||||
|  	if (sta->airtime[ac].deficit >= 0) | ||||
|  		goto out; | ||||
|   | ||||
|   | ||||
| @@ -51,7 +51,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   * | ||||
|   * Drivers can optionally delegate responsibility for scheduling queues to | ||||
|   * mac80211, to take advantage of airtime fairness accounting. In this case, to | ||||
| @@ -2248,8 +2249,8 @@ struct ieee80211_link_sta { | ||||
| @@ -2259,8 +2260,8 @@ struct ieee80211_link_sta { | ||||
|   *	For non MLO STA it will point to the deflink data. For MLO STA | ||||
|   *	ieee80211_sta_recalc_aggregates() must be called to update it. | ||||
|   * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not. | ||||
| @@ -62,7 +62,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   * @deflink: This holds the default link STA information, for non MLO STA all link | ||||
|   *	specific STA information is accessed through @deflink or through | ||||
|   *	link[0] which points to address of @deflink. For MLO Link STA | ||||
| @@ -5687,7 +5688,7 @@ void ieee80211_key_replay(struct ieee802 | ||||
| @@ -5698,7 +5699,7 @@ void ieee80211_key_replay(struct ieee802 | ||||
|   * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||||
|   * @queue: queue number (counted from zero). | ||||
|   * | ||||
| @@ -71,7 +71,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   */ | ||||
|  void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue); | ||||
|   | ||||
| @@ -5696,7 +5697,7 @@ void ieee80211_wake_queue(struct ieee802 | ||||
| @@ -5707,7 +5708,7 @@ void ieee80211_wake_queue(struct ieee802 | ||||
|   * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||||
|   * @queue: queue number (counted from zero). | ||||
|   * | ||||
| @@ -80,7 +80,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   */ | ||||
|  void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue); | ||||
|   | ||||
| @@ -5705,7 +5706,7 @@ void ieee80211_stop_queue(struct ieee802 | ||||
| @@ -5716,7 +5717,7 @@ void ieee80211_stop_queue(struct ieee802 | ||||
|   * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||||
|   * @queue: queue number (counted from zero). | ||||
|   * | ||||
| @@ -89,7 +89,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   * | ||||
|   * Return: %true if the queue is stopped. %false otherwise. | ||||
|   */ | ||||
| @@ -5716,7 +5717,7 @@ int ieee80211_queue_stopped(struct ieee8 | ||||
| @@ -5727,7 +5728,7 @@ int ieee80211_queue_stopped(struct ieee8 | ||||
|   * ieee80211_stop_queues - stop all queues | ||||
|   * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||||
|   * | ||||
| @@ -98,7 +98,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   */ | ||||
|  void ieee80211_stop_queues(struct ieee80211_hw *hw); | ||||
|   | ||||
| @@ -5724,7 +5725,7 @@ void ieee80211_stop_queues(struct ieee80 | ||||
| @@ -5735,7 +5736,7 @@ void ieee80211_stop_queues(struct ieee80 | ||||
|   * ieee80211_wake_queues - wake all queues | ||||
|   * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||||
|   * | ||||
| @@ -107,7 +107,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   */ | ||||
|  void ieee80211_wake_queues(struct ieee80211_hw *hw); | ||||
|   | ||||
| @@ -6946,6 +6947,18 @@ static inline struct sk_buff *ieee80211_ | ||||
| @@ -6957,6 +6958,18 @@ static inline struct sk_buff *ieee80211_ | ||||
|  } | ||||
|   | ||||
|  /** | ||||
|   | ||||
| @@ -387,7 +387,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	 * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress. | ||||
| --- a/net/mac80211/tx.c | ||||
| +++ b/net/mac80211/tx.c | ||||
| @@ -1600,9 +1600,6 @@ int ieee80211_txq_setup_flows(struct iee | ||||
| @@ -1604,9 +1604,6 @@ int ieee80211_txq_setup_flows(struct iee | ||||
|  	bool supp_vht = false; | ||||
|  	enum nl80211_band band; | ||||
|   | ||||
| @@ -397,7 +397,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	ret = fq_init(fq, 4096); | ||||
|  	if (ret) | ||||
|  		return ret; | ||||
| @@ -1650,9 +1647,6 @@ void ieee80211_txq_teardown_flows(struct | ||||
| @@ -1654,9 +1651,6 @@ void ieee80211_txq_teardown_flows(struct | ||||
|  { | ||||
|  	struct fq *fq = &local->fq; | ||||
|   | ||||
| @@ -407,7 +407,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	kfree(local->cvars); | ||||
|  	local->cvars = NULL; | ||||
|   | ||||
| @@ -1669,8 +1663,7 @@ static bool ieee80211_queue_skb(struct i | ||||
| @@ -1673,8 +1667,7 @@ static bool ieee80211_queue_skb(struct i | ||||
|  	struct ieee80211_vif *vif; | ||||
|  	struct txq_info *txqi; | ||||
|   | ||||
| @@ -417,7 +417,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  		return false; | ||||
|   | ||||
|  	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||||
| @@ -4193,12 +4186,7 @@ void __ieee80211_subif_start_xmit(struct | ||||
| @@ -4197,12 +4190,7 @@ void __ieee80211_subif_start_xmit(struct | ||||
|  	if (IS_ERR(sta)) | ||||
|  		sta = NULL; | ||||
|   | ||||
| @@ -431,7 +431,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	ieee80211_aggr_check(sdata, sta, skb); | ||||
|   | ||||
|  	sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift); | ||||
| @@ -4509,11 +4497,7 @@ static void ieee80211_8023_xmit(struct i | ||||
| @@ -4513,11 +4501,7 @@ static void ieee80211_8023_xmit(struct i | ||||
|  	struct tid_ampdu_tx *tid_tx; | ||||
|  	u8 tid; | ||||
|   | ||||
| @@ -444,7 +444,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   | ||||
|  	if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) && | ||||
|  	    test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) | ||||
| @@ -4767,9 +4751,6 @@ void ieee80211_tx_pending(struct tasklet | ||||
| @@ -4771,9 +4755,6 @@ void ieee80211_tx_pending(struct tasklet | ||||
|  			if (!txok) | ||||
|  				break; | ||||
|  		} | ||||
| @@ -454,7 +454,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	} | ||||
|  	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | ||||
|   | ||||
| @@ -5962,10 +5943,9 @@ int ieee80211_tx_control_port(struct wip | ||||
| @@ -5966,10 +5947,9 @@ int ieee80211_tx_control_port(struct wip | ||||
|  	} | ||||
|   | ||||
|  	if (!IS_ERR(sta)) { | ||||
|   | ||||
| @@ -59,7 +59,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  		flow = fq_find_fattest_flow(fq); | ||||
| --- a/include/net/mac80211.h | ||||
| +++ b/include/net/mac80211.h | ||||
| @@ -1807,6 +1807,10 @@ struct ieee80211_vif_cfg { | ||||
| @@ -1818,6 +1818,10 @@ struct ieee80211_vif_cfg { | ||||
|   * @addr: address of this interface | ||||
|   * @p2p: indicates whether this AP or STA interface is a p2p | ||||
|   *	interface, i.e. a GO or p2p-sta respectively | ||||
| @@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   * @driver_flags: flags/capabilities the driver has for this interface, | ||||
|   *	these need to be set (or cleared) when the interface is added | ||||
|   *	or, if supported by the driver, the interface type is changed | ||||
| @@ -1846,6 +1850,7 @@ struct ieee80211_vif { | ||||
| @@ -1857,6 +1861,7 @@ struct ieee80211_vif { | ||||
|   | ||||
|  	struct ieee80211_txq *txq; | ||||
|   | ||||
| @@ -90,7 +90,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
| --- a/net/mac80211/tx.c | ||||
| +++ b/net/mac80211/tx.c | ||||
| @@ -1356,7 +1356,11 @@ static struct txq_info *ieee80211_get_tx | ||||
| @@ -1360,7 +1360,11 @@ static struct txq_info *ieee80211_get_tx | ||||
|   | ||||
|  static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) | ||||
|  { | ||||
| @@ -103,7 +103,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  } | ||||
|   | ||||
|  static u32 codel_skb_len_func(const struct sk_buff *skb) | ||||
| @@ -3579,55 +3583,79 @@ ieee80211_xmit_fast_finish(struct ieee80 | ||||
| @@ -3583,55 +3587,79 @@ ieee80211_xmit_fast_finish(struct ieee80 | ||||
|  	return TX_CONTINUE; | ||||
|  } | ||||
|   | ||||
| @@ -219,7 +219,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	/* will not be crypto-handled beyond what we do here, so use false | ||||
|  	 * as the may-encrypt argument for the resize to not account for | ||||
| @@ -3636,10 +3664,8 @@ static bool ieee80211_xmit_fast(struct i | ||||
| @@ -3640,10 +3668,8 @@ static bool ieee80211_xmit_fast(struct i | ||||
|  	if (unlikely(ieee80211_skb_resize(sdata, skb, | ||||
|  					  max_t(int, extra_head + hw_headroom - | ||||
|  						     skb_headroom(skb), 0), | ||||
| @@ -232,7 +232,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	memcpy(ð, skb->data, ETH_HLEN - 2); | ||||
|  	hdr = skb_push(skb, extra_head); | ||||
| @@ -3653,7 +3679,7 @@ static bool ieee80211_xmit_fast(struct i | ||||
| @@ -3657,7 +3683,7 @@ static bool ieee80211_xmit_fast(struct i | ||||
|  	info->control.vif = &sdata->vif; | ||||
|  	info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | | ||||
|  		      IEEE80211_TX_CTL_DONTFRAG | | ||||
| @@ -241,7 +241,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT | | ||||
|  			      u32_encode_bits(IEEE80211_LINK_UNSPECIFIED, | ||||
|  					      IEEE80211_TX_CTRL_MLO_LINK); | ||||
| @@ -3677,16 +3703,14 @@ static bool ieee80211_xmit_fast(struct i | ||||
| @@ -3681,16 +3707,14 @@ static bool ieee80211_xmit_fast(struct i | ||||
|  	tx.key = fast_tx->key; | ||||
|   | ||||
|  	if (ieee80211_queue_skb(local, sdata, sta, skb)) | ||||
| @@ -261,7 +261,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||||
|  		sdata = container_of(sdata->bss, | ||||
| @@ -3694,6 +3718,56 @@ static bool ieee80211_xmit_fast(struct i | ||||
| @@ -3698,6 +3722,56 @@ static bool ieee80211_xmit_fast(struct i | ||||
|   | ||||
|  	__skb_queue_tail(&tx.skbs, skb); | ||||
|  	ieee80211_tx_frags(local, &sdata->vif, sta, &tx.skbs, false); | ||||
| @@ -318,7 +318,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	return true; | ||||
|  } | ||||
|   | ||||
| @@ -4201,31 +4275,14 @@ void __ieee80211_subif_start_xmit(struct | ||||
| @@ -4205,31 +4279,14 @@ void __ieee80211_subif_start_xmit(struct | ||||
|  			goto out; | ||||
|  	} | ||||
|   | ||||
| @@ -358,7 +358,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	} | ||||
|   | ||||
|  	skb_list_walk_safe(skb, skb, next) { | ||||
| @@ -4443,9 +4500,11 @@ normal: | ||||
| @@ -4447,9 +4504,11 @@ normal: | ||||
|  	return NETDEV_TX_OK; | ||||
|  } | ||||
|   | ||||
| @@ -373,7 +373,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  { | ||||
|  	struct ieee80211_local *local = sdata->local; | ||||
|  	struct ieee80211_tx_control control = {}; | ||||
| @@ -4454,14 +4513,6 @@ static bool ieee80211_tx_8023(struct iee | ||||
| @@ -4458,14 +4517,6 @@ static bool ieee80211_tx_8023(struct iee | ||||
|  	unsigned long flags; | ||||
|  	int q = info->hw_queue; | ||||
|   | ||||
| @@ -388,7 +388,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | ||||
|   | ||||
|  	if (local->queue_stop_reasons[q] || | ||||
| @@ -4488,6 +4539,26 @@ static bool ieee80211_tx_8023(struct iee | ||||
| @@ -4492,6 +4543,26 @@ static bool ieee80211_tx_8023(struct iee | ||||
|  	return true; | ||||
|  } | ||||
|   | ||||
| @@ -415,7 +415,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata, | ||||
|  				struct net_device *dev, struct sta_info *sta, | ||||
|  				struct ieee80211_key *key, struct sk_buff *skb) | ||||
| @@ -4495,9 +4566,13 @@ static void ieee80211_8023_xmit(struct i | ||||
| @@ -4499,9 +4570,13 @@ static void ieee80211_8023_xmit(struct i | ||||
|  	struct ieee80211_tx_info *info; | ||||
|  	struct ieee80211_local *local = sdata->local; | ||||
|  	struct tid_ampdu_tx *tid_tx; | ||||
| @@ -430,7 +430,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) && | ||||
|  	    test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) | ||||
| @@ -4507,9 +4582,6 @@ static void ieee80211_8023_xmit(struct i | ||||
| @@ -4511,9 +4586,6 @@ static void ieee80211_8023_xmit(struct i | ||||
|  	if (unlikely(!skb)) | ||||
|  		return; | ||||
|   | ||||
| @@ -440,7 +440,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	ieee80211_aggr_check(sdata, sta, skb); | ||||
|   | ||||
|  	tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; | ||||
| @@ -4523,22 +4595,20 @@ static void ieee80211_8023_xmit(struct i | ||||
| @@ -4527,22 +4599,20 @@ static void ieee80211_8023_xmit(struct i | ||||
|  			return; | ||||
|  		} | ||||
|   | ||||
| @@ -471,7 +471,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||||
|  		sdata = container_of(sdata->bss, | ||||
| @@ -4550,6 +4620,24 @@ static void ieee80211_8023_xmit(struct i | ||||
| @@ -4554,6 +4624,24 @@ static void ieee80211_8023_xmit(struct i | ||||
|  	if (key) | ||||
|  		info->control.hw_key = &key->conf; | ||||
|   | ||||
| @@ -496,7 +496,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	ieee80211_tx_8023(sdata, skb, sta, false); | ||||
|   | ||||
|  	return; | ||||
| @@ -4591,6 +4679,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8 | ||||
| @@ -4595,6 +4683,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8 | ||||
|  		    key->conf.cipher == WLAN_CIPHER_SUITE_TKIP)) | ||||
|  		goto skip_offload; | ||||
|   | ||||
|   | ||||
| @@ -728,7 +728,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
| --- a/net/mac80211/tx.c | ||||
| +++ b/net/mac80211/tx.c | ||||
| @@ -3022,6 +3022,9 @@ void ieee80211_check_fast_xmit(struct st | ||||
| @@ -3026,6 +3026,9 @@ void ieee80211_check_fast_xmit(struct st | ||||
|  	if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT)) | ||||
|  		return; | ||||
|   | ||||
| @@ -738,7 +738,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	/* Locking here protects both the pointer itself, and against concurrent | ||||
|  	 * invocations winning data access races to, e.g., the key pointer that | ||||
|  	 * is used. | ||||
| @@ -3403,6 +3406,9 @@ static bool ieee80211_amsdu_aggregate(st | ||||
| @@ -3407,6 +3410,9 @@ static bool ieee80211_amsdu_aggregate(st | ||||
|  	if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) | ||||
|  		return false; | ||||
|   | ||||
| @@ -748,7 +748,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	if (skb_is_gso(skb)) | ||||
|  		return false; | ||||
|   | ||||
| @@ -3635,10 +3641,11 @@ free: | ||||
| @@ -3639,10 +3645,11 @@ free: | ||||
|  	return NULL; | ||||
|  } | ||||
|   | ||||
| @@ -764,7 +764,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  { | ||||
|  	struct ieee80211_local *local = sdata->local; | ||||
|  	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; | ||||
| @@ -3647,7 +3654,6 @@ static void __ieee80211_xmit_fast(struct | ||||
| @@ -3651,7 +3658,6 @@ static void __ieee80211_xmit_fast(struct | ||||
|  	ieee80211_tx_result r; | ||||
|  	int hw_headroom = sdata->local->hw.extra_tx_headroom; | ||||
|  	int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2); | ||||
| @@ -772,7 +772,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	skb = skb_share_check(skb, GFP_ATOMIC); | ||||
|  	if (unlikely(!skb)) | ||||
| @@ -3667,11 +3673,10 @@ static void __ieee80211_xmit_fast(struct | ||||
| @@ -3671,11 +3677,10 @@ static void __ieee80211_xmit_fast(struct | ||||
|  					  ENCRYPT_NO))) | ||||
|  		goto free; | ||||
|   | ||||
| @@ -786,7 +786,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  	info = IEEE80211_SKB_CB(skb); | ||||
|  	memset(info, 0, sizeof(*info)); | ||||
| @@ -3690,7 +3695,8 @@ static void __ieee80211_xmit_fast(struct | ||||
| @@ -3694,7 +3699,8 @@ static void __ieee80211_xmit_fast(struct | ||||
|  #endif | ||||
|   | ||||
|  	if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { | ||||
| @@ -796,7 +796,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  		*ieee80211_get_qos_ctl(hdr) = tid; | ||||
|  	} | ||||
|   | ||||
| @@ -3733,6 +3739,7 @@ static bool ieee80211_xmit_fast(struct i | ||||
| @@ -3737,6 +3743,7 @@ static bool ieee80211_xmit_fast(struct i | ||||
|  	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; | ||||
|  	struct tid_ampdu_tx *tid_tx = NULL; | ||||
|  	struct sk_buff *next; | ||||
| @@ -804,7 +804,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	u8 tid = IEEE80211_NUM_TIDS; | ||||
|   | ||||
|  	/* control port protocol needs a lot of special handling */ | ||||
| @@ -3758,6 +3765,8 @@ static bool ieee80211_xmit_fast(struct i | ||||
| @@ -3762,6 +3769,8 @@ static bool ieee80211_xmit_fast(struct i | ||||
|  		} | ||||
|  	} | ||||
|   | ||||
| @@ -813,7 +813,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	/* after this point (skb is modified) we cannot return false */ | ||||
|  	skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata)); | ||||
|  	if (!skb) | ||||
| @@ -3765,7 +3774,8 @@ static bool ieee80211_xmit_fast(struct i | ||||
| @@ -3769,7 +3778,8 @@ static bool ieee80211_xmit_fast(struct i | ||||
|   | ||||
|  	skb_list_walk_safe(skb, skb, next) { | ||||
|  		skb_mark_not_on_list(skb); | ||||
| @@ -823,7 +823,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	} | ||||
|   | ||||
|  	return true; | ||||
| @@ -4252,8 +4262,15 @@ void __ieee80211_subif_start_xmit(struct | ||||
| @@ -4256,8 +4266,15 @@ void __ieee80211_subif_start_xmit(struct | ||||
|  		return; | ||||
|  	} | ||||
|   | ||||
| @@ -839,7 +839,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  	if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) | ||||
|  		goto out_free; | ||||
|   | ||||
| @@ -4263,8 +4280,6 @@ void __ieee80211_subif_start_xmit(struct | ||||
| @@ -4267,8 +4284,6 @@ void __ieee80211_subif_start_xmit(struct | ||||
|  	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb)); | ||||
|  	ieee80211_aggr_check(sdata, sta, skb); | ||||
|   | ||||
|   | ||||
| @@ -117,7 +117,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, | ||||
| --- a/net/mac80211/tx.c | ||||
| +++ b/net/mac80211/tx.c | ||||
| @@ -1191,10 +1191,8 @@ static bool ieee80211_tx_prep_agg(struct | ||||
| @@ -1195,10 +1195,8 @@ static bool ieee80211_tx_prep_agg(struct | ||||
|  	return queued; | ||||
|  } | ||||
|   | ||||
|   | ||||
| @@ -13,7 +13,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> | ||||
|  | ||||
| --- a/include/net/mac80211.h | ||||
| +++ b/include/net/mac80211.h | ||||
| @@ -5964,6 +5964,18 @@ void ieee80211_queue_delayed_work(struct | ||||
| @@ -5975,6 +5975,18 @@ void ieee80211_queue_delayed_work(struct | ||||
|  				  unsigned long delay); | ||||
|   | ||||
|  /** | ||||
|   | ||||
| @@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|  | ||||
| --- a/include/net/mac80211.h | ||||
| +++ b/include/net/mac80211.h | ||||
| @@ -4192,6 +4192,10 @@ struct ieee80211_prep_tx_info { | ||||
| @@ -4203,6 +4203,10 @@ struct ieee80211_prep_tx_info { | ||||
|   *	Note that a sta can also be inserted or removed with valid links, | ||||
|   *	i.e. passed to @sta_add/@sta_state with sta->valid_links not zero. | ||||
|   *	In fact, cannot change from having valid_links and not having them. | ||||
| @@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
|   */ | ||||
|  struct ieee80211_ops { | ||||
|  	void (*tx)(struct ieee80211_hw *hw, | ||||
| @@ -4547,6 +4551,11 @@ struct ieee80211_ops { | ||||
| @@ -4558,6 +4562,11 @@ struct ieee80211_ops { | ||||
|  				struct ieee80211_vif *vif, | ||||
|  				struct ieee80211_sta *sta, | ||||
|  				u16 old_links, u16 new_links); | ||||
|   | ||||
| @@ -15,7 +15,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com> | ||||
|  | ||||
| --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c | ||||
| +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c | ||||
| @@ -601,8 +601,9 @@ static void iwl_mvm_skb_prepare_status(s | ||||
| @@ -605,8 +605,9 @@ static void iwl_mvm_skb_prepare_status(s | ||||
|   | ||||
|  static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm, | ||||
|  				      struct ieee80211_tx_info *info, | ||||
| @@ -26,7 +26,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com> | ||||
|  	struct iwl_mvm_vif *mvmvif = | ||||
|  		iwl_mvm_vif_from_mac80211(info->control.vif); | ||||
|  	__le16 fc = hdr->frame_control; | ||||
| @@ -621,7 +622,7 @@ static int iwl_mvm_get_ctrl_vif_queue(st | ||||
| @@ -625,7 +626,7 @@ static int iwl_mvm_get_ctrl_vif_queue(st | ||||
|  		 * reason 7 ("Class 3 frame received from nonassociated STA"). | ||||
|  		 */ | ||||
|  		if (ieee80211_is_mgmt(fc) && | ||||
| @@ -35,7 +35,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com> | ||||
|  		     ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc))) | ||||
|  			return mvm->probe_queue; | ||||
|   | ||||
| @@ -740,7 +741,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv | ||||
| @@ -744,7 +745,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv | ||||
|  			else | ||||
|  				sta_id = mvmvif->mcast_sta.sta_id; | ||||
|   | ||||
| @@ -114,7 +114,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com> | ||||
|   */ | ||||
| --- a/net/mac80211/tx.c | ||||
| +++ b/net/mac80211/tx.c | ||||
| @@ -488,7 +488,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee | ||||
| @@ -492,7 +492,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee | ||||
|  		int ac = skb_get_queue_mapping(tx->skb); | ||||
|   | ||||
|  		if (ieee80211_is_mgmt(hdr->frame_control) && | ||||
| @@ -123,7 +123,7 @@ Reviewed-by: Peer, Ilan <ilan.peer@intel.com> | ||||
|  			info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER; | ||||
|  			return TX_CONTINUE; | ||||
|  		} | ||||
| @@ -1326,7 +1326,7 @@ static struct txq_info *ieee80211_get_tx | ||||
| @@ -1330,7 +1330,7 @@ static struct txq_info *ieee80211_get_tx | ||||
|  	if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) && | ||||
|  	    unlikely(!ieee80211_is_data_present(hdr->frame_control))) { | ||||
|  		if ((!ieee80211_is_mgmt(hdr->frame_control) || | ||||
|   | ||||
| @@ -12,7 +12,7 @@ Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com> | ||||
|  | ||||
| --- a/include/net/mac80211.h | ||||
| +++ b/include/net/mac80211.h | ||||
| @@ -3918,6 +3918,10 @@ struct ieee80211_prep_tx_info { | ||||
| @@ -3929,6 +3929,10 @@ struct ieee80211_prep_tx_info { | ||||
|   *	Note that vif can be NULL. | ||||
|   *	The callback can sleep. | ||||
|   * | ||||
| @@ -23,7 +23,7 @@ Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com> | ||||
|   * @channel_switch: Drivers that need (or want) to offload the channel | ||||
|   *	switch operation for CSAs received from the AP may implement this | ||||
|   *	callback. They must then call ieee80211_chswitch_done() to indicate | ||||
| @@ -4372,6 +4376,8 @@ struct ieee80211_ops { | ||||
| @@ -4383,6 +4387,8 @@ struct ieee80211_ops { | ||||
|  #endif | ||||
|  	void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | ||||
|  		      u32 queues, bool drop); | ||||
|   | ||||
| @@ -38,7 +38,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  | ||||
| --- a/include/net/mac80211.h | ||||
| +++ b/include/net/mac80211.h | ||||
| @@ -5252,6 +5252,74 @@ ieee80211_beacon_get_template(struct iee | ||||
| @@ -5263,6 +5263,74 @@ ieee80211_beacon_get_template(struct iee | ||||
|  			      unsigned int link_id); | ||||
|   | ||||
|  /** | ||||
| @@ -168,7 +168,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|   | ||||
| --- a/net/mac80211/tx.c | ||||
| +++ b/net/mac80211/tx.c | ||||
| @@ -5205,13 +5205,20 @@ ieee80211_beacon_get_finish(struct ieee8 | ||||
| @@ -5209,13 +5209,20 @@ ieee80211_beacon_get_finish(struct ieee8 | ||||
|  } | ||||
|   | ||||
|  static void | ||||
| @@ -192,7 +192,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	for (i = 0; i < beacon->mbssid_ies->cnt; i++) | ||||
|  		skb_put_data(skb, beacon->mbssid_ies->elem[i].data, | ||||
|  			     beacon->mbssid_ies->elem[i].len); | ||||
| @@ -5224,7 +5231,8 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
| @@ -5228,7 +5235,8 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
|  			struct ieee80211_mutable_offsets *offs, | ||||
|  			bool is_template, | ||||
|  			struct beacon_data *beacon, | ||||
| @@ -202,7 +202,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  { | ||||
|  	struct ieee80211_local *local = hw_to_local(hw); | ||||
|  	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | ||||
| @@ -5243,7 +5251,9 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
| @@ -5247,7 +5255,9 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
|  	/* headroom, head length, | ||||
|  	 * tail length, maximum TIM length and multiple BSSID length | ||||
|  	 */ | ||||
| @@ -213,7 +213,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	skb = dev_alloc_skb(local->tx_headroom + beacon->head_len + | ||||
|  			    beacon->tail_len + 256 + | ||||
|  			    local->hw.extra_beacon_tailroom + mbssid_len); | ||||
| @@ -5261,7 +5271,7 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
| @@ -5265,7 +5275,7 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
|  		offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0]; | ||||
|   | ||||
|  		if (mbssid_len) { | ||||
| @@ -222,7 +222,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  			offs->mbssid_off = skb->len - mbssid_len; | ||||
|  		} | ||||
|   | ||||
| @@ -5280,12 +5290,51 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
| @@ -5284,12 +5294,51 @@ ieee80211_beacon_get_ap(struct ieee80211 | ||||
|  	return skb; | ||||
|  } | ||||
|   | ||||
| @@ -275,7 +275,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  { | ||||
|  	struct ieee80211_local *local = hw_to_local(hw); | ||||
|  	struct beacon_data *beacon = NULL; | ||||
| @@ -5314,8 +5363,29 @@ __ieee80211_beacon_get(struct ieee80211_ | ||||
| @@ -5318,8 +5367,29 @@ __ieee80211_beacon_get(struct ieee80211_ | ||||
|  		if (!beacon) | ||||
|  			goto out; | ||||
|   | ||||
| @@ -307,7 +307,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  	} else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { | ||||
|  		struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; | ||||
|  		struct ieee80211_hdr *hdr; | ||||
| @@ -5403,10 +5473,50 @@ ieee80211_beacon_get_template(struct iee | ||||
| @@ -5407,10 +5477,50 @@ ieee80211_beacon_get_template(struct iee | ||||
|  			      struct ieee80211_mutable_offsets *offs, | ||||
|  			      unsigned int link_id) | ||||
|  { | ||||
| @@ -359,7 +359,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
|  struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, | ||||
|  					 struct ieee80211_vif *vif, | ||||
|  					 u16 *tim_offset, u16 *tim_length, | ||||
| @@ -5414,7 +5524,9 @@ struct sk_buff *ieee80211_beacon_get_tim | ||||
| @@ -5418,7 +5528,9 @@ struct sk_buff *ieee80211_beacon_get_tim | ||||
|  { | ||||
|  	struct ieee80211_mutable_offsets offs = {}; | ||||
|  	struct sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false, | ||||
|   | ||||
| @@ -16,7 +16,7 @@ and we should ignore this. | ||||
|  | ||||
| --- a/net/wireless/core.c | ||||
| +++ b/net/wireless/core.c | ||||
| @@ -614,21 +614,6 @@ static int wiphy_verify_combinations(str | ||||
| @@ -630,21 +630,6 @@ static int wiphy_verify_combinations(str | ||||
|  				    c->limits[j].max > 1)) | ||||
|  				return -EINVAL; | ||||
|   | ||||
|   | ||||
| @@ -18,7 +18,7 @@ | ||||
|   | ||||
| --- a/include/net/mac80211.h | ||||
| +++ b/include/net/mac80211.h | ||||
| @@ -1677,6 +1677,7 @@ enum ieee80211_smps_mode { | ||||
| @@ -1688,6 +1688,7 @@ enum ieee80211_smps_mode { | ||||
|   * | ||||
|   * @power_level: requested transmit power (in dBm), backward compatibility | ||||
|   *	value only that is set to the minimum of all interfaces | ||||
| @@ -26,7 +26,7 @@ | ||||
|   * | ||||
|   * @chandef: the channel definition to tune to | ||||
|   * @radar_enabled: whether radar detection is enabled | ||||
| @@ -1697,6 +1698,7 @@ enum ieee80211_smps_mode { | ||||
| @@ -1708,6 +1709,7 @@ enum ieee80211_smps_mode { | ||||
|  struct ieee80211_conf { | ||||
|  	u32 flags; | ||||
|  	int power_level, dynamic_ps_timeout; | ||||
|   | ||||
| @@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net> | ||||
|  | ||||
| --- a/net/mac80211/sta_info.c | ||||
| +++ b/net/mac80211/sta_info.c | ||||
| @@ -2422,6 +2422,13 @@ static void sta_stats_decode_rate(struct | ||||
| @@ -2363,6 +2363,13 @@ static void sta_stats_decode_rate(struct | ||||
|   | ||||
|  		sband = local->hw.wiphy->bands[band]; | ||||
|   | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| --- a/include/net/mac80211.h | ||||
| +++ b/include/net/mac80211.h | ||||
| @@ -673,6 +673,12 @@ | ||||
| @@ -673,6 +673,12 @@ struct ieee80211_fils_discovery { | ||||
|   * @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission | ||||
|   *	(non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU | ||||
|   *	bandwidth | ||||
| @@ -13,7 +13,7 @@ | ||||
|   */ | ||||
|  struct ieee80211_bss_conf { | ||||
|  	const u8 *bssid; | ||||
| @@ -758,6 +764,9 @@ | ||||
| @@ -758,6 +764,9 @@ struct ieee80211_bss_conf { | ||||
|  	bool he_su_beamformee; | ||||
|  	bool he_mu_beamformer; | ||||
|  	bool he_full_ul_mumimo; | ||||
| @@ -25,7 +25,7 @@ | ||||
|  /** | ||||
| --- a/net/mac80211/cfg.c | ||||
| +++ b/net/mac80211/cfg.c | ||||
| @@ -1307,6 +1307,27 @@ | ||||
| @@ -1307,6 +1307,27 @@ static int ieee80211_start_ap(struct wip | ||||
|  				IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO; | ||||
|  	} | ||||
|   | ||||
|   | ||||
| @@ -153,11 +153,11 @@ func (b *Base) DialOptions(opts ...dialer.Option) []dialer.Option { | ||||
| } | ||||
|  | ||||
| type BasicOption struct { | ||||
| 	TFO         bool   `proxy:"tfo,omitempty" group:"tfo,omitempty"` | ||||
| 	MPTCP       bool   `proxy:"mptcp,omitempty" group:"mptcp,omitempty"` | ||||
| 	TFO         bool   `proxy:"tfo,omitempty"` | ||||
| 	MPTCP       bool   `proxy:"mptcp,omitempty"` | ||||
| 	Interface   string `proxy:"interface-name,omitempty" group:"interface-name,omitempty"` | ||||
| 	RoutingMark int    `proxy:"routing-mark,omitempty" group:"routing-mark,omitempty"` | ||||
| 	IPVersion   string `proxy:"ip-version,omitempty" group:"ip-version,omitempty"` | ||||
| 	IPVersion   string `proxy:"ip-version,omitempty"` | ||||
| 	DialerProxy string `proxy:"dialer-proxy,omitempty"` // don't apply this option into groups, but can set a group name in a proxy | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -46,6 +46,13 @@ type GroupBaseOption struct { | ||||
| } | ||||
|  | ||||
| func NewGroupBase(opt GroupBaseOption) *GroupBase { | ||||
| 	if opt.RoutingMark != 0 { | ||||
| 		log.Warnln("The group [%s] with routing-mark configuration is deprecated, please set it directly on the proxy instead", opt.Name) | ||||
| 	} | ||||
| 	if opt.Interface != "" { | ||||
| 		log.Warnln("The group [%s] with interface-name configuration is deprecated, please set it directly on the proxy instead", opt.Name) | ||||
| 	} | ||||
|  | ||||
| 	var excludeFilterReg *regexp2.Regexp | ||||
| 	if opt.excludeFilter != "" { | ||||
| 		excludeFilterReg = regexp2.MustCompile(opt.excludeFilter, regexp2.None) | ||||
|   | ||||
| @@ -17,7 +17,6 @@ import ( | ||||
| 	C "github.com/metacubex/mihomo/constant" | ||||
| ) | ||||
|  | ||||
| var trustCerts []*x509.Certificate | ||||
| var globalCertPool *x509.CertPool | ||||
| var mutex sync.RWMutex | ||||
| var errNotMatch = errors.New("certificate fingerprints do not match") | ||||
| @@ -30,11 +29,19 @@ var DisableSystemCa, _ = strconv.ParseBool(os.Getenv("DISABLE_SYSTEM_CA")) | ||||
| func AddCertificate(certificate string) error { | ||||
| 	mutex.Lock() | ||||
| 	defer mutex.Unlock() | ||||
|  | ||||
| 	if certificate == "" { | ||||
| 		return fmt.Errorf("certificate is empty") | ||||
| 	} | ||||
| 	if cert, err := x509.ParseCertificate([]byte(certificate)); err == nil { | ||||
| 		trustCerts = append(trustCerts, cert) | ||||
|  | ||||
| 	if globalCertPool == nil { | ||||
| 		initializeCertPool() | ||||
| 	} | ||||
|  | ||||
| 	if globalCertPool.AppendCertsFromPEM([]byte(certificate)) { | ||||
| 		return nil | ||||
| 	} else if cert, err := x509.ParseCertificate([]byte(certificate)); err == nil { | ||||
| 		globalCertPool.AddCert(cert) | ||||
| 		return nil | ||||
| 	} else { | ||||
| 		return fmt.Errorf("add certificate failed") | ||||
| @@ -51,9 +58,6 @@ func initializeCertPool() { | ||||
| 			globalCertPool = x509.NewCertPool() | ||||
| 		} | ||||
| 	} | ||||
| 	for _, cert := range trustCerts { | ||||
| 		globalCertPool.AddCert(cert) | ||||
| 	} | ||||
| 	if !DisableEmbedCa { | ||||
| 		globalCertPool.AppendCertsFromPEM(_CaCertificates) | ||||
| 	} | ||||
| @@ -62,7 +66,6 @@ func initializeCertPool() { | ||||
| func ResetCertificate() { | ||||
| 	mutex.Lock() | ||||
| 	defer mutex.Unlock() | ||||
| 	trustCerts = nil | ||||
| 	initializeCertPool() | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -31,7 +31,12 @@ AC_DEFUN([ss_MBEDTLS], | ||||
|   AC_COMPILE_IFELSE( | ||||
|     [AC_LANG_PROGRAM( | ||||
|       [[ | ||||
| #include <mbedtls/version.h> | ||||
| #if MBEDTLS_VERSION_NUMBER >= 0x03000000 | ||||
| #include <mbedtls/mbedtls_config.h> | ||||
| #else | ||||
| #include <mbedtls/config.h> | ||||
| #endif | ||||
|       ]], | ||||
|       [[ | ||||
| #ifndef MBEDTLS_CIPHER_MODE_CFB | ||||
| @@ -48,7 +53,12 @@ AC_DEFUN([ss_MBEDTLS], | ||||
|   AC_COMPILE_IFELSE( | ||||
|     [AC_LANG_PROGRAM( | ||||
|       [[ | ||||
| #include <mbedtls/version.h> | ||||
| #if MBEDTLS_VERSION_NUMBER >= 0x03000000 | ||||
| #include <mbedtls/mbedtls_config.h> | ||||
| #else | ||||
| #include <mbedtls/config.h> | ||||
| #endif | ||||
|       ]], | ||||
|       [[ | ||||
| #ifndef MBEDTLS_ARC4_C | ||||
| @@ -64,7 +74,12 @@ AC_DEFUN([ss_MBEDTLS], | ||||
|   AC_COMPILE_IFELSE( | ||||
|     [AC_LANG_PROGRAM( | ||||
|       [[ | ||||
| #include <mbedtls/version.h> | ||||
| #if MBEDTLS_VERSION_NUMBER >= 0x03000000 | ||||
| #include <mbedtls/mbedtls_config.h> | ||||
| #else | ||||
| #include <mbedtls/config.h> | ||||
| #endif | ||||
|       ]], | ||||
|       [[ | ||||
| #ifndef MBEDTLS_BLOWFISH_C | ||||
| @@ -80,7 +95,12 @@ AC_DEFUN([ss_MBEDTLS], | ||||
|   AC_COMPILE_IFELSE( | ||||
|     [AC_LANG_PROGRAM( | ||||
|       [[ | ||||
| #include <mbedtls/version.h> | ||||
| #if MBEDTLS_VERSION_NUMBER >= 0x03000000 | ||||
| #include <mbedtls/mbedtls_config.h> | ||||
| #else | ||||
| #include <mbedtls/config.h> | ||||
| #endif | ||||
|       ]], | ||||
|       [[ | ||||
| #ifndef MBEDTLS_CAMELLIA_C | ||||
|   | ||||
| @@ -177,9 +177,13 @@ aead_cipher_encrypt(cipher_ctx_t *cipher_ctx, | ||||
|     // Otherwise, just use the mbedTLS one with crappy AES-NI. | ||||
|     case AES192GCM: | ||||
|     case AES128GCM: | ||||
|  | ||||
| #if MBEDTLS_VERSION_NUMBER < 0x03000000 | ||||
|         err = mbedtls_cipher_auth_encrypt(cipher_ctx->evp, n, nlen, ad, adlen, | ||||
|                                           m, mlen, c, clen, c + mlen, tlen); | ||||
| #else | ||||
|         err = mbedtls_cipher_auth_encrypt_ext(cipher_ctx->evp, n, nlen, ad, adlen, | ||||
|                                               m, mlen, c, mlen + tlen, clen, tlen); | ||||
| #endif | ||||
|         *clen += tlen; | ||||
|         break; | ||||
|     case CHACHA20POLY1305IETF: | ||||
| @@ -226,8 +230,13 @@ aead_cipher_decrypt(cipher_ctx_t *cipher_ctx, | ||||
|     // Otherwise, just use the mbedTLS one with crappy AES-NI. | ||||
|     case AES192GCM: | ||||
|     case AES128GCM: | ||||
| #if MBEDTLS_VERSION_NUMBER < 0x03000000 | ||||
|         err = mbedtls_cipher_auth_decrypt(cipher_ctx->evp, n, nlen, ad, adlen, | ||||
|                                           m, mlen - tlen, p, plen, m + mlen - tlen, tlen); | ||||
| #else | ||||
|         err = mbedtls_cipher_auth_decrypt_ext(cipher_ctx->evp, n, nlen, ad, adlen, | ||||
|                                               m, mlen, p, mlen - tlen, plen, tlen); | ||||
| #endif | ||||
|         break; | ||||
|     case CHACHA20POLY1305IETF: | ||||
|         err = crypto_aead_chacha20poly1305_ietf_decrypt(p, &long_plen, NULL, m, mlen, | ||||
| @@ -721,17 +730,7 @@ aead_key_init(int method, const char *pass, const char *key) | ||||
|     cipher_t *cipher = (cipher_t *)ss_malloc(sizeof(cipher_t)); | ||||
|     memset(cipher, 0, sizeof(cipher_t)); | ||||
|  | ||||
|     if (method >= CHACHA20POLY1305IETF) { | ||||
|         cipher_kt_t *cipher_info = (cipher_kt_t *)ss_malloc(sizeof(cipher_kt_t)); | ||||
|         cipher->info             = cipher_info; | ||||
|         cipher->info->base       = NULL; | ||||
|         cipher->info->key_bitlen = supported_aead_ciphers_key_size[method] * 8; | ||||
|         cipher->info->iv_size    = supported_aead_ciphers_nonce_size[method]; | ||||
|     } else { | ||||
|         cipher->info = (cipher_kt_t *)aead_get_cipher_type(method); | ||||
|     } | ||||
|  | ||||
|     if (cipher->info == NULL && cipher->key_len == 0) { | ||||
|     if (method < CHACHA20POLY1305IETF && aead_get_cipher_type(method) == NULL) { | ||||
|         LOGE("Cipher %s not found in crypto library", supported_aead_ciphers[method]); | ||||
|         FATAL("Cannot initialize cipher"); | ||||
|     } | ||||
|   | ||||
| @@ -103,7 +103,7 @@ crypto_md5(const unsigned char *d, size_t n, unsigned char *md) | ||||
|     if (md == NULL) { | ||||
|         md = m; | ||||
|     } | ||||
| #if MBEDTLS_VERSION_NUMBER >= 0x02070000 | ||||
| #if MBEDTLS_VERSION_NUMBER < 0x03000000 && MBEDTLS_VERSION_NUMBER >= 0x02070000 | ||||
|     if (mbedtls_md5_ret(d, n, md) != 0) | ||||
|         FATAL("Failed to calculate MD5"); | ||||
| #else | ||||
|   | ||||
| @@ -97,7 +97,6 @@ typedef struct buffer { | ||||
| typedef struct { | ||||
|     int method; | ||||
|     int skey; | ||||
|     cipher_kt_t *info; | ||||
|     size_t nonce_len; | ||||
|     size_t key_len; | ||||
|     size_t tag_len; | ||||
|   | ||||
| @@ -168,33 +168,6 @@ crypto_stream_xor_ic(uint8_t *c, const uint8_t *m, uint64_t mlen, | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| cipher_nonce_size(const cipher_t *cipher) | ||||
| { | ||||
|     if (cipher == NULL) { | ||||
|         return 0; | ||||
|     } | ||||
|     return cipher->info->iv_size; | ||||
| } | ||||
|  | ||||
| int | ||||
| cipher_key_size(const cipher_t *cipher) | ||||
| { | ||||
|     /* | ||||
|      * Semi-API changes (technically public, morally prnonceate) | ||||
|      * Renamed a few headers to include _internal in the name. Those headers are | ||||
|      * not supposed to be included by users. | ||||
|      * Changed md_info_t into an opaque structure (use md_get_xxx() accessors). | ||||
|      * Changed pk_info_t into an opaque structure. | ||||
|      * Changed cipher_base_t into an opaque structure. | ||||
|      */ | ||||
|     if (cipher == NULL) { | ||||
|         return 0; | ||||
|     } | ||||
|     /* From Version 1.2.7 released 2013-04-13 Default Blowfish keysize is now 128-bits */ | ||||
|     return cipher->info->key_bitlen / 8; | ||||
| } | ||||
|  | ||||
| const cipher_kt_t * | ||||
| stream_get_cipher_type(int method) | ||||
| { | ||||
| @@ -642,34 +615,22 @@ stream_key_init(int method, const char *pass, const char *key) | ||||
|     cipher_t *cipher = (cipher_t *)ss_malloc(sizeof(cipher_t)); | ||||
|     memset(cipher, 0, sizeof(cipher_t)); | ||||
|  | ||||
|     if (method == SALSA20 || method == CHACHA20 || method == CHACHA20IETF) { | ||||
|         cipher_kt_t *cipher_info = (cipher_kt_t *)ss_malloc(sizeof(cipher_kt_t)); | ||||
|         cipher->info             = cipher_info; | ||||
|         cipher->info->base       = NULL; | ||||
|         cipher->info->key_bitlen = supported_stream_ciphers_key_size[method] * 8; | ||||
|         cipher->info->iv_size    = supported_stream_ciphers_nonce_size[method]; | ||||
|     } else { | ||||
|         cipher->info = (cipher_kt_t *)stream_get_cipher_type(method); | ||||
|     } | ||||
|  | ||||
|     if (cipher->info == NULL && cipher->key_len == 0) { | ||||
|     if (method < SALSA20 && stream_get_cipher_type(method) == NULL) { | ||||
|         LOGE("Cipher %s not found in crypto library", supported_stream_ciphers[method]); | ||||
|         FATAL("Cannot initialize cipher"); | ||||
|     } | ||||
|  | ||||
|     if (key != NULL) | ||||
|         cipher->key_len = crypto_parse_key(key, cipher->key, cipher_key_size(cipher)); | ||||
|         cipher->key_len = crypto_parse_key(key, cipher->key, | ||||
|                                            supported_stream_ciphers_key_size[method]); | ||||
|     else | ||||
|         cipher->key_len = crypto_derive_key(pass, cipher->key, cipher_key_size(cipher)); | ||||
|         cipher->key_len = crypto_derive_key(pass, cipher->key, | ||||
|                                             supported_stream_ciphers_key_size[method]); | ||||
|  | ||||
|     if (cipher->key_len == 0) { | ||||
|         FATAL("Cannot generate key and NONCE"); | ||||
|     } | ||||
|     if (method == RC4_MD5) { | ||||
|         cipher->nonce_len = 16; | ||||
|     } else { | ||||
|         cipher->nonce_len = cipher_nonce_size(cipher); | ||||
|     } | ||||
|     cipher->nonce_len = supported_stream_ciphers_nonce_size[method]; | ||||
|     cipher->method = method; | ||||
|  | ||||
|     return cipher; | ||||
|   | ||||
| @@ -168,6 +168,7 @@ return view.extend({ | ||||
| 		const res_ver_geoip = data[7]; | ||||
| 		const res_ver_geosite = data[8]; | ||||
|  | ||||
| 		const less_24_10 = !form.RichListValue; | ||||
| 		const dashboard_repo = uci.get(data[0], 'api', 'dashboard_repo'); | ||||
|  | ||||
| 		let m, s, o, ss, so; | ||||
| @@ -472,7 +473,7 @@ return view.extend({ | ||||
| 		} | ||||
| 		so.default = 'system'; | ||||
| 		so.rmempty = false; | ||||
| 		if (!form.RichListValue) | ||||
| 		if (less_24_10) | ||||
| 			so.onchange = function(ev, section_id, value) { | ||||
| 				var desc = ev.target.nextSibling; | ||||
| 				if (value === 'mixed') | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=naiveproxy | ||||
| PKG_VERSION:=132.0.6834.79-1 | ||||
| PKG_VERSION:=132.0.6834.79-2 | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| # intel 80386 & riscv64 & cortex-a76 | ||||
| @@ -20,47 +20,47 @@ else ifeq ($(ARCH_PREBUILT),riscv64_riscv64) | ||||
| endif | ||||
|  | ||||
| ifeq ($(ARCH_PACKAGES),aarch64_cortex-a53) | ||||
|   PKG_HASH:=4264588ab16565425a62436d5946a0630759acc3a71e2a673e2d5383caed8320 | ||||
|   PKG_HASH:=24548efa8a257320a169b9a9f4692043dc00ee7c35bd211ea04a2ec161bbf39d | ||||
| else ifeq ($(ARCH_PACKAGES),aarch64_cortex-a72) | ||||
|   PKG_HASH:=f4272d75cdcf4e5f9328886e50e49115ea40b75c373dcd7bbce1045a791beed8 | ||||
|   PKG_HASH:=2849150414fd7ab21552cedc21bfa1c41a6ff1e1c3aa3cc2d44436aab74912e1 | ||||
| else ifeq ($(ARCH_PACKAGES),aarch64_generic) | ||||
|   PKG_HASH:=b50ef4064c8e609730233fc358b4e992f174323eb11153f63ecbb152cbe4b92e | ||||
|   PKG_HASH:=71fbc160c5f8df9ae96d7f91b646e24f2eb142928df8186fe50a9d73cfac842e | ||||
| else ifeq ($(ARCH_PACKAGES),arm_arm1176jzf-s_vfp) | ||||
|   PKG_HASH:=62cc7f13cbe49ff358692bb81c4ced66fbf0ec103dcff99f15ae7e56d9186b51 | ||||
|   PKG_HASH:=7ce0ba453c09f9978e421575aca96b34d381ec1731f19d29d8e16e7968fb1888 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_arm926ej-s) | ||||
|   PKG_HASH:=bd050616edb6d6538001db64dc7dcfc13941855890ec5741beff1144a897530c | ||||
|   PKG_HASH:=000d92d9865f406dfd9bf7848c455312a1ce42a778c970f484bdf93c3a805973 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a15_neon-vfpv4) | ||||
|   PKG_HASH:=af2510de66dac0cde22b090864cfae314405969665a4abfc95bed51a77500e82 | ||||
|   PKG_HASH:=94f22ed0e270d47b035ec6380ce6b26db93ff01382641c222f2db11929cc0856 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a5_vfpv4) | ||||
|   PKG_HASH:=2d12bb48e50fb88c3ab1375fc9f0df56d45aeaa3fc6c82b78555c1c4b7855266 | ||||
|   PKG_HASH:=a4cfc13e78000f3de8561f9f299e60536435b8e8b9208fc2ad34318662d78b28 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a7) | ||||
|   PKG_HASH:=442133a5545fc83bb3c36ad14a631ccb930750e0969abf508636cf7f6cf29e7e | ||||
|   PKG_HASH:=e27d13fc44deecd5083d0e5cdf9f0df83a642df714f4a13a69b706bb5198a61e | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a7_neon-vfpv4) | ||||
|   PKG_HASH:=e144fafb14c8bad7e7d96d01f3d3d799fddfcd1f620e8f045376a19c497c0f54 | ||||
|   PKG_HASH:=15315b9671ca61fb848b4e8d6f8162a1ce9fc9fe4fad3702678256fa90414641 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a7_vfpv4) | ||||
|   PKG_HASH:=5f65427412398053e9cecc3139c91fb8b09147ddfd42b91df742b9909b141bc8 | ||||
|   PKG_HASH:=6ad229a26fdaac664fa0bc5f8f4417e034fbf7ea8d6719eaf26882b758f8864e | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a8_vfpv3) | ||||
|   PKG_HASH:=f9bdb669b6440d088336d17daaea24c6ecef85de4b8bac756a2d1fbd487fa1b1 | ||||
|   PKG_HASH:=871a8bc18bfcd5d9e2dcd965887be2f5617c9baec5bd0a6d17a5569782a69b8b | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a9) | ||||
|   PKG_HASH:=8a4fbba18e8157dafddb7e684cf3c06bef2f10d3f9796bf0ea2496f9c788389c | ||||
|   PKG_HASH:=137eb801293e8a3336626dc58434ee135751960332d8237d6c54aa6944eb17d4 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a9_neon) | ||||
|   PKG_HASH:=b1371c204a9f4fa7cf98be0df0fbb257fd6708e7a096a57d9d31740b3ee74360 | ||||
|   PKG_HASH:=deace84168fdce2656c0b6d9fa094fdd8dbdd4e8f95c422043f5dee7cbdb5d26 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_cortex-a9_vfpv3-d16) | ||||
|   PKG_HASH:=fb3dde55b6642a0527b0ea9110fcad8081255248a4bc59bf530768eaaee1e5b8 | ||||
|   PKG_HASH:=51e4ee3521b575fc2c12a1baa276e0802d3fc10a32a62f190c2c9b56c008e40d | ||||
| else ifeq ($(ARCH_PACKAGES),arm_mpcore) | ||||
|   PKG_HASH:=29293985c3d4af1bb0699a9907852555db6a3d8f1a01cc2a58651f9d20776e6f | ||||
|   PKG_HASH:=008d2231c867614dc3e40c966261d9dc5c9931b3c68beb33549ad3d4f7bed2f1 | ||||
| else ifeq ($(ARCH_PACKAGES),arm_xscale) | ||||
|   PKG_HASH:=26909683e0586696f2b3c914be6fd1132c93c8eb4dec99bea93d70accddb66d6 | ||||
|   PKG_HASH:=d8160e3b0963d124eb91762c6df9d96207510dc1a5f28f32f3ad6f6133f49d75 | ||||
| else ifeq ($(ARCH_PACKAGES),mipsel_24kc) | ||||
|   PKG_HASH:=7ea7084fbcf22259a1ee7d785f886986f0f16e6dda86838991af50fb2b24cb72 | ||||
|   PKG_HASH:=f9c0a4049388058aaa881aa13385470497beaeeca6473baf6539905a75d098bf | ||||
| else ifeq ($(ARCH_PACKAGES),mipsel_mips32) | ||||
|   PKG_HASH:=cea3005186f9010cb5270bc5fd99d68c5d7f77c8267129ab4f114c37699c2aa3 | ||||
|   PKG_HASH:=fd2520202c1cbe82498c90594a71cd1ed6aa4d8a6d470cf84871fd1d8f646380 | ||||
| else ifeq ($(ARCH_PACKAGES),riscv64) | ||||
|   PKG_HASH:=515d14ae15009abaad4016ba36848a71ba52bca9b4aa8f207eec2343d31ed608 | ||||
|   PKG_HASH:=557f8054e7643d6cdbbd1f70922ddf131f60ad03fb2cadf994ac15c9303d84ed | ||||
| else ifeq ($(ARCH_PACKAGES),x86) | ||||
|   PKG_HASH:=f53aba8d13f8ba11af0ba26e27c8fc616b7a28a0e1d81814e0128c10cc92d3be | ||||
|   PKG_HASH:=eab01156720906345230f6fb9cde7580b88e66799a4bdcef58636addbcab9a6c | ||||
| else ifeq ($(ARCH_PACKAGES),x86_64) | ||||
|   PKG_HASH:=2369644fb5ccb41cf511ddca67d30cc7f04e64068f4d1d28c42155b86dfd4a06 | ||||
|   PKG_HASH:=95fd43646b86512ea46d87ccd0b5adda50aefe5c53dbcfd4b47930a146bec8b9 | ||||
| else | ||||
|   PKG_HASH:=dummy | ||||
| endif | ||||
|   | ||||
| @@ -30,13 +30,13 @@ define Download/geosite | ||||
|   HASH:=aa65cee72dd6afbf9dd4c474b4ff28ceb063f6abf99249a084091adb4f282f09 | ||||
| endef | ||||
|  | ||||
| GEOSITE_IRAN_VER:=202501130037 | ||||
| GEOSITE_IRAN_VER:=202501200034 | ||||
| GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER) | ||||
| define Download/geosite-ir | ||||
|   URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/ | ||||
|   URL_FILE:=iran.dat | ||||
|   FILE:=$(GEOSITE_IRAN_FILE) | ||||
|   HASH:=72014870e40bd6a75bc3ee91d1bd578f766bbb5ccc237380a13aa1c6e1aee073 | ||||
|   HASH:=72a191d2ec9595484a1af53012d27fba74f1337dc258d62d862c69ca649dc1f8 | ||||
| endef | ||||
|  | ||||
| define Package/v2ray-geodata/template | ||||
|   | ||||
							
								
								
									
										415
									
								
								v2rayn/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										415
									
								
								v2rayn/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,19 +1,400 @@ | ||||
| ################################################################################ | ||||
| # 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 | ||||
| ################################################################################ | ||||
| ## Ignore Visual Studio temporary files, build results, and | ||||
| ## files generated by popular Visual Studio add-ons. | ||||
| ## | ||||
| ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore | ||||
|  | ||||
| /v2rayN/.vs/ | ||||
| /v2rayN/v2rayN/bin/Debug/app.publish | ||||
| /v2rayN/v2rayN/bin/Debug | ||||
| /v2rayN/v2rayN/bin/Release | ||||
| /v2rayN/v2rayN/obj/ | ||||
| /v2rayN/.vs/v2rayN/DesignTimeBuild | ||||
| /v2rayN/packages | ||||
| .vs/ProjectSettings.json | ||||
| .vs/slnx.sqlite | ||||
| .vs/VSWorkspaceState.json | ||||
| /v2rayN/v2rayUpgrade/bin/Debug | ||||
| /v2rayN/v2rayUpgrade/bin/Release | ||||
| /v2rayN/v2rayUpgrade/obj/ | ||||
| # User-specific files | ||||
| *.rsuser | ||||
| *.suo | ||||
| *.user | ||||
| /.vs/v2rayN | ||||
| *.userosscache | ||||
| *.sln.docstates | ||||
|  | ||||
| # User-specific files (MonoDevelop/Xamarin Studio) | ||||
| *.userprefs | ||||
|  | ||||
| # Mono auto generated files | ||||
| mono_crash.* | ||||
|  | ||||
| # Build results | ||||
| [Dd]ebug/ | ||||
| [Dd]ebugPublic/ | ||||
| [Rr]elease/ | ||||
| [Rr]eleases/ | ||||
| x64/ | ||||
| x86/ | ||||
| [Ww][Ii][Nn]32/ | ||||
| [Aa][Rr][Mm]/ | ||||
| [Aa][Rr][Mm]64/ | ||||
| bld/ | ||||
| [Bb]in/ | ||||
| [Oo]bj/ | ||||
| [Ll]og/ | ||||
| [Ll]ogs/ | ||||
|  | ||||
| # Visual Studio 2015/2017 cache/options directory | ||||
| .vs/ | ||||
| # Uncomment if you have tasks that create the project's static files in wwwroot | ||||
| #wwwroot/ | ||||
|  | ||||
| # Visual Studio 2017 auto generated files | ||||
| Generated\ Files/ | ||||
|  | ||||
| # MSTest test Results | ||||
| [Tt]est[Rr]esult*/ | ||||
| [Bb]uild[Ll]og.* | ||||
|  | ||||
| # NUnit | ||||
| *.VisualState.xml | ||||
| TestResult.xml | ||||
| nunit-*.xml | ||||
|  | ||||
| # Build Results of an ATL Project | ||||
| [Dd]ebugPS/ | ||||
| [Rr]eleasePS/ | ||||
| dlldata.c | ||||
|  | ||||
| # Benchmark Results | ||||
| BenchmarkDotNet.Artifacts/ | ||||
|  | ||||
| # .NET Core | ||||
| project.lock.json | ||||
| project.fragment.lock.json | ||||
| artifacts/ | ||||
|  | ||||
| # ASP.NET Scaffolding | ||||
| ScaffoldingReadMe.txt | ||||
|  | ||||
| # StyleCop | ||||
| StyleCopReport.xml | ||||
|  | ||||
| # Files built by Visual Studio | ||||
| *_i.c | ||||
| *_p.c | ||||
| *_h.h | ||||
| *.ilk | ||||
| *.meta | ||||
| *.obj | ||||
| *.iobj | ||||
| *.pch | ||||
| *.pdb | ||||
| *.ipdb | ||||
| *.pgc | ||||
| *.pgd | ||||
| *.rsp | ||||
| # but not Directory.Build.rsp, as it configures directory-level build defaults | ||||
| !Directory.Build.rsp | ||||
| *.sbr | ||||
| *.tlb | ||||
| *.tli | ||||
| *.tlh | ||||
| *.tmp | ||||
| *.tmp_proj | ||||
| *_wpftmp.csproj | ||||
| *.log | ||||
| *.tlog | ||||
| *.vspscc | ||||
| *.vssscc | ||||
| .builds | ||||
| *.pidb | ||||
| *.svclog | ||||
| *.scc | ||||
|  | ||||
| # Chutzpah Test files | ||||
| _Chutzpah* | ||||
|  | ||||
| # Visual C++ cache files | ||||
| ipch/ | ||||
| *.aps | ||||
| *.ncb | ||||
| *.opendb | ||||
| *.opensdf | ||||
| *.sdf | ||||
| *.cachefile | ||||
| *.VC.db | ||||
| *.VC.VC.opendb | ||||
|  | ||||
| # Visual Studio profiler | ||||
| *.psess | ||||
| *.vsp | ||||
| *.vspx | ||||
| *.sap | ||||
|  | ||||
| # Visual Studio Trace Files | ||||
| *.e2e | ||||
|  | ||||
| # TFS 2012 Local Workspace | ||||
| $tf/ | ||||
|  | ||||
| # Guidance Automation Toolkit | ||||
| *.gpState | ||||
|  | ||||
| # ReSharper is a .NET coding add-in | ||||
| _ReSharper*/ | ||||
| *.[Rr]e[Ss]harper | ||||
| *.DotSettings.user | ||||
|  | ||||
| # TeamCity is a build add-in | ||||
| _TeamCity* | ||||
|  | ||||
| # DotCover is a Code Coverage Tool | ||||
| *.dotCover | ||||
|  | ||||
| # AxoCover is a Code Coverage Tool | ||||
| .axoCover/* | ||||
| !.axoCover/settings.json | ||||
|  | ||||
| # Coverlet is a free, cross platform Code Coverage Tool | ||||
| coverage*.json | ||||
| coverage*.xml | ||||
| coverage*.info | ||||
|  | ||||
| # Visual Studio code coverage results | ||||
| *.coverage | ||||
| *.coveragexml | ||||
|  | ||||
| # NCrunch | ||||
| _NCrunch_* | ||||
| .*crunch*.local.xml | ||||
| nCrunchTemp_* | ||||
|  | ||||
| # MightyMoose | ||||
| *.mm.* | ||||
| AutoTest.Net/ | ||||
|  | ||||
| # Web workbench (sass) | ||||
| .sass-cache/ | ||||
|  | ||||
| # Installshield output folder | ||||
| [Ee]xpress/ | ||||
|  | ||||
| # DocProject is a documentation generator add-in | ||||
| DocProject/buildhelp/ | ||||
| DocProject/Help/*.HxT | ||||
| DocProject/Help/*.HxC | ||||
| DocProject/Help/*.hhc | ||||
| DocProject/Help/*.hhk | ||||
| DocProject/Help/*.hhp | ||||
| DocProject/Help/Html2 | ||||
| DocProject/Help/html | ||||
|  | ||||
| # Click-Once directory | ||||
| publish/ | ||||
|  | ||||
| # Publish Web Output | ||||
| *.[Pp]ublish.xml | ||||
| *.azurePubxml | ||||
| # Note: Comment the next line if you want to checkin your web deploy settings, | ||||
| # but database connection strings (with potential passwords) will be unencrypted | ||||
| *.pubxml | ||||
| *.publishproj | ||||
|  | ||||
| # Microsoft Azure Web App publish settings. Comment the next line if you want to | ||||
| # checkin your Azure Web App publish settings, but sensitive information contained | ||||
| # in these scripts will be unencrypted | ||||
| PublishScripts/ | ||||
|  | ||||
| # NuGet Packages | ||||
| *.nupkg | ||||
| # NuGet Symbol Packages | ||||
| *.snupkg | ||||
| # The packages folder can be ignored because of Package Restore | ||||
| **/[Pp]ackages/* | ||||
| # except build/, which is used as an MSBuild target. | ||||
| !**/[Pp]ackages/build/ | ||||
| # Uncomment if necessary however generally it will be regenerated when needed | ||||
| #!**/[Pp]ackages/repositories.config | ||||
| # NuGet v3's project.json files produces more ignorable files | ||||
| *.nuget.props | ||||
| *.nuget.targets | ||||
|  | ||||
| # Microsoft Azure Build Output | ||||
| csx/ | ||||
| *.build.csdef | ||||
|  | ||||
| # Microsoft Azure Emulator | ||||
| ecf/ | ||||
| rcf/ | ||||
|  | ||||
| # Windows Store app package directories and files | ||||
| AppPackages/ | ||||
| BundleArtifacts/ | ||||
| Package.StoreAssociation.xml | ||||
| _pkginfo.txt | ||||
| *.appx | ||||
| *.appxbundle | ||||
| *.appxupload | ||||
|  | ||||
| # Visual Studio cache files | ||||
| # files ending in .cache can be ignored | ||||
| *.[Cc]ache | ||||
| # but keep track of directories ending in .cache | ||||
| !?*.[Cc]ache/ | ||||
|  | ||||
| # Others | ||||
| ClientBin/ | ||||
| ~$* | ||||
| *~ | ||||
| *.dbmdl | ||||
| *.dbproj.schemaview | ||||
| *.jfm | ||||
| *.pfx | ||||
| *.publishsettings | ||||
| orleans.codegen.cs | ||||
|  | ||||
| # Including strong name files can present a security risk | ||||
| # (https://github.com/github/gitignore/pull/2483#issue-259490424) | ||||
| #*.snk | ||||
|  | ||||
| # Since there are multiple workflows, uncomment next line to ignore bower_components | ||||
| # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) | ||||
| #bower_components/ | ||||
|  | ||||
| # RIA/Silverlight projects | ||||
| Generated_Code/ | ||||
|  | ||||
| # Backup & report files from converting an old project file | ||||
| # to a newer Visual Studio version. Backup files are not needed, | ||||
| # because we have git ;-) | ||||
| _UpgradeReport_Files/ | ||||
| Backup*/ | ||||
| UpgradeLog*.XML | ||||
| UpgradeLog*.htm | ||||
| ServiceFabricBackup/ | ||||
| *.rptproj.bak | ||||
|  | ||||
| # SQL Server files | ||||
| *.mdf | ||||
| *.ldf | ||||
| *.ndf | ||||
|  | ||||
| # Business Intelligence projects | ||||
| *.rdl.data | ||||
| *.bim.layout | ||||
| *.bim_*.settings | ||||
| *.rptproj.rsuser | ||||
| *- [Bb]ackup.rdl | ||||
| *- [Bb]ackup ([0-9]).rdl | ||||
| *- [Bb]ackup ([0-9][0-9]).rdl | ||||
|  | ||||
| # Microsoft Fakes | ||||
| FakesAssemblies/ | ||||
|  | ||||
| # GhostDoc plugin setting file | ||||
| *.GhostDoc.xml | ||||
|  | ||||
| # Node.js Tools for Visual Studio | ||||
| .ntvs_analysis.dat | ||||
| node_modules/ | ||||
|  | ||||
| # Visual Studio 6 build log | ||||
| *.plg | ||||
|  | ||||
| # Visual Studio 6 workspace options file | ||||
| *.opt | ||||
|  | ||||
| # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) | ||||
| *.vbw | ||||
|  | ||||
| # Visual Studio 6 auto-generated project file (contains which files were open etc.) | ||||
| *.vbp | ||||
|  | ||||
| # Visual Studio 6 workspace and project file (working project files containing files to include in project) | ||||
| *.dsw | ||||
| *.dsp | ||||
|  | ||||
| # Visual Studio 6 technical files | ||||
| *.ncb | ||||
| *.aps | ||||
|  | ||||
| # Visual Studio LightSwitch build output | ||||
| **/*.HTMLClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/ModelManifest.xml | ||||
| **/*.Server/GeneratedArtifacts | ||||
| **/*.Server/ModelManifest.xml | ||||
| _Pvt_Extensions | ||||
|  | ||||
| # Paket dependency manager | ||||
| .paket/paket.exe | ||||
| paket-files/ | ||||
|  | ||||
| # FAKE - F# Make | ||||
| .fake/ | ||||
|  | ||||
| # CodeRush personal settings | ||||
| .cr/personal | ||||
|  | ||||
| # Python Tools for Visual Studio (PTVS) | ||||
| __pycache__/ | ||||
| *.pyc | ||||
|  | ||||
| # Cake - Uncomment if you are using it | ||||
| # tools/** | ||||
| # !tools/packages.config | ||||
|  | ||||
| # Tabs Studio | ||||
| *.tss | ||||
|  | ||||
| # Telerik's JustMock configuration file | ||||
| *.jmconfig | ||||
|  | ||||
| # BizTalk build output | ||||
| *.btp.cs | ||||
| *.btm.cs | ||||
| *.odx.cs | ||||
| *.xsd.cs | ||||
|  | ||||
| # OpenCover UI analysis results | ||||
| OpenCover/ | ||||
|  | ||||
| # Azure Stream Analytics local run output | ||||
| ASALocalRun/ | ||||
|  | ||||
| # MSBuild Binary and Structured Log | ||||
| *.binlog | ||||
|  | ||||
| # NVidia Nsight GPU debugger configuration file | ||||
| *.nvuser | ||||
|  | ||||
| # MFractors (Xamarin productivity tool) working folder | ||||
| .mfractor/ | ||||
|  | ||||
| # Local History for Visual Studio | ||||
| .localhistory/ | ||||
|  | ||||
| # Visual Studio History (VSHistory) files | ||||
| .vshistory/ | ||||
|  | ||||
| # BeatPulse healthcheck temp database | ||||
| healthchecksdb | ||||
|  | ||||
| # Backup folder for Package Reference Convert tool in Visual Studio 2017 | ||||
| MigrationBackup/ | ||||
|  | ||||
| # Ionide (cross platform F# VS Code tools) working folder | ||||
| .ionide/ | ||||
|  | ||||
| # Fody - auto-generated XML schema | ||||
| FodyWeavers.xsd | ||||
|  | ||||
| # VS Code files for those working on multiple tools | ||||
| .vscode/* | ||||
| !.vscode/settings.json | ||||
| !.vscode/tasks.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/extensions.json | ||||
| *.code-workspace | ||||
|  | ||||
| # Local History for Visual Studio Code | ||||
| .history/ | ||||
|  | ||||
| # Windows Installer files from build outputs | ||||
| *.cab | ||||
| *.msi | ||||
| *.msix | ||||
| *.msm | ||||
| *.msp | ||||
|  | ||||
| # JetBrains Rider | ||||
| *.sln.iml | ||||
							
								
								
									
										363
									
								
								v2rayn/v2rayN/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										363
									
								
								v2rayn/v2rayN/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,363 +0,0 @@ | ||||
| ## Ignore Visual Studio temporary files, build results, and | ||||
| ## files generated by popular Visual Studio add-ons. | ||||
| ## | ||||
| ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore | ||||
|  | ||||
| # User-specific files | ||||
| *.rsuser | ||||
| *.suo | ||||
| *.user | ||||
| *.userosscache | ||||
| *.sln.docstates | ||||
|  | ||||
| # User-specific files (MonoDevelop/Xamarin Studio) | ||||
| *.userprefs | ||||
|  | ||||
| # Mono auto generated files | ||||
| mono_crash.* | ||||
|  | ||||
| # Build results | ||||
| [Dd]ebug/ | ||||
| [Dd]ebugPublic/ | ||||
| [Rr]elease/ | ||||
| [Rr]eleases/ | ||||
| x64/ | ||||
| x86/ | ||||
| [Ww][Ii][Nn]32/ | ||||
| [Aa][Rr][Mm]/ | ||||
| [Aa][Rr][Mm]64/ | ||||
| bld/ | ||||
| [Bb]in/ | ||||
| [Oo]bj/ | ||||
| [Oo]ut/ | ||||
| [Ll]og/ | ||||
| [Ll]ogs/ | ||||
|  | ||||
| # Visual Studio 2015/2017 cache/options directory | ||||
| .vs/ | ||||
| # Uncomment if you have tasks that create the project's static files in wwwroot | ||||
| #wwwroot/ | ||||
|  | ||||
| # Visual Studio 2017 auto generated files | ||||
| Generated\ Files/ | ||||
|  | ||||
| # MSTest test Results | ||||
| [Tt]est[Rr]esult*/ | ||||
| [Bb]uild[Ll]og.* | ||||
|  | ||||
| # NUnit | ||||
| *.VisualState.xml | ||||
| TestResult.xml | ||||
| nunit-*.xml | ||||
|  | ||||
| # Build Results of an ATL Project | ||||
| [Dd]ebugPS/ | ||||
| [Rr]eleasePS/ | ||||
| dlldata.c | ||||
|  | ||||
| # Benchmark Results | ||||
| BenchmarkDotNet.Artifacts/ | ||||
|  | ||||
| # .NET Core | ||||
| project.lock.json | ||||
| project.fragment.lock.json | ||||
| artifacts/ | ||||
|  | ||||
| # ASP.NET Scaffolding | ||||
| ScaffoldingReadMe.txt | ||||
|  | ||||
| # StyleCop | ||||
| StyleCopReport.xml | ||||
|  | ||||
| # Files built by Visual Studio | ||||
| *_i.c | ||||
| *_p.c | ||||
| *_h.h | ||||
| *.ilk | ||||
| *.meta | ||||
| *.obj | ||||
| *.iobj | ||||
| *.pch | ||||
| *.pdb | ||||
| *.ipdb | ||||
| *.pgc | ||||
| *.pgd | ||||
| *.rsp | ||||
| *.sbr | ||||
| *.tlb | ||||
| *.tli | ||||
| *.tlh | ||||
| *.tmp | ||||
| *.tmp_proj | ||||
| *_wpftmp.csproj | ||||
| *.log | ||||
| *.vspscc | ||||
| *.vssscc | ||||
| .builds | ||||
| *.pidb | ||||
| *.svclog | ||||
| *.scc | ||||
|  | ||||
| # Chutzpah Test files | ||||
| _Chutzpah* | ||||
|  | ||||
| # Visual C++ cache files | ||||
| ipch/ | ||||
| *.aps | ||||
| *.ncb | ||||
| *.opendb | ||||
| *.opensdf | ||||
| *.sdf | ||||
| *.cachefile | ||||
| *.VC.db | ||||
| *.VC.VC.opendb | ||||
|  | ||||
| # Visual Studio profiler | ||||
| *.psess | ||||
| *.vsp | ||||
| *.vspx | ||||
| *.sap | ||||
|  | ||||
| # Visual Studio Trace Files | ||||
| *.e2e | ||||
|  | ||||
| # TFS 2012 Local Workspace | ||||
| $tf/ | ||||
|  | ||||
| # Guidance Automation Toolkit | ||||
| *.gpState | ||||
|  | ||||
| # ReSharper is a .NET coding add-in | ||||
| _ReSharper*/ | ||||
| *.[Rr]e[Ss]harper | ||||
| *.DotSettings.user | ||||
|  | ||||
| # TeamCity is a build add-in | ||||
| _TeamCity* | ||||
|  | ||||
| # DotCover is a Code Coverage Tool | ||||
| *.dotCover | ||||
|  | ||||
| # AxoCover is a Code Coverage Tool | ||||
| .axoCover/* | ||||
| !.axoCover/settings.json | ||||
|  | ||||
| # Coverlet is a free, cross platform Code Coverage Tool | ||||
| coverage*.json | ||||
| coverage*.xml | ||||
| coverage*.info | ||||
|  | ||||
| # Visual Studio code coverage results | ||||
| *.coverage | ||||
| *.coveragexml | ||||
|  | ||||
| # NCrunch | ||||
| _NCrunch_* | ||||
| .*crunch*.local.xml | ||||
| nCrunchTemp_* | ||||
|  | ||||
| # MightyMoose | ||||
| *.mm.* | ||||
| AutoTest.Net/ | ||||
|  | ||||
| # Web workbench (sass) | ||||
| .sass-cache/ | ||||
|  | ||||
| # Installshield output folder | ||||
| [Ee]xpress/ | ||||
|  | ||||
| # DocProject is a documentation generator add-in | ||||
| DocProject/buildhelp/ | ||||
| DocProject/Help/*.HxT | ||||
| DocProject/Help/*.HxC | ||||
| DocProject/Help/*.hhc | ||||
| DocProject/Help/*.hhk | ||||
| DocProject/Help/*.hhp | ||||
| DocProject/Help/Html2 | ||||
| DocProject/Help/html | ||||
|  | ||||
| # Click-Once directory | ||||
| publish/ | ||||
|  | ||||
| # Publish Web Output | ||||
| *.[Pp]ublish.xml | ||||
| *.azurePubxml | ||||
| # Note: Comment the next line if you want to checkin your web deploy settings, | ||||
| # but database connection strings (with potential passwords) will be unencrypted | ||||
| *.pubxml | ||||
| *.publishproj | ||||
|  | ||||
| # Microsoft Azure Web App publish settings. Comment the next line if you want to | ||||
| # checkin your Azure Web App publish settings, but sensitive information contained | ||||
| # in these scripts will be unencrypted | ||||
| PublishScripts/ | ||||
|  | ||||
| # NuGet Packages | ||||
| *.nupkg | ||||
| # NuGet Symbol Packages | ||||
| *.snupkg | ||||
| # The packages folder can be ignored because of Package Restore | ||||
| **/[Pp]ackages/* | ||||
| # except build/, which is used as an MSBuild target. | ||||
| !**/[Pp]ackages/build/ | ||||
| # Uncomment if necessary however generally it will be regenerated when needed | ||||
| #!**/[Pp]ackages/repositories.config | ||||
| # NuGet v3's project.json files produces more ignorable files | ||||
| *.nuget.props | ||||
| *.nuget.targets | ||||
|  | ||||
| # Microsoft Azure Build Output | ||||
| csx/ | ||||
| *.build.csdef | ||||
|  | ||||
| # Microsoft Azure Emulator | ||||
| ecf/ | ||||
| rcf/ | ||||
|  | ||||
| # Windows Store app package directories and files | ||||
| AppPackages/ | ||||
| BundleArtifacts/ | ||||
| Package.StoreAssociation.xml | ||||
| _pkginfo.txt | ||||
| *.appx | ||||
| *.appxbundle | ||||
| *.appxupload | ||||
|  | ||||
| # Visual Studio cache files | ||||
| # files ending in .cache can be ignored | ||||
| *.[Cc]ache | ||||
| # but keep track of directories ending in .cache | ||||
| !?*.[Cc]ache/ | ||||
|  | ||||
| # Others | ||||
| ClientBin/ | ||||
| ~$* | ||||
| *~ | ||||
| *.dbmdl | ||||
| *.dbproj.schemaview | ||||
| *.jfm | ||||
| *.pfx | ||||
| *.publishsettings | ||||
| orleans.codegen.cs | ||||
|  | ||||
| # Including strong name files can present a security risk | ||||
| # (https://github.com/github/gitignore/pull/2483#issue-259490424) | ||||
| #*.snk | ||||
|  | ||||
| # Since there are multiple workflows, uncomment next line to ignore bower_components | ||||
| # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) | ||||
| #bower_components/ | ||||
|  | ||||
| # RIA/Silverlight projects | ||||
| Generated_Code/ | ||||
|  | ||||
| # Backup & report files from converting an old project file | ||||
| # to a newer Visual Studio version. Backup files are not needed, | ||||
| # because we have git ;-) | ||||
| _UpgradeReport_Files/ | ||||
| Backup*/ | ||||
| UpgradeLog*.XML | ||||
| UpgradeLog*.htm | ||||
| ServiceFabricBackup/ | ||||
| *.rptproj.bak | ||||
|  | ||||
| # SQL Server files | ||||
| *.mdf | ||||
| *.ldf | ||||
| *.ndf | ||||
|  | ||||
| # Business Intelligence projects | ||||
| *.rdl.data | ||||
| *.bim.layout | ||||
| *.bim_*.settings | ||||
| *.rptproj.rsuser | ||||
| *- [Bb]ackup.rdl | ||||
| *- [Bb]ackup ([0-9]).rdl | ||||
| *- [Bb]ackup ([0-9][0-9]).rdl | ||||
|  | ||||
| # Microsoft Fakes | ||||
| FakesAssemblies/ | ||||
|  | ||||
| # GhostDoc plugin setting file | ||||
| *.GhostDoc.xml | ||||
|  | ||||
| # Node.js Tools for Visual Studio | ||||
| .ntvs_analysis.dat | ||||
| node_modules/ | ||||
|  | ||||
| # Visual Studio 6 build log | ||||
| *.plg | ||||
|  | ||||
| # Visual Studio 6 workspace options file | ||||
| *.opt | ||||
|  | ||||
| # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) | ||||
| *.vbw | ||||
|  | ||||
| # Visual Studio LightSwitch build output | ||||
| **/*.HTMLClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/GeneratedArtifacts | ||||
| **/*.DesktopClient/ModelManifest.xml | ||||
| **/*.Server/GeneratedArtifacts | ||||
| **/*.Server/ModelManifest.xml | ||||
| _Pvt_Extensions | ||||
|  | ||||
| # Paket dependency manager | ||||
| .paket/paket.exe | ||||
| paket-files/ | ||||
|  | ||||
| # FAKE - F# Make | ||||
| .fake/ | ||||
|  | ||||
| # CodeRush personal settings | ||||
| .cr/personal | ||||
|  | ||||
| # Python Tools for Visual Studio (PTVS) | ||||
| __pycache__/ | ||||
| *.pyc | ||||
|  | ||||
| # Cake - Uncomment if you are using it | ||||
| # tools/** | ||||
| # !tools/packages.config | ||||
|  | ||||
| # Tabs Studio | ||||
| *.tss | ||||
|  | ||||
| # Telerik's JustMock configuration file | ||||
| *.jmconfig | ||||
|  | ||||
| # BizTalk build output | ||||
| *.btp.cs | ||||
| *.btm.cs | ||||
| *.odx.cs | ||||
| *.xsd.cs | ||||
|  | ||||
| # OpenCover UI analysis results | ||||
| OpenCover/ | ||||
|  | ||||
| # Azure Stream Analytics local run output | ||||
| ASALocalRun/ | ||||
|  | ||||
| # MSBuild Binary and Structured Log | ||||
| *.binlog | ||||
|  | ||||
| # NVidia Nsight GPU debugger configuration file | ||||
| *.nvuser | ||||
|  | ||||
| # MFractors (Xamarin productivity tool) working folder | ||||
| .mfractor/ | ||||
|  | ||||
| # Local History for Visual Studio | ||||
| .localhistory/ | ||||
|  | ||||
| # BeatPulse healthcheck temp database | ||||
| healthchecksdb | ||||
|  | ||||
| # Backup folder for Package Reference Convert tool in Visual Studio 2017 | ||||
| MigrationBackup/ | ||||
|  | ||||
| # Ionide (cross platform F# VS Code tools) working folder | ||||
| .ionide/ | ||||
|  | ||||
| # Fody - auto-generated XML schema | ||||
| FodyWeavers.xsd | ||||
| @@ -85,6 +85,22 @@ class YoutubeBaseInfoExtractor(InfoExtractor): | ||||
|     _PLAYLIST_ID_RE = r'(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM)' | ||||
|  | ||||
|     _INNERTUBE_CLIENTS = { | ||||
|         'ios': { | ||||
|             'INNERTUBE_CONTEXT': { | ||||
|                 'client': { | ||||
|                     'clientName': 'IOS', | ||||
|                     'clientVersion': '19.45.4', | ||||
|                     'deviceMake': 'Apple', | ||||
|                     'deviceModel': 'iPhone16,2', | ||||
|                     'userAgent': 'com.google.ios.youtube/19.45.4 (iPhone16,2; U; CPU iOS 18_1_0 like Mac OS X;)', | ||||
|                     'osName': 'iPhone', | ||||
|                     'osVersion': '18.1.0.22B83', | ||||
|                 }, | ||||
|             }, | ||||
|             'INNERTUBE_CONTEXT_CLIENT_NAME': 5, | ||||
|             'REQUIRE_JS_PLAYER': False, | ||||
|             'REQUIRE_PO_TOKEN': True, | ||||
|         }, | ||||
|         # mweb has 'ultralow' formats | ||||
|         # See: https://github.com/yt-dlp/yt-dlp/pull/557 | ||||
|         'mweb': { | ||||
| @@ -110,6 +126,17 @@ class YoutubeBaseInfoExtractor(InfoExtractor): | ||||
|             'INNERTUBE_CONTEXT_CLIENT_NAME': 7, | ||||
|             'SUPPORTS_COOKIES': True, | ||||
|         }, | ||||
|         'web': { | ||||
|             'INNERTUBE_CONTEXT': { | ||||
|                 'client': { | ||||
|                     'clientName': 'WEB', | ||||
|                     'clientVersion': '2.20241126.01.00', | ||||
|                 }, | ||||
|             }, | ||||
|             'INNERTUBE_CONTEXT_CLIENT_NAME': 1, | ||||
|             'REQUIRE_PO_TOKEN': True, | ||||
|             'SUPPORTS_COOKIES': True, | ||||
|         }, | ||||
|     } | ||||
|  | ||||
|     def _login(self): | ||||
| @@ -1995,6 +2022,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | ||||
|             player_response = self._extract_yt_initial_variable( | ||||
|                 webpage, self._YT_INITIAL_PLAYER_RESPONSE_RE, | ||||
|                 video_id, 'initial player response') | ||||
|         is_live = traverse_obj(player_response, ('videoDetails', 'isLive')) | ||||
|  | ||||
|         if False and not player_response: | ||||
|             player_response = self._call_api( | ||||
|                 'player', {'videoId': video_id}, video_id) | ||||
| @@ -2008,50 +2037,69 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | ||||
|             if sts: | ||||
|                 pb_context['signatureTimestamp'] = sts | ||||
|  | ||||
|             client = traverse_obj(self._INNERTUBE_CLIENTS, ( | ||||
|                 lambda _, v: not v.get('REQUIRE_PO_TOKEN')), | ||||
|                 get_all=False) | ||||
|             client_names = traverse_obj(self._INNERTUBE_CLIENTS, ( | ||||
|                 T(dict.items), lambda _, k_v: not k_v[1].get('REQUIRE_PO_TOKEN'), | ||||
|                 0))[:1] | ||||
|  | ||||
|             query = { | ||||
|                 'playbackContext': { | ||||
|                     'contentPlaybackContext': pb_context, | ||||
|                     'contentCheckOk': True, | ||||
|                     'racyCheckOk': True, | ||||
|                 }, | ||||
|                 'context': { | ||||
|                     'client': merge_dicts( | ||||
|                         traverse_obj(client, ('INNERTUBE_CONTEXT', 'client')), { | ||||
|                             'hl': 'en', | ||||
|                             'timeZone': 'UTC', | ||||
|                             'utcOffsetMinutes': 0, | ||||
|                         }), | ||||
|                 }, | ||||
|                 'videoId': video_id, | ||||
|             } | ||||
|             if is_live and 'ios' not in client_names: | ||||
|                 client_names.append('ios') | ||||
|  | ||||
|             headers = merge_dicts({ | ||||
|             headers = { | ||||
|                 'Sec-Fetch-Mode': 'navigate', | ||||
|                 'Origin': origin, | ||||
|                 # 'X-Goog-Visitor-Id': self._extract_visitor_data(ytcfg) or '', | ||||
|             }, traverse_obj(client, { | ||||
|                 'X-YouTube-Client-Name': 'INNERTUBE_CONTEXT_CLIENT_NAME', | ||||
|                 'X-YouTube-Client-Version': ( | ||||
|                     'INNERTUBE_CONTEXT', 'client', 'clientVersion'), | ||||
|                 'User-Agent': ( | ||||
|                     'INNERTUBE_CONTEXT', 'client', 'userAgent'), | ||||
|             })) | ||||
|  | ||||
|             } | ||||
|             auth = self._generate_sapisidhash_header(origin) | ||||
|             if auth is not None: | ||||
|                 headers['Authorization'] = auth | ||||
|                 headers['X-Origin'] = origin | ||||
|  | ||||
|             player_response = self._call_api( | ||||
|                 'player', query, video_id, fatal=False, headers=headers, | ||||
|                 note=join_nonempty( | ||||
|                     'Downloading', traverse_obj(query, ( | ||||
|                         'context', 'client', 'clientName')), | ||||
|                     'API JSON', delim=' ')) | ||||
|             for client in traverse_obj(self._INNERTUBE_CLIENTS, (client_names, T(dict))): | ||||
|  | ||||
|                 query = { | ||||
|                     'playbackContext': { | ||||
|                         'contentPlaybackContext': pb_context, | ||||
|                         'contentCheckOk': True, | ||||
|                         'racyCheckOk': True, | ||||
|                     }, | ||||
|                     'context': { | ||||
|                         'client': merge_dicts( | ||||
|                             traverse_obj(client, ('INNERTUBE_CONTEXT', 'client')), { | ||||
|                                 'hl': 'en', | ||||
|                                 'timeZone': 'UTC', | ||||
|                                 'utcOffsetMinutes': 0, | ||||
|                             }), | ||||
|                     }, | ||||
|                     'videoId': video_id, | ||||
|                 } | ||||
|  | ||||
|                 api_headers = merge_dicts(headers, traverse_obj(client, { | ||||
|                     'X-YouTube-Client-Name': 'INNERTUBE_CONTEXT_CLIENT_NAME', | ||||
|                     'X-YouTube-Client-Version': ( | ||||
|                         'INNERTUBE_CONTEXT', 'client', 'clientVersion'), | ||||
|                     'User-Agent': ( | ||||
|                         'INNERTUBE_CONTEXT', 'client', 'userAgent'), | ||||
|                 })) | ||||
|  | ||||
|                 api_player_response = self._call_api( | ||||
|                     'player', query, video_id, fatal=False, headers=api_headers, | ||||
|                     note=join_nonempty( | ||||
|                         'Downloading', traverse_obj(query, ( | ||||
|                             'context', 'client', 'clientName')), | ||||
|                         'API JSON', delim=' ')) | ||||
|  | ||||
|                 hls = [ | ||||
|                     traverse_obj( | ||||
|                         resp, ('streamingData', 'hlsManifestUrl', T(url_or_none))) | ||||
|                     for resp in (player_response, api_player_response)] | ||||
|                 if not hls[0] and hls[1]: | ||||
|                     player_response['streamingData']['hlsManifestUrl'] = hls[1] | ||||
|                 else: | ||||
|                     video_details = merge_dicts(*traverse_obj( | ||||
|                         (player_response, api_player_response), | ||||
|                         (Ellipsis, 'videoDetails', T(dict)))) | ||||
|                     player_response.update(api_player_response or {}) | ||||
|                     player_response['videoDetails'] = video_details | ||||
|  | ||||
|         def is_agegated(playability): | ||||
|             if not isinstance(playability, dict): | ||||
| @@ -2194,6 +2242,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | ||||
|         itag_qualities = {} | ||||
|         q = qualities(['tiny', 'small', 'medium', 'large', 'hd720', 'hd1080', 'hd1440', 'hd2160', 'hd2880', 'highres']) | ||||
|         CHUNK_SIZE = 10 << 20 | ||||
|         is_live = video_details.get('isLive') | ||||
|  | ||||
|         streaming_data = player_response.get('streamingData') or {} | ||||
|         streaming_formats = streaming_data.get('formats') or [] | ||||
| @@ -2338,7 +2387,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | ||||
|         hls_manifest_url = streaming_data.get('hlsManifestUrl') | ||||
|         if hls_manifest_url: | ||||
|             for f in self._extract_m3u8_formats( | ||||
|                     hls_manifest_url, video_id, 'mp4', fatal=False): | ||||
|                     hls_manifest_url, video_id, 'mp4', | ||||
|                     entry_protocol='m3u8_native', live=is_live, fatal=False): | ||||
|                 if process_manifest_format( | ||||
|                         f, 'hls', None, self._search_regex( | ||||
|                             r'/itag/(\d+)', f['url'], 'itag', default=None)): | ||||
| @@ -2444,8 +2494,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | ||||
|                 # Strictly de-prioritize damaged formats | ||||
|                 f['preference'] = -10 | ||||
|  | ||||
|         is_live = video_details.get('isLive') | ||||
|  | ||||
|         owner_profile_url = self._yt_urljoin(self._extract_author_var( | ||||
|             webpage, 'url', videodetails=video_details, metadata=microformat)) | ||||
|  | ||||
|   | ||||
| @@ -585,6 +585,10 @@ from .egghead import ( | ||||
|     EggheadCourseIE, | ||||
|     EggheadLessonIE, | ||||
| ) | ||||
| from .eggs import ( | ||||
|     EggsArtistIE, | ||||
|     EggsIE, | ||||
| ) | ||||
| from .eighttracks import EightTracksIE | ||||
| from .eitb import EitbIE | ||||
| from .elementorembed import ElementorEmbedIE | ||||
| @@ -1279,6 +1283,10 @@ from .nebula import ( | ||||
| ) | ||||
| from .nekohacker import NekoHackerIE | ||||
| from .nerdcubed import NerdCubedFeedIE | ||||
| from .nest import ( | ||||
|     NestClipIE, | ||||
|     NestIE, | ||||
| ) | ||||
| from .neteasemusic import ( | ||||
|     NetEaseMusicAlbumIE, | ||||
|     NetEaseMusicDjRadioIE, | ||||
| @@ -1533,6 +1541,10 @@ from .pinterest import ( | ||||
|     PinterestCollectionIE, | ||||
|     PinterestIE, | ||||
| ) | ||||
| from .piramidetv import ( | ||||
|     PiramideTVChannelIE, | ||||
|     PiramideTVIE, | ||||
| ) | ||||
| from .pixivsketch import ( | ||||
|     PixivSketchIE, | ||||
|     PixivSketchUserIE, | ||||
|   | ||||
							
								
								
									
										155
									
								
								yt-dlp/yt_dlp/extractor/eggs.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								yt-dlp/yt_dlp/extractor/eggs.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | ||||
| import secrets | ||||
| 
 | ||||
| from .common import InfoExtractor | ||||
| from .youtube import YoutubeIE | ||||
| from ..utils import ( | ||||
|     int_or_none, | ||||
|     parse_iso8601, | ||||
|     str_or_none, | ||||
|     url_or_none, | ||||
| ) | ||||
| from ..utils.traversal import traverse_obj | ||||
| 
 | ||||
| 
 | ||||
| class EggsBaseIE(InfoExtractor): | ||||
|     _API_HEADERS = { | ||||
|         'Accept': '*/*', | ||||
|         'apVersion': '8.2.00', | ||||
|         'deviceName': 'Android', | ||||
|     } | ||||
| 
 | ||||
|     def _real_initialize(self): | ||||
|         self._API_HEADERS['deviceId'] = secrets.token_hex(8) | ||||
| 
 | ||||
|     def _call_api(self, endpoint, video_id): | ||||
|         return self._download_json( | ||||
|             f'https://app-front-api.eggs.mu/v1/{endpoint}', video_id, | ||||
|             headers=self._API_HEADERS) | ||||
| 
 | ||||
|     def _extract_music_info(self, data): | ||||
|         if yt_url := traverse_obj(data, ('youtubeUrl', {url_or_none})): | ||||
|             return self.url_result(yt_url, ie=YoutubeIE) | ||||
| 
 | ||||
|         artist_name = traverse_obj(data, ('artist', 'artistName', {str_or_none})) | ||||
|         music_id = traverse_obj(data, ('musicId', {str_or_none})) | ||||
|         webpage_url = None | ||||
|         if artist_name and music_id: | ||||
|             webpage_url = f'https://eggs.mu/artist/{artist_name}/song/{music_id}' | ||||
| 
 | ||||
|         return { | ||||
|             'id': music_id, | ||||
|             'vcodec': 'none', | ||||
|             'webpage_url': webpage_url, | ||||
|             'extractor_key': EggsIE.ie_key(), | ||||
|             'extractor': EggsIE.IE_NAME, | ||||
|             **traverse_obj(data, { | ||||
|                 'title': ('musicTitle', {str}), | ||||
|                 'url': ('musicDataPath', {url_or_none}), | ||||
|                 'uploader': ('artist', 'displayName', {str}), | ||||
|                 'uploader_id': ('artist', 'artistId', {str_or_none}), | ||||
|                 'thumbnail': ('imageDataPath', {url_or_none}), | ||||
|                 'view_count': ('numberOfMusicPlays', {int_or_none}), | ||||
|                 'like_count': ('numberOfLikes', {int_or_none}), | ||||
|                 'comment_count': ('numberOfComments', {int_or_none}), | ||||
|                 'composers': ('composer', {str}, all), | ||||
|                 'tags': ('tags', ..., {str}), | ||||
|                 'timestamp': ('releaseDate', {parse_iso8601}), | ||||
|                 'artist': ('artist', 'displayName', {str}), | ||||
|             })} | ||||
| 
 | ||||
| 
 | ||||
| class EggsIE(EggsBaseIE): | ||||
|     IE_NAME = 'eggs:single' | ||||
|     _VALID_URL = r'https?://eggs\.mu/artist/[^/?#]+/song/(?P<id>[\da-f-]+)' | ||||
| 
 | ||||
|     _TESTS = [{ | ||||
|         'url': 'https://eggs.mu/artist/32_sunny_girl/song/0e95fd1d-4d61-4d5b-8b18-6092c551da90', | ||||
|         'info_dict': { | ||||
|             'id': '0e95fd1d-4d61-4d5b-8b18-6092c551da90', | ||||
|             'ext': 'm4a', | ||||
|             'title': 'シネマと信号', | ||||
|             'uploader': 'Sunny Girl', | ||||
|             'thumbnail': r're:https?://.*\.jpg(?:\?.*)?$', | ||||
|             'uploader_id': '1607', | ||||
|             'like_count': int, | ||||
|             'timestamp': 1731327327, | ||||
|             'composers': ['橘高連太郎'], | ||||
|             'view_count': int, | ||||
|             'comment_count': int, | ||||
|             'artists': ['Sunny Girl'], | ||||
|             'upload_date': '20241111', | ||||
|             'tags': ['SunnyGirl', 'シネマと信号'], | ||||
|         }, | ||||
|     }, { | ||||
|         'url': 'https://eggs.mu/artist/KAMO_3pband/song/1d4bc45f-1af6-47a9-8b30-a70cae350b4f', | ||||
|         'info_dict': { | ||||
|             'id': '80cLKA2wnoA', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'KAMO「いい女だから」Audio', | ||||
|             'uploader': 'KAMO', | ||||
|             'live_status': 'not_live', | ||||
|             'channel_id': 'UCsHLBw2__5Q9y55skXPotOg', | ||||
|             'channel_follower_count': int, | ||||
|             'description': 'md5:d260da711ecbec3e720293dc11401b87', | ||||
|             'availability': 'public', | ||||
|             'uploader_id': '@KAMO_band', | ||||
|             'upload_date': '20240925', | ||||
|             'thumbnail': 'https://i.ytimg.com/vi/80cLKA2wnoA/maxresdefault.jpg', | ||||
|             'comment_count': int, | ||||
|             'channel_url': 'https://www.youtube.com/channel/UCsHLBw2__5Q9y55skXPotOg', | ||||
|             'view_count': int, | ||||
|             'duration': 151, | ||||
|             'like_count': int, | ||||
|             'channel': 'KAMO', | ||||
|             'playable_in_embed': True, | ||||
|             'uploader_url': 'https://www.youtube.com/@KAMO_band', | ||||
|             'tags': [], | ||||
|             'timestamp': 1727271121, | ||||
|             'age_limit': 0, | ||||
|             'categories': ['People & Blogs'], | ||||
|         }, | ||||
|         'add_ie': ['Youtube'], | ||||
|         'params': {'skip_download': 'Youtube'}, | ||||
|     }] | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         song_id = self._match_id(url) | ||||
|         json_data = self._call_api(f'musics/{song_id}', song_id) | ||||
|         return self._extract_music_info(json_data) | ||||
| 
 | ||||
| 
 | ||||
| class EggsArtistIE(EggsBaseIE): | ||||
|     IE_NAME = 'eggs:artist' | ||||
|     _VALID_URL = r'https?://eggs\.mu/artist/(?P<id>\w+)/?(?:[?#&]|$)' | ||||
| 
 | ||||
|     _TESTS = [{ | ||||
|         'url': 'https://eggs.mu/artist/32_sunny_girl', | ||||
|         'info_dict': { | ||||
|             'id': '32_sunny_girl', | ||||
|             'thumbnail': 'https://image-pro.eggs.mu/profile/1607.jpeg?updated_at=2024-04-03T20%3A06%3A00%2B09%3A00', | ||||
|             'description': 'Muddy Mine / 東京高田馬場CLUB PHASE / Gt.Vo 橘高 連太郎 / Ba.Cho 小野 ゆうき / Dr 大森 りゅうひこ', | ||||
|             'title': 'Sunny Girl', | ||||
|         }, | ||||
|         'playlist_mincount': 18, | ||||
|     }, { | ||||
|         'url': 'https://eggs.mu/artist/KAMO_3pband', | ||||
|         'info_dict': { | ||||
|             'id': 'KAMO_3pband', | ||||
|             'description': '川崎発3ピースバンド', | ||||
|             'thumbnail': 'https://image-pro.eggs.mu/profile/35217.jpeg?updated_at=2024-11-27T16%3A31%3A50%2B09%3A00', | ||||
|             'title': 'KAMO', | ||||
|         }, | ||||
|         'playlist_mincount': 2, | ||||
|     }] | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         artist_id = self._match_id(url) | ||||
|         artist_data = self._call_api(f'artists/{artist_id}', artist_id) | ||||
|         song_data = self._call_api(f'artists/{artist_id}/musics', artist_id) | ||||
|         return self.playlist_result( | ||||
|             traverse_obj(song_data, ('data', ..., {dict}, {self._extract_music_info})), | ||||
|             playlist_id=artist_id, **traverse_obj(artist_data, { | ||||
|                 'title': ('displayName', {str}), | ||||
|                 'description': ('profile', {str}), | ||||
|                 'thumbnail': ('imageDataPath', {url_or_none}), | ||||
|             })) | ||||
							
								
								
									
										117
									
								
								yt-dlp/yt_dlp/extractor/nest.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								yt-dlp/yt_dlp/extractor/nest.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| from .common import InfoExtractor | ||||
| from ..utils import ExtractorError, float_or_none, update_url_query, url_or_none | ||||
| from ..utils.traversal import traverse_obj | ||||
| 
 | ||||
| 
 | ||||
| class NestIE(InfoExtractor): | ||||
|     _VALID_URL = r'https?://video\.nest\.com/(?:embedded/)?live/(?P<id>\w+)' | ||||
|     _EMBED_REGEX = [rf'<iframe [^>]*\bsrc=[\'"](?P<url>{_VALID_URL})'] | ||||
|     _TESTS = [{ | ||||
|         'url': 'https://video.nest.com/embedded/live/4fvYdSo8AX?autoplay=0', | ||||
|         'info_dict': { | ||||
|             'id': '4fvYdSo8AX', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'startswith:Outside ', | ||||
|             'alt_title': 'Outside', | ||||
|             'description': '<null>', | ||||
|             'location': 'Los Angeles', | ||||
|             'availability': 'public', | ||||
|             'thumbnail': r're:https?://', | ||||
|             'live_status': 'is_live', | ||||
|         }, | ||||
|         'params': { | ||||
|             # m3u8 download | ||||
|             'skip_download': True, | ||||
|         }, | ||||
|     }, { | ||||
|         'url': 'https://video.nest.com/live/4fvYdSo8AX', | ||||
|         'only_matching': True, | ||||
|     }] | ||||
|     _WEBPAGE_TESTS = [{ | ||||
|         'url': 'https://www.pacificblue.biz/noyo-harbor-webcam/', | ||||
|         'info_dict': { | ||||
|             'id': '4fvYdSo8AX', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'startswith:Outside ', | ||||
|             'alt_title': 'Outside', | ||||
|             'description': '<null>', | ||||
|             'location': 'Los Angeles', | ||||
|             'availability': 'public', | ||||
|             'thumbnail': r're:https?://', | ||||
|             'live_status': 'is_live', | ||||
|         }, | ||||
|         'params': { | ||||
|             # m3u8 download | ||||
|             'skip_download': True, | ||||
|         }, | ||||
|     }] | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         video_id = self._match_id(url) | ||||
|         item = self._download_json( | ||||
|             'https://video.nest.com/api/dropcam/cameras.get_by_public_token', | ||||
|             video_id, query={'token': video_id})['items'][0] | ||||
|         uuid = item.get('uuid') | ||||
|         stream_domain = item.get('live_stream_host') | ||||
|         if not stream_domain or not uuid: | ||||
|             raise ExtractorError('Unable to construct playlist URL') | ||||
| 
 | ||||
|         thumb_domain = item.get('nexus_api_nest_domain_host') | ||||
|         return { | ||||
|             'id': video_id, | ||||
|             **traverse_obj(item, { | ||||
|                 'description': ('description', {str}), | ||||
|                 'title': (('title', 'name', 'where'), {str}, filter, any), | ||||
|                 'alt_title': ('name', {str}), | ||||
|                 'location': ((('timezone', {lambda x: x.split('/')[1].replace('_', ' ')}), 'where'), {str}, filter, any), | ||||
|             }), | ||||
|             'thumbnail': update_url_query( | ||||
|                 f'https://{thumb_domain}/get_image', | ||||
|                 {'uuid': uuid, 'public': video_id}) if thumb_domain else None, | ||||
|             'availability': self._availability(is_private=item.get('is_public') is False), | ||||
|             'formats': self._extract_m3u8_formats( | ||||
|                 f'https://{stream_domain}/nexus_aac/{uuid}/playlist.m3u8', | ||||
|                 video_id, 'mp4', live=True, query={'public': video_id}), | ||||
|             'is_live': True, | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| class NestClipIE(InfoExtractor): | ||||
|     _VALID_URL = r'https?://video\.nest\.com/(?:embedded/)?clip/(?P<id>\w+)' | ||||
|     _EMBED_REGEX = [rf'<iframe [^>]*\bsrc=[\'"](?P<url>{_VALID_URL})'] | ||||
|     _TESTS = [{ | ||||
|         'url': 'https://video.nest.com/clip/f34c9dd237a44eca9a0001af685e3dff', | ||||
|         'info_dict': { | ||||
|             'id': 'f34c9dd237a44eca9a0001af685e3dff', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'NestClip video #f34c9dd237a44eca9a0001af685e3dff', | ||||
|             'thumbnail': 'https://clips.dropcam.com/f34c9dd237a44eca9a0001af685e3dff.jpg', | ||||
|             'timestamp': 1735413474.468, | ||||
|             'upload_date': '20241228', | ||||
|         }, | ||||
|     }, { | ||||
|         'url': 'https://video.nest.com/embedded/clip/34e0432adc3c46a98529443d8ad5aa76', | ||||
|         'info_dict': { | ||||
|             'id': '34e0432adc3c46a98529443d8ad5aa76', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'Shootout at Veterans Boulevard at Fleur De Lis Drive', | ||||
|             'thumbnail': 'https://clips.dropcam.com/34e0432adc3c46a98529443d8ad5aa76.jpg', | ||||
|             'upload_date': '20230817', | ||||
|             'timestamp': 1692262897.191, | ||||
|         }, | ||||
|     }] | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         video_id = self._match_id(url) | ||||
|         data = self._download_json( | ||||
|             'https://video.nest.com/api/dropcam/videos.get_by_filename', video_id, | ||||
|             query={'filename': f'{video_id}.mp4'}) | ||||
|         return { | ||||
|             'id': video_id, | ||||
|             **traverse_obj(data, ('items', 0, { | ||||
|                 'title': ('title', {str}), | ||||
|                 'thumbnail': ('thumbnail_url', {url_or_none}), | ||||
|                 'url': ('download_url', {url_or_none}), | ||||
|                 'timestamp': ('start_time', {float_or_none}), | ||||
|             })), | ||||
|         } | ||||
							
								
								
									
										99
									
								
								yt-dlp/yt_dlp/extractor/piramidetv.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								yt-dlp/yt_dlp/extractor/piramidetv.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| from .common import InfoExtractor | ||||
| from ..utils import parse_iso8601, smuggle_url, unsmuggle_url, url_or_none | ||||
| from ..utils.traversal import traverse_obj | ||||
| 
 | ||||
| 
 | ||||
| class PiramideTVIE(InfoExtractor): | ||||
|     _VALID_URL = r'https?://piramide\.tv/video/(?P<id>[\w-]+)' | ||||
|     _TESTS = [{ | ||||
|         'url': 'https://piramide.tv/video/wWtBAORdJUTh', | ||||
|         'info_dict': { | ||||
|             'id': 'wWtBAORdJUTh', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'md5:79f9c8183ea6a35c836923142cf0abcc', | ||||
|             'description': '', | ||||
|             'thumbnail': 'https://cdn.jwplayer.com/v2/media/W86PgQDn/thumbnails/B9gpIxkH.jpg', | ||||
|             'channel': 'León Picarón', | ||||
|             'channel_id': 'leonpicaron', | ||||
|             'timestamp': 1696460362, | ||||
|             'upload_date': '20231004', | ||||
|         }, | ||||
|     }, { | ||||
|         'url': 'https://piramide.tv/video/wcYn6li79NgN', | ||||
|         'info_dict': { | ||||
|             'id': 'wcYn6li79NgN', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'ACEPTO TENER UN BEBE CON MI NOVIA\u2026? | Parte 1', | ||||
|             'description': '', | ||||
|             'channel': 'ARTA GAME', | ||||
|             'channel_id': 'arta_game', | ||||
|             'thumbnail': 'https://cdn.jwplayer.com/v2/media/cnEdGp5X/thumbnails/rHAaWfP7.jpg', | ||||
|             'timestamp': 1703434976, | ||||
|             'upload_date': '20231224', | ||||
|         }, | ||||
|     }] | ||||
| 
 | ||||
|     def _extract_video(self, video_id): | ||||
|         video_data = self._download_json( | ||||
|             f'https://hermes.piramide.tv/video/data/{video_id}', video_id, fatal=False) | ||||
|         formats, subtitles = self._extract_m3u8_formats_and_subtitles( | ||||
|             f'https://cdn.piramide.tv/video/{video_id}/manifest.m3u8', video_id, fatal=False) | ||||
|         next_video = traverse_obj(video_data, ('video', 'next_video', 'id', {str})) | ||||
|         return next_video, { | ||||
|             'id': video_id, | ||||
|             'formats': formats, | ||||
|             'subtitles': subtitles, | ||||
|             **traverse_obj(video_data, ('video', { | ||||
|                 'id': ('id', {str}), | ||||
|                 'title': ('title', {str}), | ||||
|                 'description': ('description', {str}), | ||||
|                 'thumbnail': ('media', 'thumbnail', {url_or_none}), | ||||
|                 'channel': ('channel', 'name', {str}), | ||||
|                 'channel_id': ('channel', 'id', {str}), | ||||
|                 'timestamp': ('date', {parse_iso8601}), | ||||
|             })), | ||||
|         } | ||||
| 
 | ||||
|     def _entries(self, video_id): | ||||
|         visited = set() | ||||
|         while True: | ||||
|             visited.add(video_id) | ||||
|             next_video, info = self._extract_video(video_id) | ||||
|             yield info | ||||
|             if not next_video or next_video in visited: | ||||
|                 break | ||||
|             video_id = next_video | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         url, smuggled_data = unsmuggle_url(url, {}) | ||||
|         video_id = self._match_id(url) | ||||
|         if self._yes_playlist(video_id, video_id, smuggled_data): | ||||
|             return self.playlist_result(self._entries(video_id), video_id) | ||||
|         return self._extract_video(video_id)[1] | ||||
| 
 | ||||
| 
 | ||||
| class PiramideTVChannelIE(InfoExtractor): | ||||
|     _VALID_URL = r'https?://piramide\.tv/channel/(?P<id>[\w-]+)' | ||||
|     _TESTS = [{ | ||||
|         'url': 'https://piramide.tv/channel/thekalo', | ||||
|         'playlist_mincount': 10, | ||||
|         'info_dict': { | ||||
|             'id': 'thekalo', | ||||
|         }, | ||||
|     }] | ||||
| 
 | ||||
|     def _entries(self, channel_name): | ||||
|         videos = self._download_json( | ||||
|             f'https://hermes.piramide.tv/channel/list/{channel_name}/date/100000', channel_name) | ||||
|         for video in traverse_obj(videos, ('videos', lambda _, v: v['id'])): | ||||
|             yield self.url_result(smuggle_url( | ||||
|                 f'https://piramide.tv/video/{video["id"]}', {'force_noplaylist': True}), | ||||
|                 **traverse_obj(video, { | ||||
|                     'id': ('id', {str}), | ||||
|                     'title': ('title', {str}), | ||||
|                     'description': ('description', {str}), | ||||
|                 })) | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         channel_name = self._match_id(url) | ||||
|         return self.playlist_result(self._entries(channel_name), channel_name) | ||||
| @@ -176,6 +176,8 @@ class RTVSLOShowIE(InfoExtractor): | ||||
|         'info_dict': { | ||||
|             'id': '173250997', | ||||
|             'title': 'Ekipa Bled', | ||||
|             'description': 'md5:c88471e27a1268c448747a5325319ab7', | ||||
|             'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/173250997/logo_wide1.jpg', | ||||
|         }, | ||||
|         'playlist_count': 18, | ||||
|     }] | ||||
| @@ -187,4 +189,7 @@ class RTVSLOShowIE(InfoExtractor): | ||||
|         return self.playlist_from_matches( | ||||
|             re.findall(r'<a [^>]*\bhref="(/arhiv/[^"]+)"', webpage), | ||||
|             playlist_id, self._html_extract_title(webpage), | ||||
|             getter=urljoin('https://365.rtvslo.si'), ie=RTVSLOIE) | ||||
|             getter=urljoin('https://365.rtvslo.si'), ie=RTVSLOIE, | ||||
|             description=self._og_search_description(webpage), | ||||
|             thumbnail=self._og_search_thumbnail(webpage), | ||||
|         ) | ||||
|   | ||||
| @@ -4,43 +4,12 @@ import urllib.parse | ||||
| from .common import InfoExtractor | ||||
| from ..utils import ( | ||||
|     ExtractorError, | ||||
|     parse_qs, | ||||
|     unsmuggle_url, | ||||
|     UnsupportedError, | ||||
|     make_archive_id, | ||||
|     remove_end, | ||||
|     url_or_none, | ||||
| ) | ||||
| 
 | ||||
| _COMMITTEES = { | ||||
|     'ag': ('76440', 'http://ag-f.akamaihd.net'), | ||||
|     'aging': ('76442', 'http://aging-f.akamaihd.net'), | ||||
|     'approps': ('76441', 'http://approps-f.akamaihd.net'), | ||||
|     'arch': ('', 'http://ussenate-f.akamaihd.net'), | ||||
|     'armed': ('76445', 'http://armed-f.akamaihd.net'), | ||||
|     'banking': ('76446', 'http://banking-f.akamaihd.net'), | ||||
|     'budget': ('76447', 'http://budget-f.akamaihd.net'), | ||||
|     'cecc': ('76486', 'http://srs-f.akamaihd.net'), | ||||
|     'commerce': ('80177', 'http://commerce1-f.akamaihd.net'), | ||||
|     'csce': ('75229', 'http://srs-f.akamaihd.net'), | ||||
|     'dpc': ('76590', 'http://dpc-f.akamaihd.net'), | ||||
|     'energy': ('76448', 'http://energy-f.akamaihd.net'), | ||||
|     'epw': ('76478', 'http://epw-f.akamaihd.net'), | ||||
|     'ethics': ('76449', 'http://ethics-f.akamaihd.net'), | ||||
|     'finance': ('76450', 'http://finance-f.akamaihd.net'), | ||||
|     'foreign': ('76451', 'http://foreign-f.akamaihd.net'), | ||||
|     'govtaff': ('76453', 'http://govtaff-f.akamaihd.net'), | ||||
|     'help': ('76452', 'http://help-f.akamaihd.net'), | ||||
|     'indian': ('76455', 'http://indian-f.akamaihd.net'), | ||||
|     'intel': ('76456', 'http://intel-f.akamaihd.net'), | ||||
|     'intlnarc': ('76457', 'http://intlnarc-f.akamaihd.net'), | ||||
|     'jccic': ('85180', 'http://jccic-f.akamaihd.net'), | ||||
|     'jec': ('76458', 'http://jec-f.akamaihd.net'), | ||||
|     'judiciary': ('76459', 'http://judiciary-f.akamaihd.net'), | ||||
|     'rpc': ('76591', 'http://rpc-f.akamaihd.net'), | ||||
|     'rules': ('76460', 'http://rules-f.akamaihd.net'), | ||||
|     'saa': ('76489', 'http://srs-f.akamaihd.net'), | ||||
|     'smbiz': ('76461', 'http://smbiz-f.akamaihd.net'), | ||||
|     'srs': ('75229', 'http://srs-f.akamaihd.net'), | ||||
|     'uscc': ('76487', 'http://srs-f.akamaihd.net'), | ||||
|     'vetaff': ('76462', 'http://vetaff-f.akamaihd.net'), | ||||
| } | ||||
| from ..utils.traversal import traverse_obj | ||||
| 
 | ||||
| 
 | ||||
| class SenateISVPIE(InfoExtractor): | ||||
| @@ -53,31 +22,46 @@ class SenateISVPIE(InfoExtractor): | ||||
|         'info_dict': { | ||||
|             'id': 'judiciary031715', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'Integrated Senate Video Player', | ||||
|             'title': 'ISVP', | ||||
|             'thumbnail': r're:^https?://.*\.(?:jpg|png)$', | ||||
|             '_old_archive_ids': ['senategov judiciary031715'], | ||||
|         }, | ||||
|         'params': { | ||||
|             # m3u8 download | ||||
|             'skip_download': True, | ||||
|         }, | ||||
|         'expected_warnings': ['Failed to download m3u8 information'], | ||||
|     }, { | ||||
|         'url': 'http://www.senate.gov/isvp/?type=live&comm=commerce&filename=commerce011514.mp4&auto_play=false', | ||||
|         'info_dict': { | ||||
|             'id': 'commerce011514', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'Integrated Senate Video Player', | ||||
|             '_old_archive_ids': ['senategov commerce011514'], | ||||
|         }, | ||||
|         'params': { | ||||
|             # m3u8 download | ||||
|             'skip_download': True, | ||||
|         }, | ||||
|         'skip': 'This video is not available.', | ||||
|     }, { | ||||
|         'url': 'http://www.senate.gov/isvp/?type=arch&comm=intel&filename=intel090613&hc_location=ufi', | ||||
|         # checksum differs each time | ||||
|         'info_dict': { | ||||
|             'id': 'intel090613', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'Integrated Senate Video Player', | ||||
|             'title': 'ISVP', | ||||
|             '_old_archive_ids': ['senategov intel090613'], | ||||
|         }, | ||||
|         'expected_warnings': ['Failed to download m3u8 information'], | ||||
|     }, { | ||||
|         'url': 'https://www.senate.gov/isvp/?auto_play=false&comm=help&filename=help090920&poster=https://www.help.senate.gov/assets/images/video-poster.png&stt=950', | ||||
|         'info_dict': { | ||||
|             'id': 'help090920', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'ISVP', | ||||
|             'thumbnail': 'https://www.help.senate.gov/assets/images/video-poster.png', | ||||
|             '_old_archive_ids': ['senategov help090920'], | ||||
|         }, | ||||
|     }, { | ||||
|         # From http://www.c-span.org/video/?96791-1 | ||||
| @@ -85,60 +69,81 @@ class SenateISVPIE(InfoExtractor): | ||||
|         'only_matching': True, | ||||
|     }] | ||||
| 
 | ||||
|     _COMMITTEES = { | ||||
|         'ag': ('76440', 'https://ag-f.akamaihd.net', '2036803', 'agriculture'), | ||||
|         'aging': ('76442', 'https://aging-f.akamaihd.net', '2036801', 'aging'), | ||||
|         'approps': ('76441', 'https://approps-f.akamaihd.net', '2036802', 'appropriations'), | ||||
|         'arch': ('', 'https://ussenate-f.akamaihd.net', '', 'arch'), | ||||
|         'armed': ('76445', 'https://armed-f.akamaihd.net', '2036800', 'armedservices'), | ||||
|         'banking': ('76446', 'https://banking-f.akamaihd.net', '2036799', 'banking'), | ||||
|         'budget': ('76447', 'https://budget-f.akamaihd.net', '2036798', 'budget'), | ||||
|         'cecc': ('76486', 'https://srs-f.akamaihd.net', '2036782', 'srs_cecc'), | ||||
|         'commerce': ('80177', 'https://commerce1-f.akamaihd.net', '2036779', 'commerce'), | ||||
|         'csce': ('75229', 'https://srs-f.akamaihd.net', '2036777', 'srs_srs'), | ||||
|         'dpc': ('76590', 'https://dpc-f.akamaihd.net', '', 'dpc'), | ||||
|         'energy': ('76448', 'https://energy-f.akamaihd.net', '2036797', 'energy'), | ||||
|         'epw': ('76478', 'https://epw-f.akamaihd.net', '2036783', 'environment'), | ||||
|         'ethics': ('76449', 'https://ethics-f.akamaihd.net', '2036796', 'ethics'), | ||||
|         'finance': ('76450', 'https://finance-f.akamaihd.net', '2036795', 'finance_finance'), | ||||
|         'foreign': ('76451', 'https://foreign-f.akamaihd.net', '2036794', 'foreignrelations'), | ||||
|         'govtaff': ('76453', 'https://govtaff-f.akamaihd.net', '2036792', 'hsgac'), | ||||
|         'help': ('76452', 'https://help-f.akamaihd.net', '2036793', 'help'), | ||||
|         'indian': ('76455', 'https://indian-f.akamaihd.net', '2036791', 'indianaffairs'), | ||||
|         'intel': ('76456', 'https://intel-f.akamaihd.net', '2036790', 'intelligence'), | ||||
|         'intlnarc': ('76457', 'https://intlnarc-f.akamaihd.net', '', 'internationalnarcoticscaucus'), | ||||
|         'jccic': ('85180', 'https://jccic-f.akamaihd.net', '2036778', 'jccic'), | ||||
|         'jec': ('76458', 'https://jec-f.akamaihd.net', '2036789', 'jointeconomic'), | ||||
|         'judiciary': ('76459', 'https://judiciary-f.akamaihd.net', '2036788', 'judiciary'), | ||||
|         'rpc': ('76591', 'https://rpc-f.akamaihd.net', '', 'rpc'), | ||||
|         'rules': ('76460', 'https://rules-f.akamaihd.net', '2036787', 'rules'), | ||||
|         'saa': ('76489', 'https://srs-f.akamaihd.net', '2036780', 'srs_saa'), | ||||
|         'smbiz': ('76461', 'https://smbiz-f.akamaihd.net', '2036786', 'smallbusiness'), | ||||
|         'srs': ('75229', 'https://srs-f.akamaihd.net', '2031966', 'srs_srs'), | ||||
|         'uscc': ('76487', 'https://srs-f.akamaihd.net', '2036781', 'srs_uscc'), | ||||
|         'vetaff': ('76462', 'https://vetaff-f.akamaihd.net', '2036785', 'veteransaffairs'), | ||||
|     } | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         url, smuggled_data = unsmuggle_url(url, {}) | ||||
| 
 | ||||
|         qs = urllib.parse.parse_qs(self._match_valid_url(url).group('qs')) | ||||
|         if not qs.get('filename') or not qs.get('type') or not qs.get('comm'): | ||||
|         if not qs.get('filename') or not qs.get('comm'): | ||||
|             raise ExtractorError('Invalid URL', expected=True) | ||||
| 
 | ||||
|         video_id = re.sub(r'.mp4$', '', qs['filename'][0]) | ||||
|         filename = qs['filename'][0] | ||||
|         video_id = remove_end(filename, '.mp4') | ||||
| 
 | ||||
|         webpage = self._download_webpage(url, video_id) | ||||
|         committee = qs['comm'][0] | ||||
| 
 | ||||
|         if smuggled_data.get('force_title'): | ||||
|             title = smuggled_data['force_title'] | ||||
|         else: | ||||
|             title = self._html_extract_title(webpage) | ||||
|         poster = qs.get('poster') | ||||
|         thumbnail = poster[0] if poster else None | ||||
| 
 | ||||
|         video_type = qs['type'][0] | ||||
|         committee = video_type if video_type == 'arch' else qs['comm'][0] | ||||
| 
 | ||||
|         stream_num, domain = _COMMITTEES[committee] | ||||
|         stream_num, stream_domain, stream_id, msl3 = self._COMMITTEES[committee] | ||||
| 
 | ||||
|         urls_alternatives = [f'https://www-senate-gov-media-srs.akamaized.net/hls/live/{stream_id}/{committee}/{filename}/master.m3u8', | ||||
|                              f'https://www-senate-gov-msl3archive.akamaized.net/{msl3}/{filename}_1/master.m3u8', | ||||
|                              f'{stream_domain}/i/{filename}_1@{stream_num}/master.m3u8', | ||||
|                              f'{stream_domain}/i/{filename}.mp4/master.m3u8'] | ||||
|         formats = [] | ||||
|         if video_type == 'arch': | ||||
|             filename = video_id if '.' in video_id else video_id + '.mp4' | ||||
|             m3u8_url = urllib.parse.urljoin(domain, 'i/' + filename + '/master.m3u8') | ||||
|             formats = self._extract_m3u8_formats(m3u8_url, video_id, ext='mp4', m3u8_id='m3u8') | ||||
|         else: | ||||
|             hdcore_sign = 'hdcore=3.1.0' | ||||
|             url_params = (domain, video_id, stream_num) | ||||
|             f4m_url = f'%s/z/%s_1@%s/manifest.f4m?{hdcore_sign}' % url_params | ||||
|             m3u8_url = '{}/i/{}_1@{}/master.m3u8'.format(*url_params) | ||||
|             for entry in self._extract_f4m_formats(f4m_url, video_id, f4m_id='f4m'): | ||||
|                 # URLs without the extra param induce an 404 error | ||||
|                 entry.update({'extra_param_to_segment_url': hdcore_sign}) | ||||
|                 formats.append(entry) | ||||
|             for entry in self._extract_m3u8_formats(m3u8_url, video_id, ext='mp4', m3u8_id='m3u8'): | ||||
|                 mobj = re.search(r'(?P<tag>(?:-p|-b)).m3u8', entry['url']) | ||||
|                 if mobj: | ||||
|                     entry['format_id'] += mobj.group('tag') | ||||
|                 formats.append(entry) | ||||
|         subtitles = {} | ||||
|         for video_url in urls_alternatives: | ||||
|             formats, subtitles = self._extract_m3u8_formats_and_subtitles(video_url, video_id, ext='mp4', fatal=False) | ||||
|             if formats: | ||||
|                 break | ||||
| 
 | ||||
|         return { | ||||
|             'id': video_id, | ||||
|             'title': title, | ||||
|             'title': self._html_extract_title(webpage), | ||||
|             'formats': formats, | ||||
|             'thumbnail': thumbnail, | ||||
|             'subtitles': subtitles, | ||||
|             'thumbnail': traverse_obj(qs, ('poster', 0, {url_or_none})), | ||||
|             '_old_archive_ids': [make_archive_id(SenateGovIE, video_id)], | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| class SenateGovIE(InfoExtractor): | ||||
|     _IE_NAME = 'senate.gov' | ||||
|     _VALID_URL = r'https?:\/\/(?:www\.)?(help|appropriations|judiciary|banking|armed-services|finance)\.senate\.gov' | ||||
|     _SUBDOMAIN_RE = '|'.join(map(re.escape, ( | ||||
|         'agriculture', 'aging', 'appropriations', 'armed-services', 'banking', | ||||
|         'budget', 'commerce', 'energy', 'epw', 'finance', 'foreign', 'help', | ||||
|         'intelligence', 'inaugural', 'judiciary', 'rules', 'sbc', 'veterans', | ||||
|     ))) | ||||
|     _VALID_URL = rf'https?://(?:www\.)?(?:{_SUBDOMAIN_RE})\.senate\.gov' | ||||
|     _TESTS = [{ | ||||
|         'url': 'https://www.help.senate.gov/hearings/vaccines-saving-lives-ensuring-confidence-and-protecting-public-health', | ||||
|         'info_dict': { | ||||
| @@ -147,6 +152,9 @@ class SenateGovIE(InfoExtractor): | ||||
|             'title': 'Vaccines: Saving Lives, Ensuring Confidence, and Protecting Public Health', | ||||
|             'description': 'The U.S. Senate Committee on Health, Education, Labor & Pensions', | ||||
|             'ext': 'mp4', | ||||
|             'age_limit': 0, | ||||
|             'thumbnail': 'https://www.help.senate.gov/assets/images/sharelogo.jpg', | ||||
|             '_old_archive_ids': ['senategov help090920'], | ||||
|         }, | ||||
|         'params': {'skip_download': 'm3u8'}, | ||||
|     }, { | ||||
| @@ -156,8 +164,12 @@ class SenateGovIE(InfoExtractor): | ||||
|             'display_id': 'watch?hearingid=B8A25434-5056-A066-6020-1F68CB75F0CD', | ||||
|             'title': 'Review of the FY2019 Budget Request for the U.S. Army', | ||||
|             'ext': 'mp4', | ||||
|             'age_limit': 0, | ||||
|             'thumbnail': 'https://www.appropriations.senate.gov/themes/appropriations/images/video-poster-flash-fit.png', | ||||
|             '_old_archive_ids': ['senategov appropsA051518'], | ||||
|         }, | ||||
|         'params': {'skip_download': 'm3u8'}, | ||||
|         'expected_warnings': ['Failed to download m3u8 information'], | ||||
|     }, { | ||||
|         'url': 'https://www.banking.senate.gov/hearings/21st-century-communities-public-transportation-infrastructure-investment-and-fast-act-reauthorization', | ||||
|         'info_dict': { | ||||
| @@ -166,32 +178,65 @@ class SenateGovIE(InfoExtractor): | ||||
|             'title': '21st Century Communities: Public Transportation Infrastructure Investment and FAST Act Reauthorization', | ||||
|             'description': 'The Official website of The United States Committee on Banking, Housing, and Urban Affairs', | ||||
|             'ext': 'mp4', | ||||
|             'thumbnail': 'https://www.banking.senate.gov/themes/banking/images/sharelogo.jpg', | ||||
|             'age_limit': 0, | ||||
|             '_old_archive_ids': ['senategov banking041521'], | ||||
|         }, | ||||
|         'params': {'skip_download': 'm3u8'}, | ||||
|     }, { | ||||
|         'url': 'https://www.agriculture.senate.gov/hearings/hemp-production-and-the-2018-farm-bill', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.aging.senate.gov/hearings/the-older-americans-act-the-local-impact-of-the-law-and-the-upcoming-reauthorization', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.budget.senate.gov/hearings/improving-care-lowering-costs-achieving-health-care-efficiency', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.commerce.senate.gov/2024/12/communications-networks-safety-and-security', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.energy.senate.gov/hearings/2024/2/full-committee-hearing-to-examine', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.epw.senate.gov/public/index.cfm/hearings?ID=F63083EA-2C13-498C-B548-341BED68C209', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.foreign.senate.gov/hearings/american-diplomacy-and-global-leadership-review-of-the-fy25-state-department-budget-request', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.intelligence.senate.gov/hearings/foreign-threats-elections-2024-%E2%80%93-roles-and-responsibilities-us-tech-providers', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.inaugural.senate.gov/52nd-inaugural-ceremonies/', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.rules.senate.gov/hearings/02/07/2023/business-meeting', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.sbc.senate.gov/public/index.cfm/hearings?ID=5B13AA6B-8279-45AF-B54B-94156DC7A2AB', | ||||
|         'only_matching': True, | ||||
|     }, { | ||||
|         'url': 'https://www.veterans.senate.gov/2024/5/frontier-health-care-ensuring-veterans-access-no-matter-where-they-live', | ||||
|         'only_matching': True, | ||||
|     }] | ||||
| 
 | ||||
|     def _real_extract(self, url): | ||||
|         display_id = self._generic_id(url) | ||||
|         webpage = self._download_webpage(url, display_id) | ||||
|         parse_info = parse_qs(self._search_regex( | ||||
|             r'<iframe class="[^>"]*streaminghearing[^>"]*"\s[^>]*\bsrc="([^">]*)', webpage, 'hearing URL')) | ||||
| 
 | ||||
|         stream_num, stream_domain = _COMMITTEES[parse_info['comm'][-1]] | ||||
|         filename = parse_info['filename'][-1] | ||||
| 
 | ||||
|         formats = self._extract_m3u8_formats( | ||||
|             f'{stream_domain}/i/{filename}_1@{stream_num}/master.m3u8', | ||||
|             display_id, ext='mp4') | ||||
|         url_info = next(SenateISVPIE.extract_from_webpage(self._downloader, url, webpage), None) | ||||
|         if not url_info: | ||||
|             raise UnsupportedError(url) | ||||
| 
 | ||||
|         title = self._html_search_regex( | ||||
|             (*self._og_regexes('title'), r'(?s)<title>([^<]*?)</title>'), webpage, 'video title') | ||||
|             (*self._og_regexes('title'), r'(?s)<title>([^<]*?)</title>'), webpage, 'video title', fatal=False) | ||||
| 
 | ||||
|         return { | ||||
|             'id': re.sub(r'.mp4$', '', filename), | ||||
|             **url_info, | ||||
|             '_type': 'url_transparent', | ||||
|             'display_id': display_id, | ||||
|             'title': re.sub(r'\s+', ' ', title.split('|')[0]).strip(), | ||||
|             'description': self._og_search_description(webpage, default=None), | ||||
|             'thumbnail': self._og_search_thumbnail(webpage, default=None), | ||||
|             'age_limit': self._rta_search(webpage), | ||||
|             'formats': formats, | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 github-action[bot]
					github-action[bot]