Alex Balgavy

Just some stuff about me.

Here's my dotfiles repository.

Check out my blog.

My keys: PGP, SSH

My crypto wallets (BTC, XMR)


What links here:

Sorting phones supported by LineageOS

I want to figure out which phone to get that’s supported by LineageOS, depending on its features.

Retrieve data:

printf '' > /tmp/devicelist.html
curl -sL https://wiki.lineageos.org/devices/ \
  | pup 'div.devices a attr{href}' \
  | sed 's!^!https://wiki.lineageos.org!' \
  | sort -u \
  | while read -r device; do
  printf "Processing: %s\n" "$device"
  curl -sL "$device" | pup 'table.deviceinfo' >> /tmp/devicelist.html
done

Parse:

require "nokogiri"

doc = Nokogiri::HTML(File.read("/tmp/devicelist.html"))

def filter_phones(doc, release_year)
  devs = doc.css("table:has(td:contains(' #{release_year}'))")
  # I want a minimum of 128 gb
  enough_storage = devs.select { |dev| dev.css("th:contains(\"Storage\")+td:contains(\"128\")").length > 0 }
  # I also want a card slot
  has_card = enough_storage.select { |dev| dev.css("th:contains(\"SD \")").length > 0 }
  models = has_card
    .map do |dev|
      devname = dev.css("tbody tr:first-child").text.strip
      codename = devname.scan(/\(([^\)]*)\)/)[0][0]
      [devname, codename]
    end
    .map { |(devname, codename)| "- [[https://wiki.lineageos.org/devices/#{codename}][#{devname}]]" }
  return models
end

# Latest releases
puts("<details>\n<summary>Current output</summary>")
in2025 = filter_phones(doc, 2025)
puts("2025:\n#{in2025.join("\n")}") unless in2025.empty?
in2024 = filter_phones(doc, 2024)
puts("2024:\n#{in2024.join("\n")}") unless in2024.empty?
in2023 = filter_phones(doc, 2023)
puts("2023:\n#{in2023.join("\n")}") unless in2023.empty?
in2022 = filter_phones(doc, 2022)
puts("2022:\n#{in2022.join("\n")}") unless in2022.empty?
in2021 = filter_phones(doc, 2021)
puts("2021:\n#{in2021.join("\n")}") unless in2021.empty?
in2020 = filter_phones(doc, 2020)
puts("2020:\n#{in2020.join("\n")}") unless in2020.empty?
in2019 = filter_phones(doc, 2019)
puts("2019:\n#{in2019.join("\n")}") unless in2019.empty?
puts("</details>")
Current output 2024:

2023:

2022:

2021:

2020:

2019:

Current output 2024:

2023:

2022:

2021:

2020:

2019:

Current output 2024:

2023:

2022:

2021:

2020:

2019:

Current output 2024:

2023:

2022:

2021:

2020:

2019:

nil