2 điểm bởi GN⁺ 2024-11-12 | 1 bình luận | Chia sẻ qua WhatsApp
  • IDHS là một ứng dụng web cho phép dán liên kết từ dịch vụ streaming vào ô tìm kiếm, rồi tìm và hiển thị liên kết của cùng bản nhạc đó trên các nền tảng khác được hỗ trợ; nếu liên kết gốc là Spotify thì còn có cả bản xem trước âm thanh nhanh
  • Hỗ trợ cho từng bản nhạc, album, nghệ sĩ, podcast riêng lẻ; playlist được nêu rõ là nằm ngoài phạm vi
  • Có các adapter cho Spotify, Tidal, YouTube Music, Apple Music, Deezer, SoundCloud, Qobuz, Bandcamp, Pandora, và mọi adapter đều hỗ trợ tìm kiếm đảo ngược cùng liên kết đã xác minh
  • Hệ thống được chia thành parser để trích xuất metadata từ liên kết đầu vào và adapter để tìm liên kết trên nền tảng đích; kết quả tìm kiếm không đảm bảo đó chính xác là track hay bài hát mong muốn
  • Để chạy cục bộ cần Bun và một số API key; riêng phần tìm kiếm Spotify tính đến tháng 3/2026 dùng GraphQL API nội bộ của Spotify Web Player cùng token tự làm mới do giới hạn của Web API Spotify

