# DVC Broker Sites — registry
# pagination.type: query_param | link_selector | infinite_scroll | none
# requires_js: true => Playwright; false => httpx/selectolax

- name: dvc-resale-market
  start_urls: ["https://www.dvcresalemarket.com/listings/"]
  pagination: { type: "query_param", param: "page", start: 1, max_pages: 150 }
  requires_js: true
  throttle: { delay_ms: 1200, max_concurrent: 2 }
  selectors:
    item: ".listing-card, article.listing, .card"
    title: ".listing-title::text, h2::text"
    price: ".listing-price::text, .price::text"
    points: ".listing-points::text, .points::text"
    resort: ".listing-resort::text, .resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text, .badge::text"
    link: "a[href*='listing'], a.card::attr(href)"
    images: "img::attr(src)"

- name: fidelity-real-estate
  start_urls: ["https://www.fidelityrealestate.com/brand/disney-vacation-club/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 150 }
  requires_js: true
  throttle: { delay_ms: 1500, max_concurrent: 2 }
  selectors:
    item: ".property, .listing, .result"
    title: ".title::text, h3::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".community::text, .resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: dvc-store
  start_urls: ["https://www.dvcstore.com/dvc-listings.cfm"]
  pagination: { type: "link_selector", selector: "a.next, a[rel='next']" }
  requires_js: false
  throttle: { delay_ms: 1000, max_concurrent: 2 }
  selectors:
    item: "table tr"
    title: "td:nth-child(1)::text"
    price: "td:nth-child(5)::text"
    points: "td:nth-child(2)::text"
    resort: "td:nth-child(1)::text"
    beds: null
    baths: null
    status: "td:nth-child(9)::text, .status::text"
    link: "a::attr(href)"
    images: null

- name: dvc-magic-resales
  start_urls: ["https://www.dvcmagicresales.com/listings"]
  pagination: { type: "query_param", param: "page", start: 1, max_pages: 120 }
  requires_js: true
  throttle: { delay_ms: 1300, max_concurrent: 2 }
  selectors:
    item: ".listing, .card"
    title: ".title::text, h3::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: resales-dvc
  start_urls: ["https://www.resalesdvc.com/listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 120 }
  requires_js: true
  throttle: { delay_ms: 1200, max_concurrent: 2 }
  selectors:
    item: ".listing, article, .card"
    title: ".title::text, h2::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: dvc-by-resale
  start_urls: ["https://dvcbyresale.com/listings/"]
  pagination: { type: "link_selector", selector: "a.next, a[rel='next']" }
  requires_js: true
  throttle: { delay_ms: 1600, max_concurrent: 1 }
  selectors:
    item: ".listing, .post, .card"
    title: ".title::text, h2::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: dvc-shop-resales
  start_urls: ["https://resales.dvcshop.com/listings/", "https://www.dvcshop.com/dvc-resales/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 150 }
  requires_js: true
  throttle: { delay_ms: 1200, max_concurrent: 2 }
  selectors:
    item: ".listing, .card"
    title: ".listing-title::text, .title::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: vacation-club-life
  start_urls: ["https://vacationclublife.com/listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 150 }
  requires_js: true
  throttle: { delay_ms: 1400, max_concurrent: 2 }
  selectors:
    item: "table tr, .listing"
    title: "td:nth-child(1)::text, .title::text"
    price: "td:nth-child(6)::text, .price::text"
    points: "td:nth-child(2)::text, .points::text"
    resort: "td:nth-child(1)::text, .resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: "td:nth-child(9)::text, .status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: garden-views-realty
  start_urls: ["https://gardenviewsrealty.com/listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 120 }
  requires_js: true
  throttle: { delay_ms: 1400, max_concurrent: 2 }
  selectors:
    item: ".listing, article, .card"
    title: ".title::text, h2::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: dvc-resales-by-jaki
  start_urls: ["https://dvclisting.com/listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 80 }
  requires_js: true
  throttle: { delay_ms: 1500, max_concurrent: 1 }
  selectors:
    item: ".listing, .card"
    title: ".title::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: dvc-sales
  start_urls: ["https://dvcsales.com/dvc-resale-listings"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 150 }
  requires_js: true
  throttle: { delay_ms: 1400, max_concurrent: 2 }
  selectors:
    item: ".listing, .result"
    title: ".title::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: dvc-resale-experts
  start_urls: ["https://www.dvcresaleexperts.com/dvc-resale-experts-listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 150 }
  requires_js: true
  throttle: { delay_ms: 1400, max_concurrent: 2 }
  selectors:
    item: ".listing, .card"
    title: ".title::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: dvc-dreams-resales
  start_urls: ["https://www.dvcdreams.com/resales/"]
  pagination: { type: "query_param", param: "page", start: 1, max_pages: 80 }
  requires_js: true
  throttle: { delay_ms: 1600, max_concurrent: 1 }
  selectors:
    item: ".listing, .post, .card"
    title: ".title::text, h2::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: buy-and-sell-dvc
  start_urls: ["https://buyandselldvc.com/listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 80 }
  requires_js: true
  throttle: { delay_ms: 1600, max_concurrent: 1 }
  selectors:
    item: ".listing, .card"
    title: ".title::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: timeshare-broker-sales
  start_urls: ["https://www.timesharebrokersales.com/disney-vacation-club/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 80 }
  requires_js: true
  throttle: { delay_ms: 1500, max_concurrent: 1 }
  selectors:
    item: ".listing, article, .property"
    title: ".title::text, h2::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: resort-dvc-resales
  start_urls: ["https://resortdvcresales.com/listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 80 }
  requires_js: true
  throttle: { delay_ms: 1500, max_concurrent: 1 }
  selectors:
    item: ".listing, .card"
    title: ".title::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"

- name: magical-dvc-resales
  start_urls: ["https://magicaldvcresales.com/listings/"]
  pagination: { type: "query_param", param: "pg", start: 1, max_pages: 80 }
  requires_js: true
  throttle: { delay_ms: 1600, max_concurrent: 1 }
  selectors:
    item: ".listing, .card"
    title: ".title::text"
    price: ".price::text"
    points: ".points::text"
    resort: ".resort::text"
    beds: ".beds::text"
    baths: ".baths::text"
    status: ".status::text"
    link: "a::attr(href)"
    images: "img::attr(src)"
