Compare commits

...

32 Commits

Author SHA1 Message Date
MkQtS
2a4ff4c613 Add more cn domains (#3260)
* category-collaborate-cn: add worktile.com

* category-dev-cn: add pingcode.com

* category-entertainment-cn: add more domains

* category-media-cn: add more domains

* geolocation-cn: add more domains
2026-02-09 20:01:34 +08:00
MkQtS
dc0a6b4b5e Add ddmaicai (#3259) 2026-02-09 12:13:04 +08:00
ltshddx
f80032657e category-ai-cn: add moonshot domains (#3258) 2026-02-09 11:31:43 +08:00
TripleA
f23e2c591d Add gaijin domains (#3257)
Close https://github.com/v2fly/domain-list-community/issues/3190
2026-02-08 17:28:56 +08:00
TripleA
aa4904fb6c Take-two update (#3256)
* Update 2K games domain list

Added new domains for 2K games

* Add rockstarnorth.com

* Add zynga domains

* Add take-two

* zynga: add zyngaplayersupport.com

* category-games-!cn: include take-two

---------

Co-authored-by: MkQtS <81752398+MkQtS@users.noreply.github.com>
2026-02-08 13:52:19 +08:00
Konstantin
2a8ef360ee Add domains to category-ru, netease, hdrezka, kodik, windsurf and yandex (#3238)
* add Aviasales

* add hdrezka

* add kodik

* add windsurf

* yandex: add yandex-pogoda.static-storage.net

* netease: add easebar.com
2026-02-07 23:45:47 +08:00
Qi Tianyi
c8717372da category-media-cn: add jin10 & tonghuashun domains (#3255) 2026-02-07 13:48:19 +08:00
Qi Tianyi
106baf8ba0 douyu: add edgesrv.com (#3254) 2026-02-06 23:25:57 +08:00
Qi Tianyi
d12634be01 geolocation-cn: add jisilu.cn (#3253)
集思录
2026-02-06 21:45:21 +08:00
Aethersailor
a8b474fac0 update category-ai-!cn (#3251)
add manus
2026-02-06 18:35:19 +08:00
⑨bingyin
f5227519b8 vercel: add skills.sh (#3250) 2026-02-06 15:34:15 +08:00
MkQtS
b20cf00e07 Add more cn domains (#3249)
* add growingio

* category-cdn-cn: add dfyun.com.cn

* category-collaborate-cn: add feihengip.com

* category-dev-cn: add aardio.com

* category-education-cn: add biyehome.net

* category-enterprise-query-platform-cn: add xinchacha domains

* category-media-cn: add more domains

* category-social-media-cn: add fanfou.com

* category-wiki-cn: add chaz.fun
2026-02-05 21:32:06 +08:00
jinqiang zhang
027b8b3409 dji: add djigate.com (#3248) 2026-02-05 20:20:39 +08:00
xd DG
535dc789b9 Add geosite:radiko (#3247)
* Add geosite:radiko

* Sort domains and include radiko in category-entertainment

---------

Co-authored-by: terada46 <mizukiloveu@gmail.com>
2026-02-05 17:30:18 +08:00
MkQtS
311b281000 improve codes (#3246) 2026-02-04 15:03:04 +08:00
秋野かえで
bfb35d7b68 split githubcopilot.com to github-copilot (#3245) 2026-02-04 14:34:55 +08:00
深鸣
daf4c10d0c category-entertainment-cn: add anitabi.cn (#3244) 2026-02-04 13:58:38 +08:00
深鸣
a188c2c058 geolocation-!cn: add osmand.net (#3243) 2026-02-04 13:57:46 +08:00
MkQtS
947556aa16 Improve codes (#3242)
* main.go: improve code

* main.go: move refMap from global variable to local

* main.go: allow tld to be a parent domain

* datdump: improve code
2026-02-03 22:38:18 +08:00
susaninz
44de14725e kinopub: add cdn2cdn.com, cdn2site.com, pushbr.com (#3240)
These CDN domains are used by Kinopub for:
- cdn2cdn.com: video streaming CDN
- cdn2site.com: video streaming CDN
- pushbr.com: poster/thumbnail images

Discovered via network traffic analysis on the Kinopub web app.
Without these domains proxied, poster images fail to load.

---------

Co-authored-by: Ivan Slezkin <ivanslezkin@Mac.lan>
2026-02-03 19:04:53 +08:00
sergeevms
c638ec66f0 salesforce: add salesforce-setup.com (#3239) 2026-02-02 23:31:35 +08:00
susaninz
4c8b1438f8 kinopub: add cdn-service.space (#3220)
This domain is used by the Kinopub Android TV app for version checking.
Without it, the app hangs on startup when accessed from regions where
this domain is blocked.

Discovered during network traffic analysis on 2026-01-27.
2026-02-02 23:15:54 +08:00
Emik
3399285ea9 add pjsekai.sega.jp to projectsekai (#3236) 2026-02-01 21:35:51 +08:00
⑨bingyin
62346cf6b7 Add bsappapi.com to Binance (#3235) 2026-02-01 21:30:20 +08:00
jinqiang zhang
8dee321846 qcloud: add edgeone.cool (#3237) 2026-02-01 21:28:10 +08:00
fernvenue
b117cf851f Add packages.microsoft.com to microsoft-dev. (#3234) 2026-02-01 11:58:25 +08:00
jinqiang zhang
0b6606758d add louisvuitton (#3233) 2026-01-31 18:04:21 +08:00
Blackteahamburger
fcf9c67d83 category-education-cn: add zjzs.net (#3232) 2026-01-30 19:20:41 +08:00
MkQtS
56e0b47c73 Clean up ad lists (#3231)
* category-ads-all: include adjust

* category-ads-all: include clearbit

* category-ads-all: include ogury

* category-ads-all: include openx

* category-ads-all: include pubmatic

and remove pubmatic-ads

* category-ads-all: include segment

* category-ads-all: include supersonic

* geolocation-cn: remove the inclusion of umeng

it's included in alibaba

* add unitychina

* remove unity-ads

use unity@ads or unitychina@ads instead
2026-01-30 12:10:37 +08:00
Signaliks
4f45866be4 Update cloudflare (#3229) 2026-01-29 13:34:52 +08:00
sergeevms
40d763daca Update atlassian (#3228)
* Update atlassian

* Supplement and sort

data source: https://support.atlassian.com/organization-administration/docs/ip-addresses-and-domains-for-atlassian-cloud-products/

---------

Co-authored-by: MkQtS <81752398+MkQtS@users.noreply.github.com>
2026-01-29 13:33:48 +08:00
MkQtS
6c91898557 Cleanup ad lists (#3227)
Merge ad lists containing too few rules.

merged/removed lists:

adcolony-ads applovin-ads atom-data-ads emogi-ads flurry-ads
growingio-ads hiido-ads hotjar-ads inner-active-ads mopub-ads
mxplayer-ads newrelic-ads pocoiq-ads tagtic-ads tappx-ads uberads-ads
2026-01-28 17:43:54 +08:00
78 changed files with 416 additions and 246 deletions

View File

@@ -31,11 +31,21 @@ type DomainList struct {
} }
func (d *DomainRule) domain2String() string { func (d *DomainRule) domain2String() string {
dstring := d.Type + ":" + d.Value var dstr strings.Builder
if len(d.Attrs) != 0 { dstr.Grow(len(d.Type) + len(d.Value) + 10)
dstring += ":@" + strings.Join(d.Attrs, ",@") dstr.WriteString(d.Type)
dstr.WriteByte(':')
dstr.WriteString(d.Value)
for i, attr := range d.Attrs {
if i == 0 {
dstr.WriteByte(':')
} else {
dstr.WriteByte(',')
}
dstr.WriteByte('@')
dstr.WriteString(attr)
} }
return dstring return dstr.String()
} }
func loadGeosite(path string) ([]DomainList, map[string]*DomainList, error) { func loadGeosite(path string) ([]DomainList, map[string]*DomainList, error) {
@@ -82,10 +92,10 @@ func loadGeosite(path string) ([]DomainList, map[string]*DomainList, error) {
func exportSite(name string, domainListByName map[string]*DomainList) error { func exportSite(name string, domainListByName map[string]*DomainList) error {
domainList, ok := domainListByName[strings.ToUpper(name)] domainList, ok := domainListByName[strings.ToUpper(name)]
if !ok { if !ok {
return fmt.Errorf("list '%s' does not exist", name) return fmt.Errorf("list %q does not exist", name)
} }
if len(domainList.Rules) == 0 { if len(domainList.Rules) == 0 {
return fmt.Errorf("list '%s' is empty", name) return fmt.Errorf("list %q is empty", name)
} }
file, err := os.Create(filepath.Join(*outputDir, name+".yml")) file, err := os.Create(filepath.Join(*outputDir, name+".yml"))
if err != nil { if err != nil {
@@ -119,22 +129,16 @@ func exportAll(filename string, domainLists []DomainList) error {
return w.Flush() return w.Flush()
} }
func main() { func run() error {
flag.Parse() // Make sure output directory exists
if err := os.MkdirAll(*outputDir, 0755); err != nil {
// Create output directory if not exist return fmt.Errorf("failed to create output directory: %w", err)
if _, err := os.Stat(*outputDir); os.IsNotExist(err) {
if mkErr := os.MkdirAll(*outputDir, 0755); mkErr != nil {
fmt.Println("Failed to create output directory:", mkErr)
os.Exit(1)
}
} }
fmt.Printf("Loading %s...\n", *inputData) fmt.Printf("loading source data %q...\n", *inputData)
domainLists, domainListByName, err := loadGeosite(*inputData) domainLists, domainListByName, err := loadGeosite(*inputData)
if err != nil { if err != nil {
fmt.Println("Failed to loadGeosite:", err) return fmt.Errorf("failed to loadGeosite: %w", err)
os.Exit(1)
} }
var exportListSlice []string var exportListSlice []string
@@ -150,15 +154,24 @@ func main() {
for _, eplistname := range exportListSlice { for _, eplistname := range exportListSlice {
if strings.EqualFold(eplistname, "_all_") { if strings.EqualFold(eplistname, "_all_") {
if err := exportAll(filepath.Base(*inputData)+"_plain.yml", domainLists); err != nil { if err := exportAll(filepath.Base(*inputData)+"_plain.yml", domainLists); err != nil {
fmt.Println("Failed to exportAll:", err) fmt.Printf("failed to exportAll: %v\n", err)
continue continue
} }
} else { } else {
if err := exportSite(eplistname, domainListByName); err != nil { if err := exportSite(eplistname, domainListByName); err != nil {
fmt.Println("Failed to exportSite:", err) fmt.Printf("failed to exportSite: %v\n", err)
continue continue
} }
} }
fmt.Printf("list: '%s' has been exported successfully.\n", eplistname) fmt.Printf("list: %q has been exported successfully.\n", eplistname)
}
return nil
}
func main() {
flag.Parse()
if err := run(); err != nil {
fmt.Printf("Fatal error: %v\n", err)
os.Exit(1)
} }
} }

View File

@@ -1,4 +1,6 @@
2k.com 2k.com
2kcoretech.online 2kcoretech.online
2kct.onl
2kgames.com 2kgames.com
take2games.com 2ksports.com
2kweb.online

View File

@@ -1 +0,0 @@
adcolony.com @ads

View File

@@ -1,4 +1,4 @@
adjust.com @ads adjust.com @ads
adjust.net.in @ads
adjust.io @ads adjust.io @ads
adjust.net.in @ads
adjust.world @ads adjust.world @ads

View File

@@ -1,2 +0,0 @@
applovin.com @ads
applvn.com @ads

View File

@@ -1,7 +1,11 @@
include:trello
atl-paas.net
atlassian-dev.net
atlassian.com atlassian.com
atlassian.net atlassian.net
bitbucket.io bitbucket.io
bitbucket.org bitbucket.org
jira.com
ss-inf.net
statuspage.io statuspage.io
include:trello

View File

@@ -1,3 +0,0 @@
atom-data.io @ads
analytics-data.io @ads
ironbeast.io @ads

3
data/aviasales Normal file
View File

@@ -0,0 +1,3 @@
avs.io
aviasales.ru
aviasales.com

View File

@@ -31,6 +31,7 @@ binanceapi.com
binanceru.net binanceru.net
bnbstatic.com bnbstatic.com
bntrace.com bntrace.com
bsappapi.com
nftstatic.com nftstatic.com
# saas # saas

View File

@@ -1,32 +1,21 @@
# This file contains domains that clearly serving ads # This file contains domains that clearly serving ads
include:acfun-ads include:acfun-ads
include:adcolony-ads
include:adjust-ads
include:adobe-ads include:adobe-ads
include:alibaba-ads include:alibaba-ads
include:amazon-ads include:amazon-ads
include:apple-ads include:apple-ads
include:applovin-ads
include:atom-data-ads
include:baidu-ads include:baidu-ads
include:bytedance-ads include:bytedance-ads
include:category-ads-ir include:category-ads-ir
include:cctv @ads include:cctv @ads
include:clearbit-ads
include:disney @ads include:disney @ads
include:dmm-ads include:dmm-ads
include:duolingo-ads include:duolingo-ads
include:emogi-ads
include:flurry-ads
include:gamersky @ads include:gamersky @ads
include:google-ads include:google-ads
include:growingio-ads
include:hetzner @ads include:hetzner @ads
include:hiido-ads
include:hotjar-ads
include:hunantv-ads include:hunantv-ads
include:inner-active-ads
include:iqiyi-ads include:iqiyi-ads
include:jd-ads include:jd-ads
include:kuaishou-ads include:kuaishou-ads
@@ -34,36 +23,25 @@ include:kugou-ads
include:letv-ads include:letv-ads
include:meta-ads include:meta-ads
include:microsoft-ads include:microsoft-ads
include:mopub-ads
include:mxplayer-ads
include:netease-ads include:netease-ads
include:newrelic-ads
include:ogury-ads
include:ookla-speedtest-ads include:ookla-speedtest-ads
include:openai @ads include:openai @ads
include:openx-ads
include:picacg @ads include:picacg @ads
include:pikpak @ads include:pikpak @ads
include:pixiv @ads include:pixiv @ads
include:pocoiq-ads
include:pubmatic-ads
include:qihoo360-ads include:qihoo360-ads
include:samsung @ads include:samsung @ads
include:segment-ads
include:sina-ads include:sina-ads
include:snap @ads include:snap @ads
include:sohu-ads include:sohu-ads
include:spotify-ads include:spotify-ads
include:supersonic-ads
include:tagtic-ads
include:tappx-ads
include:television-ads include:television-ads
include:tencent-ads include:tencent-ads
include:tendcloud @ads include:tendcloud @ads
include:twitter @ads include:twitter @ads
include:uberads-ads
include:umeng-ads include:umeng-ads
include:unity-ads include:unity @ads
include:unitychina @ads
include:xhamster-ads include:xhamster-ads
include:xiaomi-ads include:xiaomi-ads
include:ximalaya-ads include:ximalaya-ads
@@ -91,21 +69,26 @@ cdn.banclip.com
cfts1tifqr.com cfts1tifqr.com
contentabc.com contentabc.com
cretgate.com cretgate.com
data.flurry.com
decide.mixpanel.com decide.mixpanel.com
emogi.com
ero-advertising.com ero-advertising.com
eroadvertising.com eroadvertising.com
evt.mxplay.com
exoclick.com exoclick.com
exosrv.com exosrv.com
go2.global go2.global
gozendata.com gozendata.com
gzads.com
gz-data.com gz-data.com
gzads.com
img-bss.csdn.net img-bss.csdn.net
imglnkc.com imglnkc.com
imglnkd.com imglnkd.com
inner-active.mobi
innovid.com innovid.com
jads.co jads.co
jl3.yjaxa.top jl3.yjaxa.top
js-agent.newrelic.com
juicyads.com juicyads.com
kepler-37b.com kepler-37b.com
leanplum.com leanplum.com
@@ -113,22 +96,26 @@ lqc006.com
moat.com moat.com
moatads.com moatads.com
mobwithad.com mobwithad.com
mopub.com
onesignal.com onesignal.com
realsrv.com realsrv.com
s4yxaqyq95.com s4yxaqyq95.com
shhs-ydd8x2.yjrmss.cn shhs-ydd8x2.yjrmss.cn
ssp.api.tappx.com
static.hotjar.com
static.javhd.com static.javhd.com
tm-banners.gamingadult.com tm-banners.gamingadult.com
trafficfactory.biz trafficfactory.biz
tsyndicate.com tsyndicate.com
uberads.com
wwads.cn wwads.cn
# 36Kr
adx.36kr.com
# 12306 # 12306
ad.12306.cn ad.12306.cn
# 36Kr
adx.36kr.com
# AdHub # AdHub
hubcloud.com.cn hubcloud.com.cn
@@ -139,6 +126,10 @@ beizi.biz
click.ali213.net click.ali213.net
pbmp.ali213.net pbmp.ali213.net
# AppLovin
applovin.com
applvn.com
# Caixin # Caixin
# regexp:^pinggai\d\.caixin\.com$ # regexp:^pinggai\d\.caixin\.com$
full:pinggai0.caixin.com full:pinggai0.caixin.com
@@ -156,12 +147,29 @@ full:pinggai9.caixin.com
adq.chinaso.com adq.chinaso.com
stat.chinaso.com stat.chinaso.com
# hiido
mlog.hiido.com
ylog.hiido.com
# Httpool # Httpool
toboads.com toboads.com
# ironSource Atom
analytics-data.io
atom-data.io
ironbeast.io
# pocoiq
cdn.pocoiq.cn
oct.pocoiq.cn
# Qiniu # Qiniu
dn-growing.qbox.me dn-growing.qbox.me
# tagtic
g1.tagtic.cn
xy-log.tagtic.cn
# UNI Marketing # UNI Marketing
ad.unimhk.com ad.unimhk.com

View File

@@ -1,29 +1,35 @@
# This file contains domains of all ads providers, including both the domains that serves ads, and the domains of providers themselves. # This file contains domains of all ads providers, including both the domains that serves ads, and the domains of providers themselves.
include:category-ads
include:adjust
include:clearbit
include:growingio
include:ogury
include:openx
include:pubmatic
include:segment
include:supersonic
include:taboola
1rx.io @ads
7box.vip @ads 7box.vip @ads
ad-delivery.net @ads ad-delivery.net @ads
adcolony.com @ads
adinplay.com @ads adinplay.com @ads
adnxs.com @ads adnxs.com @ads
adview.cn @ads
ads.trafficjunky.net @ads ads.trafficjunky.net @ads
advertserve.com @ads advertserve.com @ads
adview.cn @ads
casalemedia.com @ads casalemedia.com @ads
contextual.media.net @ads contextual.media.net @ads
cpmstar.com @ads cpmstar.com @ads
demdex.net @ads demdex.net @ads
httpool.com @ads httpool.com @ads
lijit.com @ads lijit.com @ads
1rx.io @ads
mfadsrvr.com @ads mfadsrvr.com @ads
mgid.com @ads mgid.com @ads
ns1p.net @ads ns1p.net @ads
pubmatic.com @ads
sigmob.com @ads sigmob.com @ads
spotxchange.com @ads spotxchange.com @ads
unimhk.com @ads unimhk.com @ads
upapi.net @ads upapi.net @ads
include:taboola
include:category-ads

View File

@@ -4,13 +4,16 @@ include:cerebras
include:comfy include:comfy
include:cursor include:cursor
include:elevenlabs include:elevenlabs
include:github-copilot
include:google-deepmind include:google-deepmind
include:groq include:groq
include:huggingface include:huggingface
include:liveperson include:liveperson
include:manus
include:openai include:openai
include:perplexity include:perplexity
include:poe include:poe
include:windsurf
include:xai include:xai
include:youmind include:youmind

View File

@@ -28,6 +28,8 @@ chatglm.cn
zhipuai.cn zhipuai.cn
# 月之暗面 # 月之暗面
kimi.com
moonshot.ai
moonshot.cn moonshot.cn
# 讯飞星火 # 讯飞星火

View File

@@ -6,12 +6,14 @@ include:qiniu
include:upai include:upai
include:wangsu include:wangsu
## 创世云 # 创世云
chuangcache.com chuangcache.com
chuangcdn.com chuangcdn.com
## FUNCDN # 大风云CDN
dfyun.com.cn
# FUNCDN
funcdn.com funcdn.com
## 北京知道创宇信息技术股份有限公司 # 北京知道创宇信息技术股份有限公司
jiashule.com jiashule.com
jiasule.com jiasule.com
yunaq.com yunaq.com

View File

@@ -4,6 +4,8 @@
asklink.com asklink.com
## EasyTier ## EasyTier
easytier.cn easytier.cn
## 飞衡HTTP
feihengip.com
## Oray ## Oray
oray.com oray.com
oray.net oray.net
@@ -35,3 +37,5 @@ xiumi.us
xiumius.com xiumius.com
## 吾道 ## 吾道
woodo.cn woodo.cn
## Worktile
worktile.com

View File

@@ -48,6 +48,7 @@ include:kakao
include:kaspersky include:kaspersky
include:lg include:lg
include:logitech include:logitech
include:louisvuitton
include:mailru-group include:mailru-group
include:meta include:meta
include:microsoft include:microsoft

View File

@@ -18,7 +18,10 @@ include:segmentfault
include:sxl include:sxl
include:tencent-dev include:tencent-dev
include:ubuntukylin include:ubuntukylin
include:unitychina
aardio.com
jinrishici.com jinrishici.com
openvela.com openvela.com
pingcode.com
tipdm.org tipdm.org

View File

@@ -71,6 +71,8 @@ baicizhan.com
baicizhan.org baicizhan.org
bczcdn.com bczcdn.com
bczeducation.cn bczeducation.cn
# 毕业之家科研服务平台
biyehome.net
# Burning Vocabulary # Burning Vocabulary
burningvocabulary.cn burningvocabulary.cn
burningvocabulary.com burningvocabulary.com
@@ -142,3 +144,5 @@ ystbds.com
zhan.com zhan.com
# 智慧树 # 智慧树
zhihuishu.com zhihuishu.com
# 浙江省教育考试院
zjzs.net

View File

@@ -6,3 +6,7 @@ include:tianyancha
qichamao.com qichamao.com
qyyjt.cn qyyjt.cn
x315.com x315.com
# 信查查
xcc.cn
xinchacha.com

View File

@@ -54,6 +54,7 @@ include:pixiv
include:plutotv include:plutotv
include:pocketcasts include:pocketcasts
include:primevideo include:primevideo
include:radiko
include:roku include:roku
include:showtimeanytime include:showtimeanytime
include:sling include:sling

View File

@@ -50,6 +50,8 @@ yeshen.com
51zmt.top 51zmt.top
# 广东南方新媒体 # 广东南方新媒体
aisee.tv aisee.tv
# 动画巡礼
anitabi.cn
# 暴风影音 # 暴风影音
baofeng.com baofeng.com
baofeng.net baofeng.net
@@ -80,6 +82,10 @@ jjwxc.net
# 酷匠网 # 酷匠网
kjcdn.com kjcdn.com
kujiang.com kujiang.com
# 1905电影网
1905.com
m1905.cn
m1905.com
# 喵御宅 # 喵御宅
mfuns.cn mfuns.cn
# 秒拍 # 秒拍
@@ -87,6 +93,9 @@ miaopai.com
# 磨铁文学 # 磨铁文学
motie.com motie.com
motieimg.com motieimg.com
# Mtime时光网
mtime.cn
mtime.com
# 梨视频 # 梨视频
pearvideo.com pearvideo.com
# 皮皮网 # 皮皮网

View File

@@ -1,4 +1,5 @@
include:bestore include:bestore
include:ddmaicai
include:lkcoffee include:lkcoffee
3songshu.com 3songshu.com

View File

@@ -1,4 +1,3 @@
include:2kgames
include:blizzard include:blizzard
include:bluearchive include:bluearchive
include:bohemia include:bohemia
@@ -10,6 +9,7 @@ include:eneba
include:epicgames include:epicgames
include:escapefromtarkov include:escapefromtarkov
include:faceit include:faceit
include:gaijin
include:garena include:garena
include:gog include:gog
include:hoyoverse include:hoyoverse
@@ -30,12 +30,12 @@ include:pubg
include:purikonejp include:purikonejp
include:riot include:riot
include:roblox include:roblox
include:rockstar
include:snk include:snk
include:steam include:steam
include:steaminventoryhelper include:steaminventoryhelper
include:steamunlocked include:steamunlocked
include:supercell include:supercell
include:take-two
include:ubisoft include:ubisoft
include:vrchat include:vrchat
include:wbgames include:wbgames

View File

@@ -78,6 +78,15 @@ freebuf.com
geekpark.net geekpark.net
# 光明网 # 光明网
gmw.com gmw.com
# 硅谷网
guigu.org
# 同花顺
0033.cn
10jqka.com.cn
hexin.cn
hexin.com.cn
ths123.com
thsi.cn
# 和讯 # 和讯
hexun.com hexun.com
# 河南广播电视台/大象网 # 河南广播电视台/大象网
@@ -96,10 +105,14 @@ icpcw.com
idcquan.com idcquan.com
# 艾瑞咨询 # 艾瑞咨询
iresearch.cn iresearch.cn
# IT168
it168.com
# 华尔街见闻 # 华尔街见闻
jianyuweb.com jianyuweb.com
wallstcn.com wallstcn.com
wallstreetcn.com wallstreetcn.com
# 金十数据
jin10.com
# 上观新闻/解放日报 # 上观新闻/解放日报
jfdaily.com jfdaily.com
shobserver.com shobserver.com
@@ -122,6 +135,8 @@ kksmg.com
statickksmg.com statickksmg.com
# 晚点 # 晚点
latepost.com latepost.com
# 今日观察网
miercn.com
# 快科技 # 快科技
mydrivers.com mydrivers.com
# 南岳新闻网 # 南岳新闻网
@@ -134,9 +149,14 @@ xinhuanet.com
xinhuaxmt.com xinhuaxmt.com
# 维科网 # 维科网
ofweek.com ofweek.com
# PChome电脑之家
pchome.net
pchpic.net
# PConline 太平洋科技 # PConline 太平洋科技
3conline.com 3conline.com
pconline.com.cn pconline.com.cn
# 泡泡网
pcpop.com
# 人民网 # 人民网
people.cn people.cn
people.com.cn people.com.cn
@@ -165,6 +185,8 @@ shangyexinzhi.com
solidot.org solidot.org
# 南方新闻网 # 南方新闻网
southcn.com southcn.com
# 南方财富网
southmoney.com
# 少数派 # 少数派
sspai.com sspai.com
# 证券之星 # 证券之星
@@ -184,12 +206,10 @@ techweb.com.cn
thecover.cn thecover.cn
# 澎湃新闻 # 澎湃新闻
thepaper.cn thepaper.cn
# 同花顺
10jqka.com.cn
thsi.cn
ths123.com
# 人人都是产品经理 # 人人都是产品经理
woshipm.com woshipm.com
# 西陆网
xilu.com
# 新快报 # 新快报
xkb.com.cn xkb.com.cn
# 第一财经 # 第一财经

View File

@@ -22,6 +22,7 @@ include:category-gov-ru
include:category-retail-ru include:category-retail-ru
# Public transportation # Public transportation
include:aviasales
include:mosmetro include:mosmetro
include:avito include:avito

View File

@@ -1,26 +1,29 @@
# This list contains social media platforms inside China mainland. # This list contains social media platforms inside China mainland.
include:coolapk include:coolapk
include:douban include:douban
include:gracg include:gracg
include:hupu include:hupu
include:meipian include:meipian
include:okjike include:okjike
include:sina @-!cn include:sina @-!cn
include:xiaohongshu include:xiaohongshu
include:yy include:yy
include:zhihu include:zhihu
tieba.baidu.com tieba.baidu.com
tieba.com tieba.com
# 杭州蛋蛋语音科技有限公司 # 杭州蛋蛋语音科技有限公司
dandan818.com dandan818.com
dandanvoice.com dandanvoice.com
# 脉脉 # 饭否
maimai.cn fanfou.com
taou.com
# 脉脉
# 知识星球 maimai.cn
zsxq.com taou.com
# 知识星球
zsxq.com

View File

@@ -4,6 +4,9 @@ mbalib.com
sec-wiki.com sec-wiki.com
shidianbaike.com shidianbaike.com
# 叉子周 手机博物馆
chaz.fun
# huijiwiki # huijiwiki
huijistatic.com huijistatic.com
huijiwiki.com huijiwiki.com

View File

@@ -41,6 +41,9 @@ cloudflarewarp.com
cloudflareworkers.com cloudflareworkers.com
encryptedsni.com encryptedsni.com
every1dns.net every1dns.net
foundationdns.com
foundationdns.net
foundationdns.org
imagedelivery.net imagedelivery.net
isbgpsafeyet.com isbgpsafeyet.com
one.one.one one.one.one

10
data/ddmaicai Normal file
View File

@@ -0,0 +1,10 @@
# 叮咚买菜 上海壹佰米网络科技有限公司
100.me
ddcorp.net
ddfresh.net
ddimg.mobi
ddmaicai.net
ddmc.mobi
dduser.mobi
ddxq.mobi
imaicai.mobi

View File

@@ -2,6 +2,7 @@ dji.com
dji.ink dji.ink
dji.net dji.net
djicdn.com djicdn.com
djigate.com
djiits.com djiits.com
djiops.com djiops.com
djiservice.org djiservice.org

View File

@@ -4,3 +4,4 @@ douyucdn.cn
douyucdn2.cn douyucdn2.cn
douyuscdn.com douyuscdn.com
douyutv.com douyutv.com
edgesrv.com

View File

@@ -1 +0,0 @@
emogi.com @ads

View File

@@ -1 +0,0 @@
data.flurry.com @ads

13
data/gaijin Normal file
View File

@@ -0,0 +1,13 @@
acesofthunder.net
activematter.game
artstorm.com
crossout.net
crsed.net
cubicodyssey.game
enlisted.net
gaijin.net
gaijinent.com
modernwarships.com
star-conflict.com
warthunder.com
wtmobile.com

View File

@@ -271,6 +271,8 @@ ldoceonline.com
immersivetranslate.com # 沉浸式翻译 (国际版) immersivetranslate.com # 沉浸式翻译 (国际版)
## OriginLab (Graphing for Science and Engineering) ## OriginLab (Graphing for Science and Engineering)
originlab.com originlab.com
## OsmAnd
osmand.net
# Software development # Software development
include:category-dev include:category-dev

View File

@@ -23,8 +23,8 @@ include:category-social-media-cn
# Advertisment & Analytics # Advertisment & Analytics
include:getui include:getui
include:growingio
include:jiguang include:jiguang
include:umeng
# 神策数据 # 神策数据
sensorsdata.cn sensorsdata.cn
@@ -164,6 +164,7 @@ ezpro.pro # 小马路由
itpub.net # ITPUB技术论坛 itpub.net # ITPUB技术论坛
itsk.com # IT天空论坛 itsk.com # IT天空论坛
jandan.net # 煎蛋 jandan.net # 煎蛋
jisilu.cn # 集思录
kafan.cn # 卡饭论坛 kafan.cn # 卡饭论坛
kanxue.com # 看雪 kanxue.com # 看雪
kdslife.com # 宽带山 kdslife.com # 宽带山
@@ -199,6 +200,11 @@ biomart.cn
dxy.com dxy.com
dxy.cn dxy.cn
dxycdn.com dxycdn.com
## 薄荷健康
boohee.com
## 好大夫在线
haodf.com
hdfimg.com
## 江苏健康通 ## 江苏健康通
jsehealth.com jsehealth.com
## 仁科医疗科技有限公司服务域名,为北大口腔和一些其他国内医院小程序提供服务 ## 仁科医疗科技有限公司服务域名,为北大口腔和一些其他国内医院小程序提供服务
@@ -354,6 +360,8 @@ dida365.com
## 兑吧 ## 兑吧
dui88.com dui88.com
duiba.com.cn duiba.com.cn
## 方正字库
foundertype.com
## 快应用 ## 快应用
hapjs.org hapjs.org
quickapp.cn quickapp.cn
@@ -380,25 +388,27 @@ ireader.com
zhangyue.com zhangyue.com
zhangyue01.com zhangyue01.com
zhangyuecdn.com zhangyuecdn.com
## 仟寻招聘
moseeker.com
## 小能智慧云客服 ## 小能智慧云客服
ntalker.com ntalker.com
## OneDNS 微步在线
onedns.net
## 心知天气 ## 心知天气
sencdn.com sencdn.com
seniverse.com seniverse.com
## 重庆阅品科技 ## 实习僧
tianqi.com shixiseng.com
tianqistatic.com sxsimg.com
## 方正字库 xiaoyuanzhao.com
foundertype.com
## 仟寻招聘
moseeker.com
## OneDNS 微步在线
onedns.net
## 智齿客服 ## 智齿客服
sobot.com sobot.com
soboten.com soboten.com
## TaCool SSL 酷证书 ## TaCool SSL 酷证书
tacool.com tacool.com
## 重庆阅品科技
tianqi.com
tianqistatic.com
## Via 浏览器 ## Via 浏览器
viayoo.com viayoo.com
## X 浏览器 ## X 浏览器
@@ -434,7 +444,7 @@ include:lenovo
include:meizu include:meizu
include:midea include:midea
include:narwal # 云鲸科技 include:narwal # 云鲸科技
include:netease include:netease @-!cn
include:oppo @-!cn include:oppo @-!cn
include:qihoo360 include:qihoo360
include:sumkoo #北京尚古创新科技有限公司 include:sumkoo #北京尚古创新科技有限公司
@@ -562,7 +572,6 @@ ycrx360.com
17989.com 17989.com
17cdn.com 17cdn.com
17house.com 17house.com
1905.com
19yxw.com 19yxw.com
1nongjing.com 1nongjing.com
1ting.com 1ting.com
@@ -664,7 +673,6 @@ ycrx360.com
9ht.com 9ht.com
9xu.com 9xu.com
a9vg.com a9vg.com
aardio.com # 皖ICP备09012014号
acetaffy.club # 粤ICP备2022042304号 acetaffy.club # 粤ICP备2022042304号
adxvip.com adxvip.com
afzhan.com afzhan.com
@@ -720,7 +728,6 @@ bio-equip.com
biodiscover.com biodiscover.com
bishijie.com bishijie.com
bitecoin.com bitecoin.com
biyehome.net
bjcathay.com bjcathay.com
bobo.com bobo.com
bojianger.com bojianger.com
@@ -744,7 +751,6 @@ chachaba.com
changba.com changba.com
chaojituzi.net chaojituzi.net
chashebao.com chashebao.com
chaz.fun # 粤ICP备2022001828号-2
chazhengla.com chazhengla.com
chazidian.com chazidian.com
che168.com che168.com
@@ -880,7 +886,6 @@ fanli.com
fangxiaoer.com fangxiaoer.com
fanxian.com fanxian.com
fastapi.net fastapi.net
feihengip.com # 粤ICP备2023115330号-1
feihuo.com feihuo.com
feiniaomy.com feiniaomy.com
fengniao.com fengniao.com
@@ -904,7 +909,6 @@ gdrc.com
geektool.top # 极客Tool 蜀ICP备2024086015号-2 geektool.top # 极客Tool 蜀ICP备2024086015号-2
gezida.com gezida.com
gfan.com gfan.com
giocdn.com
globrand.com globrand.com
gm86.com gm86.com
gmz88.com gmz88.com
@@ -915,7 +919,6 @@ gongxiangcj.com
goosail.com goosail.com
goufw.com goufw.com
greenxiazai.com greenxiazai.com
growingio.com
gtags.net gtags.net
guabu.com guabu.com
guaiguai.com guaiguai.com
@@ -923,7 +926,6 @@ guanaitong.com
guanhaobio.com guanhaobio.com
guanyierp.com # 沪ICP备14043335号-8 guanyierp.com # 沪ICP备14043335号-8
gucheng.com gucheng.com
guigu.org
guoxinmac.com guoxinmac.com
gupzs.com gupzs.com
gushiwen.org gushiwen.org
@@ -998,7 +1000,6 @@ iranshao.com
irs01.com irs01.com
istoreos.com # 粤ICP备20024441号-9 istoreos.com # 粤ICP备20024441号-9
it165.net it165.net
it168.com
it610.com it610.com
itjuzi.com itjuzi.com
itmop.com itmop.com
@@ -1121,7 +1122,6 @@ meishij.net
mengtuoshi.wang mengtuoshi.wang
miaobolive.com miaobolive.com
miaozhen.com miaozhen.com
miercn.com
mijisou.com mijisou.com
mikecrm.com mikecrm.com
minhangshi.com minhangshi.com
@@ -1179,8 +1179,6 @@ p5w.net
paipaibang.com paipaibang.com
paopaoche.net paopaoche.net
pc6.com pc6.com
pchome.net
pcpop.com
peccn.com peccn.com
pgzs.com pgzs.com
pharmacodia.com pharmacodia.com
@@ -1246,7 +1244,6 @@ shengdaosoft.com
shenmayouxi.com shenmayouxi.com
sheui.com sheui.com
shijiexia.com shijiexia.com
shixiseng.com
shmetro.com shmetro.com
shoujihuifu.com shoujihuifu.com
shouqianba.com shouqianba.com
@@ -1270,7 +1267,6 @@ softwhy.com
sojson.com sojson.com
somode.com somode.com
souqian.com souqian.com
southmoney.com
sparkletour.com sparkletour.com
springtour.com springtour.com
ssports.com ssports.com
@@ -1377,7 +1373,6 @@ womai.com
wondercv.com # 超级简历 wondercv.com # 超级简历
wonnder.com wonnder.com
wooyun.org wooyun.org
worktile.com
woyaogexing.com woyaogexing.com
woyoo.com woyoo.com
wqiis.com wqiis.com

View File

@@ -1,4 +1,5 @@
include:github-ads include:github-ads
include:github-copilot
include:npmjs include:npmjs
atom.io atom.io
@@ -14,7 +15,6 @@ github.dev
github.io github.io
githubapp.com githubapp.com
githubassets.com githubassets.com
githubcopilot.com
githubhackathon.com githubhackathon.com
githubnext.com githubnext.com
githubpreview.dev githubpreview.dev

1
data/github-copilot Normal file
View File

@@ -0,0 +1 @@
githubcopilot.com

7
data/growingio Normal file
View File

@@ -0,0 +1,7 @@
# 北京易数科技
datayi.cn
gio.ren
giocdn.com
growin.cn
growingio.cn
growingio.com

View File

@@ -1 +0,0 @@
assets.growingio.com @ads

12
data/hdrezka Normal file
View File

@@ -0,0 +1,12 @@
hdrezka-home.tv
hdrezka.ac
hdrezka.ag
hdrezka.cm
hdrezka.co
hdrezka.me
hdrezka.org
hdrezka.site
rezka.ag
# hdrezka video CDN servers
stream.voidboost.cc

View File

@@ -1,2 +0,0 @@
mlog.hiido.com @ads
ylog.hiido.com @ads

View File

@@ -1 +0,0 @@
static.hotjar.com @ads

View File

@@ -1 +0,0 @@
inner-active.mobi @ads

View File

@@ -6,4 +6,9 @@ gfw.ovh # sub domains mirror
mos-gorsud.co # kinopub domain to generate a mirror site through gfw.ovh mos-gorsud.co # kinopub domain to generate a mirror site through gfw.ovh
# kinopub CDN servers # kinopub CDN servers
cdn-service.space
cdn2cdn.com
cdn2site.com
pushbr.com # poster images CDN
regexp:(\w+)-static-[0-9]+\.cdntogo\.net$ regexp:(\w+)-static-[0-9]+\.cdntogo\.net$

4
data/kodik Normal file
View File

@@ -0,0 +1,4 @@
kodik-storage.com
kodik.biz
kodik.cc
kodik.info

5
data/louisvuitton Normal file
View File

@@ -0,0 +1,5 @@
louisvuitton.cn @cn
louisvuitton.com
lvcampaign.com @cn
full:tp.louisvuitton.com @cn

2
data/manus Normal file
View File

@@ -0,0 +1,2 @@
manus.im
manuscdn.com

View File

@@ -1,3 +1,5 @@
include:ddmaicai
dianping.com dianping.com
maoyan.com maoyan.com
meituan.com meituan.com

View File

@@ -60,6 +60,7 @@ full:default.exp-tas.com
full:developer.microsoft.com full:developer.microsoft.com
full:download.visualstudio.microsoft.com full:download.visualstudio.microsoft.com
full:dtlgalleryint.cloudapp.net full:dtlgalleryint.cloudapp.net
full:packages.microsoft.com
full:poshtestgallery.cloudapp.net full:poshtestgallery.cloudapp.net
full:psg-int-centralus.cloudapp.net full:psg-int-centralus.cloudapp.net
full:psg-int-eastus.cloudapp.net full:psg-int-eastus.cloudapp.net

View File

@@ -1 +0,0 @@
mopub.com @ads

View File

@@ -1 +0,0 @@
evt.mxplay.com @ads

View File

@@ -16,6 +16,7 @@ include:netease-ads
166.net 166.net
188.com 188.com
321fenx.com 321fenx.com
easebar.com @!cn
haowu.link haowu.link
icourse163.org icourse163.org
lf126.net lf126.net

View File

@@ -1 +0,0 @@
js-agent.newrelic.com @ads

View File

@@ -1,3 +1,3 @@
ogury.co @ads
ogury.com @ads ogury.com @ads
presage.io @ads presage.io @ads
ogury.co @ads

View File

@@ -1,2 +0,0 @@
cdn.pocoiq.cn @ads
oct.pocoiq.cn @ads

View File

@@ -1 +1,2 @@
sekai.colorfulpalette.org sekai.colorfulpalette.org
pjsekai.sega.jp

View File

@@ -2,5 +2,3 @@
pubmatic.com pubmatic.com
pubmatic.co.jp pubmatic.co.jp
include:pubmatic-ads

View File

@@ -1 +0,0 @@
ads.pubmatic.com @ads

View File

@@ -44,6 +44,7 @@ dnsv1.com.cn
dothework.cn dothework.cn
ectencent.cn ectencent.cn
ectencent.com.cn ectencent.com.cn
edgeone.cool
edgeonedy1.com edgeonedy1.com
essurl.com essurl.com
exmailgz.com exmailgz.com

5
data/radiko Normal file
View File

@@ -0,0 +1,5 @@
# radiko official access and streaming domains
radiko-cf.com
radiko.jp
smartstream.ne.jp

View File

@@ -1,4 +1,5 @@
rockstargames.com rockstargames.com
rockstarnorth.com
rsg.sc rsg.sc
full:gamedownloads-rockstargames-com.akamaized.net full:gamedownloads-rockstargames-com.akamaized.net

View File

@@ -24,6 +24,7 @@ pardot.com
quotable.com quotable.com
radian6.com radian6.com
relateiq.com relateiq.com
salesforce-setup.com
salesforce.com salesforce.com
salesforce.org salesforce.org
salesforceiq.com salesforceiq.com

View File

@@ -1,4 +1,5 @@
ssacdn.com @ads
supersonic.com @ads supersonic.com @ads
supersonicads.com @ads supersonicads.com @ads
ssacdn.com @ads
supersonicads-a.akamaihd.net @ads supersonicads-a.akamaihd.net @ads

View File

@@ -1,2 +0,0 @@
g1.tagtic.cn @ads
xy-log.tagtic.cn @ads

5
data/take-two Normal file
View File

@@ -0,0 +1,5 @@
include:2kgames
include:rockstar
include:zynga
take2games.com

View File

@@ -1 +0,0 @@
ssp.api.tappx.com @ads

View File

@@ -1 +0,0 @@
uberads.com @ads

View File

@@ -1,4 +1,6 @@
unity.com unity.com
unity3d.com unity3d.com
include:unity-ads # Ads/tracking
iads.unity3d.com @ads
unityads.unity3d.com @ads

View File

@@ -1,6 +1,11 @@
# 优三缔 / 优美缔 / 团结引擎
u3d.cn
unity.cn
unitychina.cn
# Ads/tracking
ads.unitychina.cn @ads ads.unitychina.cn @ads
splash-ads.cdn.unity.cn @ads splash-ads.cdn.unity.cn @ads
splash-ads.unitychina.cn @ads splash-ads.unitychina.cn @ads
unityads.unity.cn @ads unityads.unity.cn @ads
unityads.unity3d.com @ads
unityads.unitychina.cn @ads unityads.unitychina.cn @ads

View File

@@ -3,6 +3,7 @@ err.sh
hyper.is hyper.is
nextjs.org nextjs.org
now.sh now.sh
skills.sh
static.fun static.fun
title.sh title.sh
turborepo.org turborepo.org

4
data/windsurf Normal file
View File

@@ -0,0 +1,4 @@
codeium.com
codeiumdata.com
windsurf.build
windsurf.com

View File

@@ -60,3 +60,6 @@ yastatic.net
# Watching movies, included in the Yandex subscription # Watching movies, included in the Yandex subscription
kinopoisk.ru kinopoisk.ru
kinopoisk-ru.clstorage.net kinopoisk-ru.clstorage.net
# Weather service
full:yandex-pogoda.static-storage.net

3
data/zynga Normal file
View File

@@ -0,0 +1,3 @@
zynga.com
zyngaplayersupport.com
zyngapoker.com

189
main.go
View File

@@ -23,7 +23,6 @@ var (
) )
var ( var (
refMap = make(map[string][]*Entry)
plMap = make(map[string]*ParsedList) plMap = make(map[string]*ParsedList)
finalMap = make(map[string][]*Entry) finalMap = make(map[string][]*Entry)
cirIncMap = make(map[string]bool) // Used for circular inclusion detection cirIncMap = make(map[string]bool) // Used for circular inclusion detection
@@ -78,18 +77,14 @@ func makeProtoList(listName string, entries []*Entry) (*router.GeoSite, error) {
return site, nil return site, nil
} }
func writePlainList(exportedName string) error { func writePlainList(listname string, entries []*Entry) error {
targetList, exist := finalMap[strings.ToUpper(exportedName)] file, err := os.Create(filepath.Join(*outputDir, strings.ToLower(listname)+".txt"))
if !exist || len(targetList) == 0 {
return fmt.Errorf("list %q does not exist or is empty.", exportedName)
}
file, err := os.Create(filepath.Join(*outputDir, strings.ToLower(exportedName)+".txt"))
if err != nil { if err != nil {
return err return err
} }
defer file.Close() defer file.Close()
w := bufio.NewWriter(file) w := bufio.NewWriter(file)
for _, entry := range targetList { for _, entry := range entries {
fmt.Fprintln(w, entry.Plain) fmt.Fprintln(w, entry.Plain)
} }
return w.Flush() return w.Flush()
@@ -99,7 +94,7 @@ func parseEntry(line string) (Entry, error) {
var entry Entry var entry Entry
parts := strings.Fields(line) parts := strings.Fields(line)
if len(parts) == 0 { if len(parts) == 0 {
return entry, fmt.Errorf("empty line: %q", line) return entry, fmt.Errorf("empty line")
} }
// Parse type and value // Parse type and value
@@ -138,7 +133,7 @@ func parseEntry(line string) (Entry, error) {
} }
} }
// Parse/Check attributes and affiliations // Parse attributes and affiliations
for _, part := range parts[1:] { for _, part := range parts[1:] {
if strings.HasPrefix(part, "@") { if strings.HasPrefix(part, "@") {
attr := strings.ToLower(part[1:]) // Trim attribute prefix `@` character attr := strings.ToLower(part[1:]) // Trim attribute prefix `@` character
@@ -159,10 +154,21 @@ func parseEntry(line string) (Entry, error) {
// Sort attributes // Sort attributes
slices.Sort(entry.Attrs) slices.Sort(entry.Attrs)
// Formated plain entry: type:domain.tld:@attr1,@attr2 // Formated plain entry: type:domain.tld:@attr1,@attr2
entry.Plain = entry.Type + ":" + entry.Value var plain strings.Builder
if len(entry.Attrs) != 0 { plain.Grow(len(entry.Type) + len(entry.Value) + 10)
entry.Plain = entry.Plain + ":@" + strings.Join(entry.Attrs, ",@") plain.WriteString(entry.Type)
plain.WriteByte(':')
plain.WriteString(entry.Value)
for i, attr := range entry.Attrs {
if i == 0 {
plain.WriteByte(':')
} else {
plain.WriteByte(',')
}
plain.WriteByte('@')
plain.WriteString(attr)
} }
entry.Plain = plain.String()
return entry, nil return entry, nil
} }
@@ -200,25 +206,21 @@ func validateSiteName(name string) bool {
return true return true
} }
func loadData(path string) error { func loadData(path string) ([]*Entry, error) {
file, err := os.Open(path) file, err := os.Open(path)
if err != nil { if err != nil {
return err return nil, err
} }
defer file.Close() defer file.Close()
listName := strings.ToUpper(filepath.Base(path)) var entries []*Entry
if !validateSiteName(listName) {
return fmt.Errorf("invalid list name: %s", listName)
}
scanner := bufio.NewScanner(file) scanner := bufio.NewScanner(file)
lineIdx := 0 lineIdx := 0
for scanner.Scan() { for scanner.Scan() {
line := scanner.Text() line := scanner.Text()
lineIdx++ lineIdx++
// Remove comments
if idx := strings.Index(line, "#"); idx != -1 { if idx := strings.Index(line, "#"); idx != -1 {
line = line[:idx] line = line[:idx] // Remove comments
} }
line = strings.TrimSpace(line) line = strings.TrimSpace(line)
if line == "" { if line == "" {
@@ -226,11 +228,11 @@ func loadData(path string) error {
} }
entry, err := parseEntry(line) entry, err := parseEntry(line)
if err != nil { if err != nil {
return fmt.Errorf("error in %s at line %d: %v", path, lineIdx, err) return entries, fmt.Errorf("error in %q at line %d: %w", path, lineIdx, err)
} }
refMap[listName] = append(refMap[listName], &entry) entries = append(entries, &entry)
} }
return nil return entries, nil
} }
func parseList(refName string, refList []*Entry) error { func parseList(refName string, refList []*Entry) error {
@@ -242,7 +244,7 @@ func parseList(refName string, refList []*Entry) error {
for _, entry := range refList { for _, entry := range refList {
if entry.Type == dlc.RuleTypeInclude { if entry.Type == dlc.RuleTypeInclude {
if len(entry.Affs) != 0 { if len(entry.Affs) != 0 {
return fmt.Errorf("affiliation is not allowed for include:%s", entry.Value) return fmt.Errorf("affiliation is not allowed for include:%q", entry.Value)
} }
inc := &Inclusion{Source: entry.Value} inc := &Inclusion{Source: entry.Value}
for _, attr := range entry.Attrs { for _, attr := range entry.Attrs {
@@ -268,11 +270,31 @@ func parseList(refName string, refList []*Entry) error {
return nil return nil
} }
func polishList(roughMap *map[string]*Entry) []*Entry { func isMatchAttrFilters(entry *Entry, incFilter *Inclusion) bool {
finalList := make([]*Entry, 0, len(*roughMap)) if len(incFilter.MustAttrs) == 0 && len(incFilter.BanAttrs) == 0 {
queuingList := make([]*Entry, 0, len(*roughMap)) // Domain/full entries without attr return true
}
if len(entry.Attrs) == 0 {
return len(incFilter.MustAttrs) == 0
}
for _, m := range incFilter.MustAttrs {
if !slices.Contains(entry.Attrs, m) {
return false
}
}
for _, b := range incFilter.BanAttrs {
if slices.Contains(entry.Attrs, b) {
return false
}
}
return true
}
func polishList(roughMap map[string]*Entry) []*Entry {
finalList := make([]*Entry, 0, len(roughMap))
queuingList := make([]*Entry, 0, len(roughMap)) // Domain/full entries without attr
domainsMap := make(map[string]bool) domainsMap := make(map[string]bool)
for _, entry := range *roughMap { for _, entry := range roughMap {
switch entry.Type { // Bypass regexp, keyword and "full/domain with attr" switch entry.Type { // Bypass regexp, keyword and "full/domain with attr"
case dlc.RuleTypeRegexp: case dlc.RuleTypeRegexp:
finalList = append(finalList, entry) finalList = append(finalList, entry)
@@ -306,9 +328,6 @@ func polishList(roughMap *map[string]*Entry) []*Entry {
break break
} }
pd = pd[idx+1:] // Go for next parent pd = pd[idx+1:] // Go for next parent
if !strings.Contains(pd, ".") {
break
} // Not allow tld to be a parent
if domainsMap[pd] { if domainsMap[pd] {
isRedundant = true isRedundant = true
break break
@@ -331,32 +350,11 @@ func resolveList(pl *ParsedList) error {
} }
if cirIncMap[pl.Name] { if cirIncMap[pl.Name] {
return fmt.Errorf("circular inclusion in: %s", pl.Name) return fmt.Errorf("circular inclusion in: %q", pl.Name)
} }
cirIncMap[pl.Name] = true cirIncMap[pl.Name] = true
defer delete(cirIncMap, pl.Name) defer delete(cirIncMap, pl.Name)
isMatchAttrFilters := func(entry *Entry, incFilter *Inclusion) bool {
if len(incFilter.MustAttrs) == 0 && len(incFilter.BanAttrs) == 0 {
return true
}
if len(entry.Attrs) == 0 {
return len(incFilter.MustAttrs) == 0
}
for _, m := range incFilter.MustAttrs {
if !slices.Contains(entry.Attrs, m) {
return false
}
}
for _, b := range incFilter.BanAttrs {
if slices.Contains(entry.Attrs, b) {
return false
}
}
return true
}
roughMap := make(map[string]*Entry) // Avoid basic duplicates roughMap := make(map[string]*Entry) // Avoid basic duplicates
for _, dentry := range pl.Entries { // Add direct entries for _, dentry := range pl.Entries { // Add direct entries
roughMap[dentry.Plain] = dentry roughMap[dentry.Plain] = dentry
@@ -375,80 +373,75 @@ func resolveList(pl *ParsedList) error {
} }
} }
} }
finalMap[pl.Name] = polishList(&roughMap) finalMap[pl.Name] = polishList(roughMap)
return nil return nil
} }
func main() { func run() error {
flag.Parse()
dir := *dataPath dir := *dataPath
fmt.Println("Use domain lists in", dir) fmt.Printf("using domain lists data in %q\n", dir)
// Generate refMap // Generate refMap
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { refMap := make(map[string][]*Entry)
err := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {
if err != nil { if err != nil {
return err return err
} }
if info.IsDir() { if d.IsDir() {
return nil return nil
} }
if err := loadData(path); err != nil { listName := strings.ToUpper(filepath.Base(path))
return err if !validateSiteName(listName) {
return fmt.Errorf("invalid list name: %q", listName)
} }
return nil refMap[listName], err = loadData(path)
return err
}) })
if err != nil { if err != nil {
fmt.Println("Failed to loadData:", err) return fmt.Errorf("failed to loadData: %w", err)
os.Exit(1)
} }
// Generate plMap // Generate plMap
for refName, refList := range refMap { for refName, refList := range refMap {
if err := parseList(refName, refList); err != nil { if err := parseList(refName, refList); err != nil {
fmt.Println("Failed to parseList:", err) return fmt.Errorf("failed to parseList %q: %w", refName, err)
os.Exit(1)
} }
} }
// Generate finalMap // Generate finalMap
for _, pl := range plMap { for plname, pl := range plMap {
if err := resolveList(pl); err != nil { if err := resolveList(pl); err != nil {
fmt.Println("Failed to resolveList:", err) return fmt.Errorf("failed to resolveList %q: %w", plname, err)
os.Exit(1)
} }
} }
// Create output directory if not exist // Make sure output directory exists
if _, err := os.Stat(*outputDir); os.IsNotExist(err) { if err := os.MkdirAll(*outputDir, 0755); err != nil {
if mkErr := os.MkdirAll(*outputDir, 0755); mkErr != nil { return fmt.Errorf("failed to create output directory: %w", err)
fmt.Println("Failed to create output directory:", mkErr)
os.Exit(1)
}
} }
// Export plaintext list // Export plaintext list
var exportListSlice []string for rawEpList := range strings.SplitSeq(*exportLists, ",") {
for raw := range strings.SplitSeq(*exportLists, ",") { if epList := strings.TrimSpace(rawEpList); epList != "" {
if trimmed := strings.TrimSpace(raw); trimmed != "" { entries, exist := finalMap[strings.ToUpper(epList)]
exportListSlice = append(exportListSlice, trimmed) if !exist || len(entries) == 0 {
fmt.Printf("list %q does not exist or is empty\n", epList)
continue
}
if err := writePlainList(epList, entries); err != nil {
fmt.Printf("failed to write list %q: %v\n", epList, err)
continue
}
fmt.Printf("list %q has been generated successfully.\n", epList)
} }
} }
for _, exportList := range exportListSlice {
if err := writePlainList(exportList); err != nil {
fmt.Println("Failed to write list:", err)
continue
}
fmt.Printf("list %q has been generated successfully.\n", exportList)
}
// Generate dat file // Generate dat file
protoList := new(router.GeoSiteList) protoList := new(router.GeoSiteList)
for siteName, siteEntries := range finalMap { for siteName, siteEntries := range finalMap {
site, err := makeProtoList(siteName, siteEntries) site, err := makeProtoList(siteName, siteEntries)
if err != nil { if err != nil {
fmt.Println("Failed to makeProtoList:", err) return fmt.Errorf("failed to makeProtoList %q: %w", siteName, err)
os.Exit(1)
} }
protoList.Entry = append(protoList.Entry, site) protoList.Entry = append(protoList.Entry, site)
} }
@@ -459,13 +452,19 @@ func main() {
protoBytes, err := proto.Marshal(protoList) protoBytes, err := proto.Marshal(protoList)
if err != nil { if err != nil {
fmt.Println("Failed to marshal:", err) return fmt.Errorf("failed to marshal: %w", err)
os.Exit(1)
} }
if err := os.WriteFile(filepath.Join(*outputDir, *outputName), protoBytes, 0644); err != nil { if err := os.WriteFile(filepath.Join(*outputDir, *outputName), protoBytes, 0644); err != nil {
fmt.Println("Failed to write output:", err) return fmt.Errorf("failed to write output: %w", err)
}
fmt.Printf("%q has been generated successfully.\n", *outputName)
return nil
}
func main() {
flag.Parse()
if err := run(); err != nil {
fmt.Printf("Fatal error: %v\n", err)
os.Exit(1) os.Exit(1)
} else {
fmt.Println(*outputName, "has been generated successfully.")
} }
} }