IDHS làm gì

  • IDHS (I Don't Have Spotify) cho phép người dùng sao chép liên kết từ dịch vụ streaming yêu thích và dán vào ô tìm kiếm để hiển thị liên kết của mục tương ứng trên các nền tảng khác được hỗ trợ
  • Nếu liên kết gốc là Spotify, ứng dụng cung cấp bản xem trước âm thanh nhanh để người dùng xác nhận đúng track
  • Phạm vi hỗ trợ là từng bản nhạc, album, nghệ sĩ, podcast riêng lẻ
    • Playlist nằm ngoài phạm vi hỗ trợ

Các dịch vụ streaming được hỗ trợ

  • Web App và Raycast Extension xử lý việc chuyển đổi liên kết giữa các dịch vụ streaming thông qua adapter
  • Các adapter được hỗ trợ gồm:
    • Spotify
    • Tidal
    • YouTube Music
    • Apple Music
    • Deezer
    • SoundCloud
    • Qobuz
    • Bandcamp
    • Pandora
  • Tất cả adapter đều hỗ trợ Inverted SearchVerified Links
  • Việc có dùng API chính thức hay không khác nhau tùy nền tảng
    • Dùng API chính thức: Tidal, Deezer
    • Không dùng API chính thức: Spotify, YouTube Music, Apple Music, SoundCloud, Qobuz, Bandcamp, Pandora

Cấu trúc parser và adapter

  • IDHS trích xuất metadata từ liên kết được cung cấp, rồi dựa trên thông tin đó tạo ra truy vấn tìm kiếm mới để dùng với công cụ tìm kiếm công khai hoặc API chính thức như Apple Music, YouTube, SoundCloud
  • Nó chọn mục có vẻ liên quan nhất trong kết quả tìm kiếm, nhưng không đảm bảo liên kết trả về chính xác là track hay bài hát mà người dùng muốn
  • Mọi đề xuất cải thiện quy trình tạo truy vấn tìm kiếm đều được hoan nghênh, nhưng có ràng buộc là loại trừ thử lại brute-force để giữ yêu cầu nhanh và tránh giới hạn tốc độ
  • Parsers src/parsers

    • Parser xác định nền tảng của liên kết đầu vào và trích xuất metadata đã được chuẩn hóa
    • tiêu đề
    • mô tả
    • loại
    • hình ảnh
    • âm thanh tùy chọn
    • truy vấn tìm kiếm nhất quán
    • Ví dụ, liên kết Spotify sẽ thu thập metadata Open Graph và tạo chuỗi tìm kiếm biểu diễn track, album, nghệ sĩ, show, episode
    • Truy vấn này sau đó được dùng để tìm kiếm trên các nền tảng khác
  • Adapters src/adapters

    • Adapter chuyển truy vấn tìm kiếm đã chuẩn hóa thành liên kết bên ngoài trên nền tảng đích
    • Mỗi adapter phụ trách:
    • thực hiện tìm kiếm theo nền tảng bằng truy vấn đã chuẩn hóa
    • cách tìm kiếm có thể dựa trên API hoặc HTML
    • trả về kết quả gồm các giá trị như type, url, isVerified, notAvailable
    • nếu nền tảng cung cấp tín hiệu đối sánh đáng tin cậy thì sẽ ưu tiên verified link
    • Sự tách biệt này giúp mô-đun hóa hệ thống để parser tập trung vào việc hiểu nguồn gốc, còn adapter tập trung vào việc tìm liên kết đích

Web App và Raycast Extension

  • README có kèm ví dụ màn hình của Web App
  • Có cung cấp liên kết cài đặt Raycast Extension
  • Mã nguồn của Raycast Extension nằm tại raycast/extensions no idonthavespotify

Chạy cục bộ và cấu hình API

  • Có thể xem danh sách biến môi trường trong .env.test
  • Các giá trị sau cần cấu hình riêng
  • Lệnh chạy ứng dụng như sau
bun install
bun dev
  • Để chạy cùng trình rút gọn URL, hãy thiết lập URL_SHORTENER_API_KEY bằng giá trị dùng trong docker-compose.yml, rồi dùng lệnh sau
docker compose up -d
bun install
bun dev

Cách xử lý tìm kiếm Spotify

  • Tìm kiếm Spotify không dùng Spotify Web API mà dùng anonymous access token được trích xuất từ Spotify Web Player trên open.spotify.com
  • Luồng xác thực dựa trên TOTP và sử dụng GraphQL API nội bộ mà Spotify Web Player dùng
  • README giải thích rằng tính đến tháng 3/2026, Spotify đã hạn chế Web API bằng cách yêu cầu tài khoản Premium trong Development Mode và giới hạn các endpoint khả dụng
  • Dự án này không có tài khoản Premium, nên sử dụng cùng API nội bộ như Spotify Web Player
  • Token tự động làm mới theo chu kỳ hết hạn khoảng 1 giờ và không cần tài khoản nhà phát triển

Đóng góp

  • Có thể đóng góp bằng cách mở PR

1 bình luận

 
GN⁺ 2024-11-12
Các ý kiến trên Hacker News
  • Cũng có một trang còn ấn tượng hơn, giúp chuyển playlist từ hơn 20 nền tảng, bao gồm Spotify, hoặc từ file văn bản sang hơn 20 nền tảng khác hoặc file văn bản
    Mong là mọi người đừng kéo vào đông quá làm sập nhé :)
    https://app.tunemymusic.com/transfer

    • Tôi đã dùng thử và nó hoạt động tốt. Chỉ tiếc là lại cần đến những thứ như thế này
      Ước gì có một định dạng nhập/xuất trung lập với nhà cung cấp, thay vì để bên thứ ba phải xử lý mọi tổ hợp tích hợp
    • Gần đây tôi chuyển từ Spotify sang Tidal, và dịch vụ chuyển đổi được gợi ý khá cẩu thả
      Tôi chuyển các nghệ sĩ đã đánh dấu yêu thích, nhưng nó chỉ cố khớp theo tên; nếu có từ hai người cùng tên trở lên thì thất bại thảm hại, gần như chọn ngẫu nhiên. Không biết dịch vụ này sẽ thế nào
    • Có ai biết cách kỹ thuật nào để khôi phục danh sách tiêu đề của các video đã bị xóa khỏi playlist YouTube không?
      Tôi có hơn 10 playlist đầy nhạc bị xóa vì các khiếu nại bản quyền không thỏa đáng, nhưng vì không biết tiêu đề/nghệ sĩ của các track đã bị xóa nên cũng không thể dựng lại playlist
    • Còn có cái này nữa: https://playlists.cloud/
    • Tôi thích TuneMyMusic. Khi rời Spotify, tôi đã xuất ra rồi nhập toàn bộ vào Deezer, và giờ thỉnh thoảng tôi xuất tất cả từ Deezer để phân tích đủ kiểu trong Excel
  • Tôi đã làm một extension Chrome rất đơn giản: khi mở link của dịch vụ nhạc khác, nó tự động redirect sang dịch vụ tôi thích
    Trường hợp của tôi đặt là YouTube Music, nên nếu bấm một link kiểu Spotify trong Slack thì nó sẽ chuyển sang YouTube Music
    https://chromewebstore.google.com/detail/music-link/gnhphofp...

    • Có bản Firefox không?
    • Những việc kiểu này khiến việc phát triển extension Chrome trở nên thú vị
    • Trông hay đấy, bạn map URL thủ công à?
  • Tôi muốn thực sự mua nhạc và tự lưu giữ. Vì tôi ngày càng thấy nhiều bài từng có trên Spotify biến mất
    Nhưng ngày nay mua nhạc rất khó. Phần lớn được phát hành dưới dạng single, và theo tôi biết thì dường như chỉ có trên các nền tảng streaming. Liệu hiện vẫn có cách nào để mua loại nhạc đang có trên các nền tảng streaming đó dưới dạng file audio thật không?

    • Cách “mua” nhạc bền vững nhất, theo cá nhân tôi, là lấy bằng sao chép lậu rồi ủng hộ nghệ sĩ bằng cách mua merch
      Hoặc mua trên Bandcamp nếu có thể
    • Sau khi chuyển sang một nước khác, tôi đổi thẻ tín dụng Spotify sang thẻ của nước mới, thế là Spotify cũng đổi luôn thiết lập khu vực của tôi
      Kết quả là rất nhiều bài tôi từng “đánh dấu sao”/“thêm”/“thích” bị chuyển sang màu xám và không phát được nữa. Dù sao, nếu nói đến chuyện thực sự có bản sao của nhạc mình nghe, tôi nghĩ cứ sao chép lậu hẳn, không cần thấy xấu hổ chút nào
    • Tôi cũng làm vậy, và ở Canada thì https://ca.7digital.com/ gần như là lựa chọn duy nhất cho phép mua MP3 thông thường, tôi rất khuyên dùng
      Tôi mua được các album mới không vấn đề gì, nhưng các single mới thì không chắc. Ở Mỹ, có vẻ Amazon cho phép mua MP3, nhưng tôi không chắc
      Với số tiền tương đương phí thuê bao Spotify, thường mỗi tháng có thể mua một album mới, khá ổn; tôi thích việc bộ sưu tập album của mình tăng lên từ từ
    • Bandcamp, 7Digital, và thật sự bất đắc dĩ thì Amazon. Nhãn càng lớn thì càng khó mua nhạc số
    • Hãy xem Qobuz. Trước hết, ở đó chỉ có nhạc lossless, không có MP3
      Đã gần 25 năm kể từ khi bước sang thế kỷ 21 rồi; thời Napster phải stream MP3 đã qua
      Trên Qobuz cũng thường có các album chất lượng cao hơn stereo 44.1 kHz / 16-bit. Có thể bạn không nghe ra khác biệt, nhưng nếu nghệ sĩ/kỹ sư âm thanh quan tâm đến mức cung cấp tần số lấy mẫu hoặc độ sâu bit cao hơn, thì thường điều đó cũng có nghĩa là họ quan tâm đến việc làm ra âm nhạc có âm thanh hay
      Qobuz làm đúng thứ bạn muốn. Bạn có thể mua và tải xuống từng track riêng lẻ hoặc cả album, và không có DRM
      Tôi cũng có một bộ sưu tập file audio rip từ CD mình mua theo cách 100% bit-perfect/lossless, đồng thời dùng cả thuê bao Qobuz. Kết quả rip đã được kiểm chứng bằng DB online của những người rip cùng CD
      Nhược điểm của Qobuz là tính năng khám phá nhạc không phải tốt nhất, và UI cũng khá tệ. Dù vậy, nó tốt cho những ai coi trọng chất lượng và muốn sở hữu nhạc của mình
      Ngày nay hầu hết thiết bị streaming qua mạng đều hỗ trợ Qobuz. Ví dụ tôi dùng ampli Yamaha có tích hợp network streamer (Yamaha R-N1000A), và ứng dụng streaming nhạc của Yamaha là MusicCast cũng hỗ trợ Qobuz, Tidal, Spotify
      Thay vì thuê quyền truy cập tạm thời vào một dịch vụ online có thể biến mất dưới chân bạn hoặc gỡ bài bạn đang nghe, bạn có thể thực sự mua và sở hữu từng track riêng lẻ
      Cứ xem các gói giá là được. Tùy số lượng bài bạn mua, gói phù hợp hơn có thể khác nhau
      Theo tôi hiểu, Spotify cũng đã thông báo rằng dưới áp lực từ Tidal và Qobuz, họ sẽ chuyển sang streaming lossless. Mãi đến năm 2024 mới cuối cùng
  • Với hai bài đầu tiên thử, việc khớp trên YouTube Music đã thất bại
    Two Words của Kanye West: https://open.spotify.com/track/62wtttQzoIA9HnNmGVd9Yq?si=b1b...
    Lại dẫn tới Two Words của Milabel Ranque: https://music.youtube.com/watch?v=Y64cFG9dfYo
    Never Let Me Down của Kanye West: https://open.spotify.com/track/34j4OxJxKznBs88cjSL2j9?si=7ec...
    Lại dẫn tới Never Let me Down của Depeche Mode: https://music.youtube.com/watch?v=snILjFUkk_A
    Dù trên trang hiện đúng ảnh bìa album vẫn bị như vậy. Thực tế không có bài nào tôi thử đưa vào hoạt động đúng cả. Vốn dĩ nó là thế à? Có phải nó tìm các bài có tiêu đề tương tự không?

  • Tôi thường xuyên nhận liên kết Spotify nên cái này hay đấy. Liên kết tốt hơn sẽ là trang dịch vụ thực tế chứ không phải kho GitHub
    https://idonthavespotify.donado.co/
    Nếu có cả extension cho người dùng Firefox thì thật sự rất tuyệt. Hy vọng một ngày nào đó có ai đó làm

    • Nếu dễ biết tham số id trên trang kết quả đến từ đâu, có lẽ cũng có thể làm thành bookmarklet
      Tôi đoán nó giống như một hash đơn giản của liên kết
    • Vì sao bạn lại nhận liên kết Spotify thường xuyên như vậy?
  • Khi tạo một trang có liên kết tới nhiều nhà cung cấp nhạc, tôi dùng trang này: https://odesli.co
    Hoạt động theo nghệ sĩ, album và bài hát
    Nếu đăng nhập thì có thể tùy chỉnh URL
    Tôi chỉ là người dùng, không có lợi ích liên quan

    • Tôi cũng rất thích Songlink/Odesli. Tìm kiếm của nó còn chạy nhanh hơn tìm kiếm của Spotify hay Apple Music
    • 5 năm trước tôi đã làm một bot Discord dùng songlinks API
      Tiếc là không được dùng nhiều và giờ không còn bảo trì nữa
    • Cũng có tích hợp Slack: /songlink {url}
  • Một trong những tính năng tốt nhất có được từ NAS là có thể lưu nhạc trên đó và stream tới điện thoại
    Tôi thích mua một phần nhạc và tự lưu trữ hơn là phụ thuộc vào dịch vụ thuê bao

    • Bạn có thể chia sẻ cấu hình nào bạn đang dùng hoặc khuyên dùng cho cả NAS lẫn phần mềm stream tới điện thoại không?
  • Trước đây khi bảo trì bot nhạc Discord, tôi stream từ YouTube
    Để URL Spotify hoạt động, việc tìm kiếm trên YouTube phải khớp ổn định; một mẹo rất hiệu quả là đưa cả URL Spotify vào truy vấn tìm kiếm YouTube cùng với tên bài hát, tên nghệ sĩ, v.v.
    Mô tả của video YouTube chính thức thường có liên kết Spotify, và vì tìm kiếm YouTube khớp cả phần mô tả nên cách này khá hữu ích để chọn ra video “chính thức”

  • Dịch vụ này liên kết thêm được vài dịch vụ nữa, nhưng không thể chỉ dán URL hiện có vào: https://odesli.co/
    Nó gần giống kiểu dịch vụ linktree hơn, nhưng có thể tìm bài hát và album nên dễ tìm
    Ví dụ: https://song.link/i/1051394215