A lightweight Apple Music client for Windows, built with MusicKit JS, Edge WebView2 and React.

Overview

Lito Music
Lito Music

GitHub release (latest SemVer)

English | 中文

Lito (/laɪto/) Music is a lightweight Apple Music client for Windows, built with MusicKit JS, Edge WebView2 and React.

System requirements

  • OS version ≥ Windows 10.
  • Edge WebView2 runtime (pre-installed in Windows 10 Insider Preview and Windows 11).
    If not installed, Lito Music will try to download and install it at the first launch.

Downloads

NOTE: Windows Defender might say the pre-compiled binary is a malware. It's just a false positive. Code signing could solve this issue; however, the price is not friendly to an open source developer. If you are concerned about it, please feel free to build it on your own machine.

Pre-compiled binaries are available here.

Features

Listen now

Lito Music (listen now)

Time-synced lyrics

Lito Music (lyrics)

Build

Rust and Node.js are required.

npm install
npm run build
Comments
  • After successful login, the interface is blank

    After successful login, the interface is blank

    After successful login, the interface is blank.

    lito version: v0.1.0.0-beta.3 Windows version: 21H2 Pro Apple ID location: Hong Kong

    GET https://app.example/components/musickit-components/locales/zh-cn/translations.json net::ERR_ABORTED 404 (Not Found)
    loadTranslations @ p-6b1b37da.js:1
    initialize @ p-6b1b37da.js:1
    k @ p-6b1b37da.js:1
    componentWillLoad @ p-21c59437.entry.js:1
    r @ p-1ef6431f.js:1
    e.componentWillLoad @ p-1ef6431f.js:1
    async function(异步)
    e.componentWillLoad @ p-1ef6431f.js:1
    ne @ p-a23b3d3a.js:461
    K @ p-a23b3d3a.js:342
    (匿名) @ p-a23b3d3a.js:334
    ke @ p-a23b3d3a.js:707
    ve @ p-a23b3d3a.js:714
    requestAnimationFrame(异步)
    raf @ p-a23b3d3a.js:17
    (匿名) @ p-a23b3d3a.js:702
    J @ p-a23b3d3a.js:334
    i @ p-a23b3d3a.js:638
    (匿名) @ p-a23b3d3a.js:639
    async function(异步)
    (匿名) @ p-a23b3d3a.js:611
    (匿名) @ p-a23b3d3a.js:640
    (匿名) @ p-a23b3d3a.js:644
    jmp @ p-a23b3d3a.js:16
    connectedCallback @ p-a23b3d3a.js:577
    (匿名) @ p-a23b3d3a.js:669
    re @ p-a23b3d3a.js:669
    (匿名) @ musickit-components.esm.js:12
    Promise.then(异步)
    (匿名) @ musickit-components.esm.js:11
    p-6b1b37da.js:1 GET https://app.example/components/musickit-components/locales/en/translations.json net::ERR_ABORTED 404 (Not Found)
    loadTranslations @ p-6b1b37da.js:1
    async function(异步)
    loadTranslations @ p-6b1b37da.js:1
    initialize @ p-6b1b37da.js:1
    k @ p-6b1b37da.js:1
    componentWillLoad @ p-21c59437.entry.js:1
    r @ p-1ef6431f.js:1
    e.componentWillLoad @ p-1ef6431f.js:1
    async function(异步)
    e.componentWillLoad @ p-1ef6431f.js:1
    ne @ p-a23b3d3a.js:461
    K @ p-a23b3d3a.js:342
    (匿名) @ p-a23b3d3a.js:334
    ke @ p-a23b3d3a.js:707
    ve @ p-a23b3d3a.js:714
    requestAnimationFrame(异步)
    raf @ p-a23b3d3a.js:17
    (匿名) @ p-a23b3d3a.js:702
    J @ p-a23b3d3a.js:334
    i @ p-a23b3d3a.js:638
    (匿名) @ p-a23b3d3a.js:639
    async function(异步)
    (匿名) @ p-a23b3d3a.js:611
    (匿名) @ p-a23b3d3a.js:640
    (匿名) @ p-a23b3d3a.js:644
    jmp @ p-a23b3d3a.js:16
    connectedCallback @ p-a23b3d3a.js:577
    (匿名) @ p-a23b3d3a.js:669
    re @ p-a23b3d3a.js:669
    (匿名) @ musickit-components.esm.js:12
    Promise.then(异步)
    (匿名) @ musickit-components.esm.js:11
    p-6b1b37da.js:1 GET https://app.example/components/musickit-components/locales/en-gb/translations.json net::ERR_ABORTED 404 (Not Found)
    loadTranslations @ p-6b1b37da.js:1
    async function(异步)
    loadTranslations @ p-6b1b37da.js:1
    initialize @ p-6b1b37da.js:1
    k @ p-6b1b37da.js:1
    componentWillLoad @ p-21c59437.entry.js:1
    r @ p-1ef6431f.js:1
    e.componentWillLoad @ p-1ef6431f.js:1
    async function(异步)
    e.componentWillLoad @ p-1ef6431f.js:1
    ne @ p-a23b3d3a.js:461
    K @ p-a23b3d3a.js:342
    (匿名) @ p-a23b3d3a.js:334
    ke @ p-a23b3d3a.js:707
    ve @ p-a23b3d3a.js:714
    requestAnimationFrame(异步)
    raf @ p-a23b3d3a.js:17
    (匿名) @ p-a23b3d3a.js:702
    J @ p-a23b3d3a.js:334
    i @ p-a23b3d3a.js:638
    (匿名) @ p-a23b3d3a.js:639
    async function(异步)
    (匿名) @ p-a23b3d3a.js:611
    (匿名) @ p-a23b3d3a.js:640
    (匿名) @ p-a23b3d3a.js:644
    jmp @ p-a23b3d3a.js:16
    connectedCallback @ p-a23b3d3a.js:577
    (匿名) @ p-a23b3d3a.js:669
    re @ p-a23b3d3a.js:669
    (匿名) @ musickit-components.esm.js:12
    Promise.then(异步)
    (匿名) @ musickit-components.esm.js:11
    p-6b1b37da.js:1 GET https://app.example/components/musickit-components/locales/en-us/translations.json net::ERR_ABORTED 404 (Not Found)
    loadTranslations @ p-6b1b37da.js:1
    async function(异步)
    loadTranslations @ p-6b1b37da.js:1
    initialize @ p-6b1b37da.js:1
    k @ p-6b1b37da.js:1
    componentWillLoad @ p-21c59437.entry.js:1
    r @ p-1ef6431f.js:1
    e.componentWillLoad @ p-1ef6431f.js:1
    async function(异步)
    e.componentWillLoad @ p-1ef6431f.js:1
    ne @ p-a23b3d3a.js:461
    K @ p-a23b3d3a.js:342
    (匿名) @ p-a23b3d3a.js:334
    ke @ p-a23b3d3a.js:707
    ve @ p-a23b3d3a.js:714
    requestAnimationFrame(异步)
    raf @ p-a23b3d3a.js:17
    (匿名) @ p-a23b3d3a.js:702
    J @ p-a23b3d3a.js:334
    i @ p-a23b3d3a.js:638
    (匿名) @ p-a23b3d3a.js:639
    async function(异步)
    (匿名) @ p-a23b3d3a.js:611
    (匿名) @ p-a23b3d3a.js:640
    (匿名) @ p-a23b3d3a.js:644
    jmp @ p-a23b3d3a.js:16
    connectedCallback @ p-a23b3d3a.js:577
    (匿名) @ p-a23b3d3a.js:669
    re @ p-a23b3d3a.js:669
    (匿名) @ musickit-components.esm.js:12
    Promise.then(异步)
    (匿名) @ musickit-components.esm.js:11
    6[Violation]Added non-passive event listener to a scroll-blocking <某些> 事件. Consider marking event handler as 'passive' to make the page more responsive. See <URL>
    
    p-6b1b37da.js:1 GET https://app.example/components/musickit-components/locales/en-gb/translations.json 404 (Not Found)
    loadTranslations @ p-6b1b37da.js:1
    async function(异步)
    loadTranslations @ p-6b1b37da.js:1
    initialize @ p-6b1b37da.js:1
    k @ p-6b1b37da.js:1
    componentWillLoad @ p-21c59437.entry.js:1
    r @ p-1ef6431f.js:1
    e.componentWillLoad @ p-1ef6431f.js:1
    async function(异步)
    e.componentWillLoad @ p-1ef6431f.js:1
    ne @ p-a23b3d3a.js:461
    K @ p-a23b3d3a.js:342
    (匿名) @ p-a23b3d3a.js:334
    ke @ p-a23b3d3a.js:707
    ve @ p-a23b3d3a.js:714
    requestAnimationFrame(异步)
    raf @ p-a23b3d3a.js:17
    (匿名) @ p-a23b3d3a.js:702
    J @ p-a23b3d3a.js:334
    i @ p-a23b3d3a.js:638
    (匿名) @ p-a23b3d3a.js:639
    async function(异步)
    (匿名) @ p-a23b3d3a.js:611
    (匿名) @ p-a23b3d3a.js:640
    (匿名) @ p-a23b3d3a.js:644
    jmp @ p-a23b3d3a.js:16
    connectedCallback @ p-a23b3d3a.js:577
    (匿名) @ p-a23b3d3a.js:669
    re @ p-a23b3d3a.js:669
    (匿名) @ musickit-components.esm.js:12
    Promise.then(异步)
    (匿名) @ musickit-components.esm.js:11
    2vendor.70de7908.js:27 TypeError: Cannot read properties of undefined (reading 'url')
        at L (index.5c77e547.js:75)
        at Hi (vendor.70de7908.js:27)
        at Nu (vendor.70de7908.js:27)
        at ps (vendor.70de7908.js:27)
        at fs (vendor.70de7908.js:27)
        at cs (vendor.70de7908.js:27)
        at ns (vendor.70de7908.js:27)
        at vendor.70de7908.js:27
        at e.unstable_runWithPriority (vendor.70de7908.js:18)
        at Ta (vendor.70de7908.js:27)
    ql @ vendor.70de7908.js:27
    Yl.n.callback @ vendor.70de7908.js:27
    Ja @ vendor.70de7908.js:27
    eu @ vendor.70de7908.js:27
    vs @ vendor.70de7908.js:27
    e.unstable_runWithPriority @ vendor.70de7908.js:18
    Ta @ vendor.70de7908.js:27
    gs @ vendor.70de7908.js:27
    ns @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    e.unstable_runWithPriority @ vendor.70de7908.js:18
    Ta @ vendor.70de7908.js:27
    ja @ vendor.70de7908.js:27
    Ra @ vendor.70de7908.js:27
    Xu @ vendor.70de7908.js:27
    hl @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    e.setState @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    Promise.then(异步)
    e._run @ vendor.70de7908.js:27
    e.run @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    ks @ vendor.70de7908.js:27
    e.unstable_runWithPriority @ vendor.70de7908.js:18
    Ta @ vendor.70de7908.js:27
    ys @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    I @ vendor.70de7908.js:18
    b.port1.onmessage @ vendor.70de7908.js:18
    index.html#/:1 [Intervention]Images loaded lazily and replaced with placeholders. Load events are deferred. See https://go.microsoft.com/fwlink/?linkid=2048113
    vendor.70de7908.js:27 TypeError: Cannot read properties of undefined (reading 'url')
        at L (index.5c77e547.js:75)
        at Hi (vendor.70de7908.js:27)
        at Nu (vendor.70de7908.js:27)
        at ps (vendor.70de7908.js:27)
        at fs (vendor.70de7908.js:27)
        at cs (vendor.70de7908.js:27)
        at ns (vendor.70de7908.js:27)
        at vendor.70de7908.js:27
        at e.unstable_runWithPriority (vendor.70de7908.js:18)
        at Ta (vendor.70de7908.js:27)
    (匿名) @ vendor.70de7908.js:27
    Promise.catch(异步)
    e._run @ vendor.70de7908.js:27
    e.run @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    ks @ vendor.70de7908.js:27
    e.unstable_runWithPriority @ vendor.70de7908.js:18
    Ta @ vendor.70de7908.js:27
    ys @ vendor.70de7908.js:27
    (匿名) @ vendor.70de7908.js:27
    I @ vendor.70de7908.js:18
    b.port1.onmessage @ vendor.70de7908.js:18
    index.html#/:1 Uncaught (in promise) useRequest has caught the exception, if you need to handle the exception yourself, you can set options.throwOnError to true.
    

    image

    image

    bug 
    opened by hu3rror 5
  • Failed to control while using secondary screen

    Failed to control while using secondary screen

    windows 10 pro 20h2, laptop screen as secondary and external screen as main, unable to control (press the buttons or minimize the window) on secondary screen, but everything is ok when it's on main screen.

    bug 
    opened by zisen123 4
  • [issue] Unable to load lyrics 404

    [issue] Unable to load lyrics 404

    musickit.js:15918

       GET https://amp-api.music.apple.com/v1/catalog/cn/songs/1460622491/lyrics 404
    

    image

    I'm using HK Apple Music, but the loading of lyrics seems to be in CN area, I'm not sure if this is the reason

    Logs: app.example-1632657282153.log

    bug 
    opened by hu3rror 3
  •  Module '

    Module '"E:/LitoMusic/token"' has no exported member 'developerToken'.

    On building from source, I get this error:

    
    3 import { developerToken } from '../../../../token.json'
               ~~~~~~~~~~~~~~
    
    
    Found 1 error.```
    
    Hence unable to build app.
    
    When I use a pre-built release, I just get a white screen. Nothing else.
    opened by aryanshb 2
  • [Issue] Error: artwork not found in resource.

    [Issue] Error: artwork not found in resource.

    The "attributes" of specific recommendation item contains "editorialArtwork" instead of "artwork", causing errors. Maybe we should make a fallback artwork as cover or simply hide it?

    {"type":"editorial-items","id":"159327154","_mjs":{"attributes":["link","url","editorialNotes","editorialArtwork"],"relationships":[],"views":[],"parents":[{"relationshipName":"contents","parentType":"personal-recommendation","parentId":"15-5GrOZD8bmJIYIjnWuW8nIG","position":0}]},"_meta":{"editorialCard":"emc.751f218d31cd4da0a36c1b022d1b60fc"},"link":{"url":"https://replay.music.apple.com/","target":"external"},"url":"https://replay.music.apple.com/","editorialNotes":{"name":"音乐回忆 2021","standard":"在这里重温你 2021 年的最爱曲目。","short":"在这里重温你 2021 年的最爱曲目。","tagline":"个人专属推荐"},"editorialArtwork":{"superHeroWide":{"width":4320,"url":"https://is5-ssl.mzstatic.com/image/thumb/Features126/v4/a2/b9/0b/a2b90bc6-498b-f288-81e8-aabb0e8ea50f/U0hXLU1TLUNITi1SRVBMQVlfMjAyMS1BREFNX0lEPTE1OTMyNzE1NDYtbGFuZz16aF9IYW5zX0NOLnBuZw.png/{w}x{h}sr.jpg","height":1800,"textColor3":"45395c","textColor2":"1d2149","textColor4":"3f4365","textColor1":"23173e","bgColor":"f5f1e9","hasP3":false},"superHeroTall":{"width":1680,"url":"https://is4-ssl.mzstatic.com/image/thumb/Features116/v4/ad/77/02/ad77026f-5d7a-c22c-2eb4-fa5daac9a886/U0hULU1TLUNITi1SRVBMQVlfMjAyMS1BREFNX0lEPTE1OTMyNzE1NDYtbGFuZz16aF9IYW5zX0NOLnBuZw.png/{w}x{h}sr.jpg","height":2240,"textColor3":"3b305b","textColor2":"391b39","textColor4":"593d57","textColor1":"190e3d","bgColor":"f5f1e9","hasP3":false}}}
    
    bug 
    opened by lx200916 1
  • Bug: Sections failed to load

    Bug: Sections failed to load

    Lito is the only 3rd-party Apple Music app for macOS that worked at all in my tests. 🥳 🎉

    • the musi.sh site didn't play anything, even though it looks very pretty
    • "Apple Music Electron" didn't have any windows when it opened, and didn't allow me to open a window.

    So Lito is awesome! However, I discovered some bugs. The screenshots say it all:

    image

    image

    image

    Since the Artist Interviews section appears in two places, it is no surprise that it fails in both. I included both screenshots just to confirm that it failed in both places.

    I'm on an 11' MacBook Air, the first generation with the Apple M1 processor (M1, 2020) with 16 GB of RAM, running macOS 11.4 (20F71).

    duplicate 
    opened by brandondrew 1
  • [Feature] Search & Album Playlist

    [Feature] Search & Album Playlist

    1. It would be great if Search Feature is added.
    2. Hopefully I can get details(list of tracks or other info) when I choose a pic of album instead of just playing the album.
    enhancement 
    opened by lx200916 0
  • Feature Request: play music on HomePods

    Feature Request: play music on HomePods

    Although Lito is really awesome, I really want an app that can control playing music on a HomePod. iTunes can do that but I don't like the way it works, and it is very heavyweight.

    enhancement 
    opened by brandondrew 2
  • UI enhancement

    UI enhancement

    Window controls (Windows only)

    • [ ] Hover / active state.
    • [ ] Dark mode. (Specifically when lyrics are shown.)

    Lyrics

    • [ ] Auto detect light / dark mode for window controls.
    • [ ] Smooth scrolling using transforms.
    enhancement 
    opened by lujjjh 0
  • [Winodws,Feature]Add New Ways to Swipe Long Horizontal List( Recently Played for example)

    [Winodws,Feature]Add New Ways to Swipe Long Horizontal List( Recently Played for example)

    image

    Now I can only swipe by Touchpad when horizontal list beyond the window.Should add a button to swipe the list. 当前只能通过滑动触摸板手势来滑动超出窗口长度的长列表,可以考虑加个按钮或拖动手势来操作嘛😁

    enhancement 
    opened by lx200916 1
Releases(v0.1.0.0-beta.14)
Owner
Jiahao Lu
Write cool things.
Jiahao Lu
React UI Components for macOS High Sierra and Windows 10

React UI Components for macOS High Sierra and Windows 10. npm install react-desktop --save Help wanted! I am looking for developers to help me develop

Gabriel Bull 9.4k Dec 24, 2022
Windows notepad in web with additional features! Made with typescript and react.

Notepad Windows notepad in web with additional features! ?? Table of Contents ?? About Why I created ? Helpful for ? Who can contribute ? ?? Getting S

Muhammed Rahif 22 Jan 3, 2023
High performance personalization & a/b testing example using Next.js, Edge Middleware, and Builder.io

Next.js + Builder.io Personalization & A/B Testing with Edge Middleware This is a fork of Next.js Commerce with Builder.io integrated and using Edge M

Builder.io 25 Dec 25, 2022
React Native & Expo music player application UI

Would you like to support me? Musicont React Native & Expo music player application UI Demo: https://expo.io/@jsxclan/musicont APK: Download on Google

JSX Clan 82 Dec 14, 2022
Clone da GUI do Windows 11 desenvolvida utilizando ReactJS, NextJS, MaterialUI e ReactDND.

Vídeo demonstração Iniciando a execução: npm run dev Frameworks & Bibliotecas: React.js - uma biblioteca JavaScript para a criação de interfaces de us

nicolle 101 Dec 19, 2022
Twitter-client - client for twitter-clone

Twitter (Client-Side Rendering) Please star this repo if you like ⭐ It's motivates me a lot! Getting Started This project was bootstrapped with Create

Ruslan Shvetsov 3 Jul 29, 2022
A web application to search all the different countries in the world and get details about them which can include languages, currencies, population, domain e.t.c This application is built with CSS, React, Redux-Toolkit and React-Router.

A web application to search all the different countries in the world and get details about them which can include languages, currencies, population, domain e.t.c This application is built with CSS, React, Redux-Toolkit and React-Router. It also includes a theme switcher from light to dark mode.

Franklin Okolie 4 Jun 5, 2022
Simple React Social Network, built with React,Node,Express,MongoDB and Tailwind

Full stack react social network application A mini social network application built with React,Typescript, Redux, Node, Express, MongoDB, and Tailwind

Albenis Kërqeli 31 Dec 19, 2022
Developer Dao FM is where you can chill and listen to Lofi music while building cool stuff!

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Developer DAO 9 Jul 21, 2022
Recoil is an experimental state management library for React apps. It provides several capabilities that are difficult to achieve with React alone, while being compatible with the newest features of React.

Recoil · Recoil is an experimental set of utilities for state management with React. Please see the website: https://recoiljs.org Installation The Rec

Facebook Experimental 18.2k Jan 8, 2023
HTML CSS & React - Client side dynamic e-commerce website (stripe integrated)

Furniture E-Commerce Project Description React front-end full operating dynamic and responsive E-Commerce shop including payment connection (stripe) B

Almog Wertzberger 15 Dec 27, 2022
A basic React/NextJS project showing how to use the Flow Client Library (FCL)

How to use the Flow Client Library (FCL) with SvelteKit Everything you need to build a SvelteKit project with the Flow Client Library (FCL). For a Sve

Andrea Muttoni 19 Sep 24, 2022
A lightweight package to easily track window size in React.js

useWindowSizes - a custom React hook A lightweight package to easily track window width & height in React.js Comes in handy for responsize design and

Harry Fox 3 Feb 3, 2022
A lightweight (1.7 kB) package to easily track mouse position in React.js

useMousePosition - a custom React hook A lightweight (1.7 kB) package to easily track mouse position in React.js Install npm install react-use-mouse-p

Harry Fox 17 Dec 1, 2022
Chat Loop is a highly scalable, low-cost, and high performant chat application built on AWS and React leveraging GraphQL subscriptions for real-time communication.

Chat Loop Chat Loop is a highly scalable, low cost and high performant chat application built on AWS and React leveraging GraphQL subscriptions for re

Smile Gupta 24 Jun 20, 2022
A portfolio built in React and NextJS. Simple, clean, and fast.

Personal Portfolio A portfolio built in React and NextJS. Simple, clean and fast. Note: The logo and banner used in the project are my intellectual pr

Vipul Jha 98 Jan 2, 2023
USA Covid-19 Tracker is a mobile-first application built with React and Redux to give precise information about the virus behavior in the United States. Great transitions and user feedback made with plain CSS.

React.js USA Covid-19 Tracker This application allows the public to keep track of the stadistics of the Covid-19 Pandemic in the United Stated. You wi

Rafael Echart 14 Oct 25, 2022
A website built with React, Redux, and Tailwind for styling. The project is displaying a list of books, adding, and removing books.

Bookstore "Bookstore" is a website built with React, Redux, and Tailwind for styling. The project is displaying a list of books, adding, and removing

Shady Shawkat 5 Dec 19, 2022
Monks and Mages is a TCG-game built on React and socket.io

Monks and Mages Monks and Mages is a trading card-style game inspired by Heroes of Might and Magic / Magic the Gathering. The gameplay is similar to M

Jimmy Li 17 Sep 22, 2022