From 275c3b553952560909cb29492138732f95590dc2 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Wed, 22 Apr 2026 19:16:26 +0800 Subject: [PATCH 01/83] v0.1.3-alpha --- miair/dlna/templates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miair/dlna/templates.py b/miair/dlna/templates.py index 9b8bf8b..cf3ccf9 100644 --- a/miair/dlna/templates.py +++ b/miair/dlna/templates.py @@ -24,7 +24,7 @@ def device_description_xml(udn: str, friendly_name: str, base_url: str) -> str: {DEVICE_TYPE} {escape(friendly_name)} MiAir - https://github.com/miair + https://github.com/KiriChen-Wind/MiAir MiAir - Xiaomi Speaker DLNA Audio Renderer MiAir Speaker 1.0 From 5fe79ae5e41c3150353d3e9ec39331867cf8ac15 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:19:30 +0800 Subject: [PATCH 02/83] Add files via upload --- miair/dlna/templates.py | 1720 +++++++++++++++++++-------------------- 1 file changed, 860 insertions(+), 860 deletions(-) diff --git a/miair/dlna/templates.py b/miair/dlna/templates.py index 9b8bf8b..25a68ca 100644 --- a/miair/dlna/templates.py +++ b/miair/dlna/templates.py @@ -1,860 +1,860 @@ -"""UPnP/DLNA XML 模板""" - -from xml.sax.saxutils import escape - -from miair.const import ( - AVTRANSPORT_URN, - CONNECTION_MANAGER_URN, - DEVICE_TYPE, - RENDERING_CONTROL_URN, - SUPPORTED_PROTOCOLS, -) - - -def device_description_xml(udn: str, friendly_name: str, base_url: str) -> str: - """生成设备描述 XML (参照 MaCast)""" - return f""" - - - 1 - 0 - - - {DEVICE_TYPE} - {escape(friendly_name)} - MiAir - https://github.com/miair - MiAir - Xiaomi Speaker DLNA Audio Renderer - MiAir Speaker - 1.0 - 1 - uuid:{udn} - DMR-1.50 - audio-only - - - {AVTRANSPORT_URN} - urn:upnp-org:serviceId:AVTransport - /device/{udn}/AVTransport.xml - /device/{udn}/AVTransport/control - /device/{udn}/AVTransport/event - - - {RENDERING_CONTROL_URN} - urn:upnp-org:serviceId:RenderingControl - /device/{udn}/RenderingControl.xml - /device/{udn}/RenderingControl/control - /device/{udn}/RenderingControl/event - - - {CONNECTION_MANAGER_URN} - urn:upnp-org:serviceId:ConnectionManager - /device/{udn}/ConnectionManager.xml - /device/{udn}/ConnectionManager/control - /device/{udn}/ConnectionManager/event - - - -""" - - -# AVTransport SCPD (参照 MaCast 声明 14 个动作) -AVTRANSPORT_SCPD = """ - - - 1 - 0 - - - - SetAVTransportURI - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - CurrentURI - in - AVTransportURI - - - CurrentURIMetaData - in - AVTransportURIMetaData - - - - - SetNextAVTransportURI - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - NextURI - in - NextAVTransportURI - - - NextURIMetaData - in - NextAVTransportURIMetaData - - - - - Play - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Speed - in - TransportPlaySpeed - - - - - Pause - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - - - Stop - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - - - Seek - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Unit - in - A_ARG_TYPE_SeekMode - - - Target - in - A_ARG_TYPE_SeekTarget - - - - - Next - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - - - Previous - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - - - SetPlayMode - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - NewPlayMode - in - CurrentPlayMode - - - - - GetTransportInfo - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - CurrentTransportState - out - TransportState - - - CurrentTransportStatus - out - TransportStatus - - - CurrentSpeed - out - TransportPlaySpeed - - - - - GetPositionInfo - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Track - out - CurrentTrack - - - TrackDuration - out - CurrentTrackDuration - - - TrackMetaData - out - CurrentTrackMetaData - - - TrackURI - out - CurrentTrackURI - - - RelTime - out - RelativeTimePosition - - - AbsTime - out - AbsoluteTimePosition - - - RelCount - out - RelativeCounterPosition - - - AbsCount - out - AbsoluteCounterPosition - - - - - GetMediaInfo - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - NrTracks - out - NumberOfTracks - - - MediaDuration - out - CurrentMediaDuration - - - CurrentURI - out - AVTransportURI - - - CurrentURIMetaData - out - AVTransportURIMetaData - - - NextURI - out - NextAVTransportURI - - - NextURIMetaData - out - NextAVTransportURIMetaData - - - PlayMedium - out - PlaybackStorageMedium - - - RecordMedium - out - RecordStorageMedium - - - WriteStatus - out - RecordMediumWriteStatus - - - - - GetTransportSettings - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - PlayMode - out - CurrentPlayMode - - - RecQualityMode - out - CurrentRecordQualityMode - - - - - GetDeviceCapabilities - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - PlayMedia - out - PossiblePlaybackStorageMedia - - - RecMedia - out - PossibleRecordStorageMedia - - - RecQualityModes - out - PossibleRecordQualityModes - - - - - GetCurrentTransportActions - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Actions - out - CurrentTransportActions - - - - - - - A_ARG_TYPE_InstanceID - ui4 - - - TransportState - string - - STOPPED - PLAYING - PAUSED_PLAYBACK - TRANSITIONING - NO_MEDIA_PRESENT - - - - TransportStatus - string - - OK - ERROR_OCCURRED - - - - TransportPlaySpeed - string - - - AVTransportURI - string - - - AVTransportURIMetaData - string - - - CurrentTrack - ui4 - - - CurrentTrackDuration - string - - - CurrentTrackMetaData - string - - - CurrentTrackURI - string - - - RelativeTimePosition - string - - - AbsoluteTimePosition - string - - - RelativeCounterPosition - i4 - - - AbsoluteCounterPosition - i4 - - - CurrentPlayMode - string - - NORMAL - REPEAT_ONE - REPEAT_ALL - SHUFFLE - - - - CurrentRecordQualityMode - string - - - NumberOfTracks - ui4 - - - CurrentMediaDuration - string - - - NextAVTransportURI - string - - - NextAVTransportURIMetaData - string - - - PlaybackStorageMedium - string - - - RecordStorageMedium - string - - - RecordMediumWriteStatus - string - - - PossiblePlaybackStorageMedia - string - - - PossibleRecordStorageMedia - string - - - PossibleRecordQualityModes - string - - - A_ARG_TYPE_SeekMode - string - - REL_TIME - TRACK_NR - - - - A_ARG_TYPE_SeekTarget - string - - - CurrentTransportActions - string - - - LastChange - string - - -""" - - -# RenderingControl SCPD (参照 MaCast 声明 6 个动作) -RENDERING_CONTROL_SCPD = """ - - - 1 - 0 - - - - GetVolume - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Channel - in - A_ARG_TYPE_Channel - - - CurrentVolume - out - Volume - - - - - SetVolume - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Channel - in - A_ARG_TYPE_Channel - - - DesiredVolume - in - Volume - - - - - GetMute - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Channel - in - A_ARG_TYPE_Channel - - - CurrentMute - out - Mute - - - - - SetMute - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - Channel - in - A_ARG_TYPE_Channel - - - DesiredMute - in - Mute - - - - - ListPresets - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - CurrentPresetNameList - out - PresetNameList - - - - - SelectPreset - - - InstanceID - in - A_ARG_TYPE_InstanceID - - - PresetName - in - A_ARG_TYPE_PresetName - - - - - - - A_ARG_TYPE_InstanceID - ui4 - - - A_ARG_TYPE_Channel - string - - Master - - - - A_ARG_TYPE_PresetName - string - - - PresetNameList - string - - - Volume - ui2 - - 0 - 100 - 1 - - - - Mute - boolean - - - LastChange - string - - -""" - - -CONNECTION_MANAGER_SCPD = f""" - - - 1 - 0 - - - - GetProtocolInfo - - - Source - out - SourceProtocolInfo - - - Sink - out - SinkProtocolInfo - - - - - GetCurrentConnectionIDs - - - ConnectionIDs - out - CurrentConnectionIDs - - - - - GetCurrentConnectionInfo - - - ConnectionID - in - A_ARG_TYPE_ConnectionID - - - RcsID - out - A_ARG_TYPE_RcsID - - - AVTransportID - out - A_ARG_TYPE_AVTransportID - - - ProtocolInfo - out - A_ARG_TYPE_ProtocolInfo - - - PeerConnectionManager - out - A_ARG_TYPE_ConnectionManager - - - PeerConnectionID - out - A_ARG_TYPE_ConnectionID - - - Direction - out - A_ARG_TYPE_Direction - - - Status - out - A_ARG_TYPE_ConnectionStatus - - - - - - - A_ARG_TYPE_ConnectionID - i4 - - - A_ARG_TYPE_RcsID - i4 - - - A_ARG_TYPE_AVTransportID - i4 - - - A_ARG_TYPE_ProtocolInfo - string - - - A_ARG_TYPE_ConnectionManager - string - - - A_ARG_TYPE_Direction - string - - - A_ARG_TYPE_ConnectionStatus - string - - OK - ContentFormatMismatch - InsufficientBandwidth - UnreliableChannel - Unknown - - - - SourceProtocolInfo - string - - - SinkProtocolInfo - string - - - CurrentConnectionIDs - string - - -""" - - -def soap_response(service_urn: str, action: str, params: dict[str, str]) -> str: - """生成 SOAP 响应 XML (正确转义所有参数值)""" - params_xml = "" - for key, value in params.items(): - params_xml += f" <{key}>{escape(str(value))}\n" - - return f""" - - - -{params_xml} - -""" - - -def soap_fault(error_code: int, error_description: str) -> str: - """生成 SOAP 错误响应 XML""" - return f""" - - - - s:Client - UPnPError - - - {error_code} - {escape(str(error_description))} - - - - -""" +"""UPnP/DLNA XML 模板""" + +from xml.sax.saxutils import escape + +from miair.const import ( + AVTRANSPORT_URN, + CONNECTION_MANAGER_URN, + DEVICE_TYPE, + RENDERING_CONTROL_URN, + SUPPORTED_PROTOCOLS, +) + + +def device_description_xml(udn: str, friendly_name: str, base_url: str) -> str: + """生成设备描述 XML (参照 MaCast)""" + return f""" + + + 1 + 0 + + + {DEVICE_TYPE} + {escape(friendly_name)} + MiAir + https://github.com/KiriChen-Wind/MiAir + MiAir - Xiaomi Speaker DLNA Audio Renderer + MiAir Speaker + 1.0 + 1 + uuid:{udn} + DMR-1.50 + audio-only + + + {AVTRANSPORT_URN} + urn:upnp-org:serviceId:AVTransport + /device/{udn}/AVTransport.xml + /device/{udn}/AVTransport/control + /device/{udn}/AVTransport/event + + + {RENDERING_CONTROL_URN} + urn:upnp-org:serviceId:RenderingControl + /device/{udn}/RenderingControl.xml + /device/{udn}/RenderingControl/control + /device/{udn}/RenderingControl/event + + + {CONNECTION_MANAGER_URN} + urn:upnp-org:serviceId:ConnectionManager + /device/{udn}/ConnectionManager.xml + /device/{udn}/ConnectionManager/control + /device/{udn}/ConnectionManager/event + + + +""" + + +# AVTransport SCPD (参照 MaCast 声明 14 个动作) +AVTRANSPORT_SCPD = """ + + + 1 + 0 + + + + SetAVTransportURI + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentURI + in + AVTransportURI + + + CurrentURIMetaData + in + AVTransportURIMetaData + + + + + SetNextAVTransportURI + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + NextURI + in + NextAVTransportURI + + + NextURIMetaData + in + NextAVTransportURIMetaData + + + + + Play + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Speed + in + TransportPlaySpeed + + + + + Pause + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + + + Stop + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + + + Seek + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Unit + in + A_ARG_TYPE_SeekMode + + + Target + in + A_ARG_TYPE_SeekTarget + + + + + Next + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + + + Previous + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + + + SetPlayMode + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + NewPlayMode + in + CurrentPlayMode + + + + + GetTransportInfo + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentTransportState + out + TransportState + + + CurrentTransportStatus + out + TransportStatus + + + CurrentSpeed + out + TransportPlaySpeed + + + + + GetPositionInfo + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Track + out + CurrentTrack + + + TrackDuration + out + CurrentTrackDuration + + + TrackMetaData + out + CurrentTrackMetaData + + + TrackURI + out + CurrentTrackURI + + + RelTime + out + RelativeTimePosition + + + AbsTime + out + AbsoluteTimePosition + + + RelCount + out + RelativeCounterPosition + + + AbsCount + out + AbsoluteCounterPosition + + + + + GetMediaInfo + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + NrTracks + out + NumberOfTracks + + + MediaDuration + out + CurrentMediaDuration + + + CurrentURI + out + AVTransportURI + + + CurrentURIMetaData + out + AVTransportURIMetaData + + + NextURI + out + NextAVTransportURI + + + NextURIMetaData + out + NextAVTransportURIMetaData + + + PlayMedium + out + PlaybackStorageMedium + + + RecordMedium + out + RecordStorageMedium + + + WriteStatus + out + RecordMediumWriteStatus + + + + + GetTransportSettings + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + PlayMode + out + CurrentPlayMode + + + RecQualityMode + out + CurrentRecordQualityMode + + + + + GetDeviceCapabilities + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + PlayMedia + out + PossiblePlaybackStorageMedia + + + RecMedia + out + PossibleRecordStorageMedia + + + RecQualityModes + out + PossibleRecordQualityModes + + + + + GetCurrentTransportActions + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Actions + out + CurrentTransportActions + + + + + + + A_ARG_TYPE_InstanceID + ui4 + + + TransportState + string + + STOPPED + PLAYING + PAUSED_PLAYBACK + TRANSITIONING + NO_MEDIA_PRESENT + + + + TransportStatus + string + + OK + ERROR_OCCURRED + + + + TransportPlaySpeed + string + + + AVTransportURI + string + + + AVTransportURIMetaData + string + + + CurrentTrack + ui4 + + + CurrentTrackDuration + string + + + CurrentTrackMetaData + string + + + CurrentTrackURI + string + + + RelativeTimePosition + string + + + AbsoluteTimePosition + string + + + RelativeCounterPosition + i4 + + + AbsoluteCounterPosition + i4 + + + CurrentPlayMode + string + + NORMAL + REPEAT_ONE + REPEAT_ALL + SHUFFLE + + + + CurrentRecordQualityMode + string + + + NumberOfTracks + ui4 + + + CurrentMediaDuration + string + + + NextAVTransportURI + string + + + NextAVTransportURIMetaData + string + + + PlaybackStorageMedium + string + + + RecordStorageMedium + string + + + RecordMediumWriteStatus + string + + + PossiblePlaybackStorageMedia + string + + + PossibleRecordStorageMedia + string + + + PossibleRecordQualityModes + string + + + A_ARG_TYPE_SeekMode + string + + REL_TIME + TRACK_NR + + + + A_ARG_TYPE_SeekTarget + string + + + CurrentTransportActions + string + + + LastChange + string + + +""" + + +# RenderingControl SCPD (参照 MaCast 声明 6 个动作) +RENDERING_CONTROL_SCPD = """ + + + 1 + 0 + + + + GetVolume + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + CurrentVolume + out + Volume + + + + + SetVolume + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + DesiredVolume + in + Volume + + + + + GetMute + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + CurrentMute + out + Mute + + + + + SetMute + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + Channel + in + A_ARG_TYPE_Channel + + + DesiredMute + in + Mute + + + + + ListPresets + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + CurrentPresetNameList + out + PresetNameList + + + + + SelectPreset + + + InstanceID + in + A_ARG_TYPE_InstanceID + + + PresetName + in + A_ARG_TYPE_PresetName + + + + + + + A_ARG_TYPE_InstanceID + ui4 + + + A_ARG_TYPE_Channel + string + + Master + + + + A_ARG_TYPE_PresetName + string + + + PresetNameList + string + + + Volume + ui2 + + 0 + 100 + 1 + + + + Mute + boolean + + + LastChange + string + + +""" + + +CONNECTION_MANAGER_SCPD = f""" + + + 1 + 0 + + + + GetProtocolInfo + + + Source + out + SourceProtocolInfo + + + Sink + out + SinkProtocolInfo + + + + + GetCurrentConnectionIDs + + + ConnectionIDs + out + CurrentConnectionIDs + + + + + GetCurrentConnectionInfo + + + ConnectionID + in + A_ARG_TYPE_ConnectionID + + + RcsID + out + A_ARG_TYPE_RcsID + + + AVTransportID + out + A_ARG_TYPE_AVTransportID + + + ProtocolInfo + out + A_ARG_TYPE_ProtocolInfo + + + PeerConnectionManager + out + A_ARG_TYPE_ConnectionManager + + + PeerConnectionID + out + A_ARG_TYPE_ConnectionID + + + Direction + out + A_ARG_TYPE_Direction + + + Status + out + A_ARG_TYPE_ConnectionStatus + + + + + + + A_ARG_TYPE_ConnectionID + i4 + + + A_ARG_TYPE_RcsID + i4 + + + A_ARG_TYPE_AVTransportID + i4 + + + A_ARG_TYPE_ProtocolInfo + string + + + A_ARG_TYPE_ConnectionManager + string + + + A_ARG_TYPE_Direction + string + + + A_ARG_TYPE_ConnectionStatus + string + + OK + ContentFormatMismatch + InsufficientBandwidth + UnreliableChannel + Unknown + + + + SourceProtocolInfo + string + + + SinkProtocolInfo + string + + + CurrentConnectionIDs + string + + +""" + + +def soap_response(service_urn: str, action: str, params: dict[str, str]) -> str: + """生成 SOAP 响应 XML (正确转义所有参数值)""" + params_xml = "" + for key, value in params.items(): + params_xml += f" <{key}>{escape(str(value))}\n" + + return f""" + + + +{params_xml} + +""" + + +def soap_fault(error_code: int, error_description: str) -> str: + """生成 SOAP 错误响应 XML""" + return f""" + + + + s:Client + UPnPError + + + {error_code} + {escape(str(error_description))} + + + + +""" From 8f3ec62453f862ee2b62692fb2a25dbf070d3fc1 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Wed, 22 Apr 2026 21:02:54 +0800 Subject: [PATCH 03/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 249d114..71382f3 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,10 @@ python miair.py ``` 程序将自动安装相关依赖库,请确保网络畅通 +## 我们 +**[QQ交流群&测试版本发布]https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info")** -### 后续 可能 添加的功能 +## 后续 可能 添加的功能 - 支持 Docker 部署 - 支持 OpenWrt 部署 From fc854fb74fdb2e22b07d22fe4a45566e1a20ba84 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Wed, 22 Apr 2026 21:03:56 +0800 Subject: [PATCH 04/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71382f3..dde79fe 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ python miair.py 程序将自动安装相关依赖库,请确保网络畅通 ## 我们 -**[QQ交流群&测试版本发布]https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info")** +**[QQ交流群&测试版本发布]https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "QQ交流群&测试版本发布")** ## 后续 可能 添加的功能 From abc4a6894c3d5db6393758ddc4ee12317cecd464 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Wed, 22 Apr 2026 21:05:07 +0800 Subject: [PATCH 05/83] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dde79fe..a1c42f7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ python miair.py 程序将自动安装相关依赖库,请确保网络畅通 ## 我们 -**[QQ交流群&测试版本发布]https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "QQ交流群&测试版本发布")** +**[交流&测试版本发布](https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "交流&测试版本发布")** ## 后续 可能 添加的功能 @@ -25,4 +25,4 @@ python miair.py - ...... -[![preview](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview")](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview") \ No newline at end of file +[![preview](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview")](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview") From 4893ad08ad842345bdcd5a18866631ab814f267e Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 03:00:54 +0800 Subject: [PATCH 06/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a1c42f7..69bd87c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ python miair.py 程序将自动安装相关依赖库,请确保网络畅通 ## 我们 -**[交流&测试版本发布](https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "交流&测试版本发布")** +**[需要帮助&交流&测试版本发布](https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "需要帮助&交流&测试版本发布")** ## 后续 可能 添加的功能 From 0ed5bd774f042359be0965eeb46a18c0617fbd31 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:35:59 +0800 Subject: [PATCH 07/83] Update README.md --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 69bd87c..0b9af14 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ **[XiaoMusic](https://github.com/hanxi/xiaomusic "XiaoMusic")**   **[AirPlay2 Receiver](https://github.com/openairplay/airplay2-receiver "AirPlay2 Receiver")**   **[MaCast](https://github.com/xfangfang/Macast "MaCast")** ## 快速开始 - +### Windows *确保设备已安装 Python 3.12+* 进入项目目录,使用终端执行 @@ -14,6 +14,25 @@ python miair.py ``` 程序将自动安装相关依赖库,请确保网络畅通 +### Docker (Thanks @SyunSS) +```bash +# 安装 Git +opkg update +opkg install git +opkg install git-http + +# 克隆项目 +git clone -b docker https://github.com/KiriChen-Wind/MiAir.git +cd MiAir + +# 运行安装脚本,按提示输入小米账号密码即可 +chmod +x deploy.sh manage.sh +./deploy.sh +``` + +安装完成后访问 `http://容器宿主机IP:8300` 打开 Web 管理界面。 +请确保容器网络为Host。 + ## 我们 **[需要帮助&交流&测试版本发布](https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "需要帮助&交流&测试版本发布")** From ecd1ae59c55166e163c02dfaab02337af2677bae Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:36:38 +0800 Subject: [PATCH 08/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b9af14..852e7a2 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ chmod +x deploy.sh manage.sh ## 后续 可能 添加的功能 -- 支持 Docker 部署 +- ~~支持 Docker 部署~~ - 支持 OpenWrt 部署 - ~~支持 MacOS 部署~~ - ...... From 86e426046e3d3e6eff7f69150cb46c00e6dfe06d Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:40:03 +0800 Subject: [PATCH 09/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 852e7a2..a6f6ac2 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ opkg install git-http git clone -b docker https://github.com/KiriChen-Wind/MiAir.git cd MiAir -# 运行安装脚本,按提示输入小米账号密码即可 +# 赋予权限并运行安装脚本 chmod +x deploy.sh manage.sh ./deploy.sh ``` From a63a432ca7e539d0b7e4e27d18659aeb04ebda58 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:44:37 +0800 Subject: [PATCH 10/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a6f6ac2..3a0ee78 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,13 @@ ### Windows *确保设备已安装 Python 3.12+* +前往Release页面下载最新版本 进入项目目录,使用终端执行 ```python python miair.py ``` 程序将自动安装相关依赖库,请确保网络畅通 +安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 ### Docker (Thanks @SyunSS) ```bash @@ -30,7 +32,7 @@ chmod +x deploy.sh manage.sh ./deploy.sh ``` -安装完成后访问 `http://容器宿主机IP:8300` 打开 Web 管理界面。 +安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 请确保容器网络为Host。 ## 我们 From 39666fe090c759cdaf888a82aa52ae949fb75027 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:46:08 +0800 Subject: [PATCH 11/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a0ee78..836aaf2 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ ```python python miair.py ``` -程序将自动安装相关依赖库,请确保网络畅通 +程序将自动安装相关依赖库,请确保网络畅通\ 安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 ### Docker (Thanks @SyunSS) From 579fe275340a9f873ac11c78ad10cf12b52e17c3 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:46:59 +0800 Subject: [PATCH 12/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 836aaf2..f7adabd 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ### Windows *确保设备已安装 Python 3.12+* -前往Release页面下载最新版本 +前往Release页面下载最新版本\ 进入项目目录,使用终端执行 ```python python miair.py From 9ac6872cdd8b1265974a1fa4f2e1835c7e742ece Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:10:23 +0800 Subject: [PATCH 13/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f7adabd..4229284 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,8 @@ chmod +x deploy.sh manage.sh ``` 安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 -请确保容器网络为Host。 +请确保容器网络为Host。\ +部分情况下,修改配置后容器可能无法自动重启,请手动重启容器。 ## 我们 **[需要帮助&交流&测试版本发布](https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "需要帮助&交流&测试版本发布")** From b6c86a97b8d7868c472363058262953866359874 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:41:23 +0800 Subject: [PATCH 14/83] Update README.md --- README.md | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4229284..3da3103 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ **[XiaoMusic](https://github.com/hanxi/xiaomusic "XiaoMusic")**   **[AirPlay2 Receiver](https://github.com/openairplay/airplay2-receiver "AirPlay2 Receiver")**   **[MaCast](https://github.com/xfangfang/Macast "MaCast")** ## 快速开始 -### Windows +## Windows *确保设备已安装 Python 3.12+* 前往Release页面下载最新版本\ @@ -16,7 +16,11 @@ python miair.py 程序将自动安装相关依赖库,请确保网络畅通\ 安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 -### Docker (Thanks @SyunSS) +## Docker (Thanks @SyunSS) + +支持平台:Linux / OpenWrt / macOS + +### 使用脚本部署 ```bash # 安装 Git opkg update @@ -36,12 +40,41 @@ chmod +x deploy.sh manage.sh 请确保容器网络为Host。\ 部分情况下,修改配置后容器可能无法自动重启,请手动重启容器。 +### 在线镜像部署 +```bash +docker run -d \ + --name miair \ + --network=host \ + -e MIAIR_HOSTNAME=你的局域网IP \ + ghcr.io/syunss/miair:latest +``` + +> **示例:** `MIAIR_HOSTNAME=192.168.31.1` + +### 本地构建部署 + +```bash +git clone -b docker https://github.com/SyunSS/MiAir.git +cd MiAir +docker build -t miair . +docker run -d --name miair --network=host -e MIAIR_HOSTNAME=你的IP miair +``` + +### Docker 相关命令 +```bash +docker logs -f miair # 查看日志 +docker stop miair # 停止 +docker start miair # 启动 +docker restart miair # 重启 +``` + + ## 我们 **[需要帮助&交流&测试版本发布](https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "需要帮助&交流&测试版本发布")** ## 后续 可能 添加的功能 -- ~~支持 Docker 部署~~ +- ~~支持 Docker 部署~~ ✅ 已支持 - 支持 OpenWrt 部署 - ~~支持 MacOS 部署~~ - ...... From 9d8a2f5a21a6ac64d840aee9b82f699197e24a4e Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:43:17 +0800 Subject: [PATCH 15/83] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3da3103..4da7114 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,6 @@ chmod +x deploy.sh manage.sh ./deploy.sh ``` -安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 -请确保容器网络为Host。\ -部分情况下,修改配置后容器可能无法自动重启,请手动重启容器。 - ### 在线镜像部署 ```bash docker run -d \ @@ -59,6 +55,9 @@ cd MiAir docker build -t miair . docker run -d --name miair --network=host -e MIAIR_HOSTNAME=你的IP miair ``` +安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 +请确保容器网络为Host。\ +部分情况下,修改配置后容器可能无法自动重启,请手动重启容器。 ### Docker 相关命令 ```bash From 04f4bfcc8508deff08993d108aa6fdfc8526f2cd Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:44:38 +0800 Subject: [PATCH 16/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4da7114..b82c000 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ python miair.py ``` 程序将自动安装相关依赖库,请确保网络畅通\ -安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 +安装完成后访问 `http://主机IP:8300` 即可打开 Web 管理界面。 ## Docker (Thanks @SyunSS) From a7ff84873193d85a0f861ddfcc07c57768d1bd5c Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 00:36:29 +0800 Subject: [PATCH 17/83] Update project files --- README.md | 26 --------- miair/airplay/utils.py | 2 +- miair/app.py | 34 ++++++++++++ miair/auth.py | 8 ++- miair/speaker.py | 107 ++++++++++++++++++++++++++++++++++++ miair/web/api.py | 23 +++++++- miair/web/static/index.html | 93 ++++++++++++++++++++----------- preview.png | Bin 179823 -> 0 bytes pyproject.toml | 2 +- 9 files changed, 232 insertions(+), 63 deletions(-) delete mode 100644 README.md delete mode 100644 preview.png diff --git a/README.md b/README.md deleted file mode 100644 index 249d114..0000000 --- a/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# MiAir - 为小爱音箱添加 DLNA 与 AirPlay 支持 - -## 引用以下开源项目代码 由衷感谢 - -**[XiaoMusic](https://github.com/hanxi/xiaomusic "XiaoMusic")**   **[AirPlay2 Receiver](https://github.com/openairplay/airplay2-receiver "AirPlay2 Receiver")**   **[MaCast](https://github.com/xfangfang/Macast "MaCast")** - -## 快速开始 - -*确保设备已安装 Python 3.12+* - -进入项目目录,使用终端执行 -```python -python miair.py -``` -程序将自动安装相关依赖库,请确保网络畅通 - - -### 后续 可能 添加的功能 - -- 支持 Docker 部署 -- 支持 OpenWrt 部署 -- ~~支持 MacOS 部署~~ -- ...... - - -[![preview](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview")](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview") \ No newline at end of file diff --git a/miair/airplay/utils.py b/miair/airplay/utils.py index 74c7be8..25ca58f 100644 --- a/miair/airplay/utils.py +++ b/miair/airplay/utils.py @@ -192,7 +192,7 @@ def get_volume(): vol = interpolate(pct, 0, 100, -30, 0) elif subsys == "Linux": line_pct = subprocess.check_output(["amixer", "get", "Master"]).splitlines()[-1] - m = re.search(b"\[([0-9]+)%\]", line_pct) + m = re.search(rb"\[([0-9]+)%\]", line_pct) if m: pct = int(m.group(1)) if pct < 45: diff --git a/miair/app.py b/miair/app.py index 9445425..66da3d8 100644 --- a/miair/app.py +++ b/miair/app.py @@ -86,10 +86,34 @@ async def _start_dlna_services(self): # 登录小米 await self.auth.login() + # 检查登录状态 + if not self.auth.is_logged_in(): + log.warning("登录失败,无法启动 DLNA 服务") + # 清空渲染器和控制器,避免显示旧设备 + self.renderers.clear() + self._did_to_udn.clear() + if hasattr(self, 'speaker_manager'): + self.speaker_manager.controllers.clear() + return + + # 获取设备列表,确保能正常获取新账号的设备 + device_list = await self.auth.get_device_list() + if not device_list: + log.warning("未获取到设备列表,无法启动 DLNA 服务") + # 清空渲染器和控制器,避免显示旧设备 + self.renderers.clear() + self._did_to_udn.clear() + if hasattr(self, 'speaker_manager'): + self.speaker_manager.controllers.clear() + return + # 初始化音箱 await self.speaker_manager.init_speakers() if not self.speaker_manager.controllers: log.warning("没有可用的音箱,请检查配置或重新选择设备") + # 清空渲染器和控制器,避免显示旧设备 + self.renderers.clear() + self._did_to_udn.clear() return # 为每个音箱创建 DLNA 渲染器 @@ -126,6 +150,13 @@ async def _start_dlna_services(self): except Exception as e: log.error(f"启动 DLNA 服务失败: {e}") + # 确保 dlna_running 为 False + self.dlna_running = False + # 清空渲染器和控制器,避免显示旧设备 + self.renderers.clear() + self._did_to_udn.clear() + if hasattr(self, 'speaker_manager'): + self.speaker_manager.controllers.clear() async def _start_airplay_for_speakers(self): """为每个音箱启动独立的 AirPlay 接收服务""" @@ -143,6 +174,9 @@ async def restart_dlna_services(self): """重启 DLNA 服务 (用户通过 Web 修改配置后调用)""" # 先停止现有服务 await self._stop_dlna_services() + # 关闭并重新初始化 auth,确保账号切换生效 + await self.auth.close() + self.auth = AuthManager(self.config) # 重建 speaker manager self.speaker_manager = SpeakerManager(self.config, self.auth) # 启动 diff --git a/miair/auth.py b/miair/auth.py index 16890d9..e90d4ac 100644 --- a/miair/auth.py +++ b/miair/auth.py @@ -80,6 +80,9 @@ async def login(self): self.config.password, token_store=token_store, ) + # 确保 token 不为 None,避免后续操作出错 + if not hasattr(self.account, 'token') or self.account.token is None: + self.account.token = {"deviceId": "miair_device"} # 显式调用 login # 如果使用 cookie 登录,跳过 login 调用,直接标记为已登录 @@ -93,6 +96,9 @@ async def login(self): log.info("小米账号登录成功") except Exception as e: self._logged_in = False + # 确保 token 不为 None,避免后续操作出错 + if not hasattr(self.account, 'token') or self.account.token is None: + self.account.token = {"deviceId": "miair_device"} err_msg = str(e) err_code = self._extract_error_code(err_msg) if err_code == "87001" or "captcha" in err_msg.lower(): @@ -123,7 +129,7 @@ async def login(self): async def ensure_login(self): """确保已登录,未登录则尝试登录""" - if self.mina_service is None: + if self.mina_service is None or not self._logged_in: await self.login() @staticmethod diff --git a/miair/speaker.py b/miair/speaker.py index 19758ac..7fcfe8e 100644 --- a/miair/speaker.py +++ b/miair/speaker.py @@ -47,6 +47,25 @@ async def play_url(self, url: str) -> bool: return ret is not None except Exception as e: log.error(f"play_url 失败: {e}") + # 检查是否是登录失败的错误 + if "Login failed" in str(e) or "登录验证失败" in str(e): + log.info("检测到登录失败,尝试重新登录...") + # 重置登录状态并重新登录 + self.auth._logged_in = False + await self.auth.login() + # 重新尝试播放 + try: + await self.auth.ensure_login() + if self._should_use_music_api(): + ret = await self.auth.mina_service.play_by_music_url( + self.device_id, url, audio_id=DEFAULT_AUDIO_ID + ) + else: + ret = await self.auth.mina_service.play_by_url(self.device_id, url) + return ret is not None + except Exception as e2: + log.error(f"重新登录后 play_url 仍然失败: {e2}") + return False return False async def pause(self) -> bool: @@ -58,6 +77,20 @@ async def pause(self) -> bool: return True except Exception as e: log.error(f"pause 失败: {e}") + # 检查是否是登录失败的错误 + if "Login failed" in str(e) or "登录验证失败" in str(e): + log.info("检测到登录失败,尝试重新登录...") + # 重置登录状态并重新登录 + self.auth._logged_in = False + await self.auth.login() + # 重新尝试暂停 + try: + await self.auth.ensure_login() + await self.auth.mina_service.player_pause(self.device_id) + return True + except Exception as e2: + log.error(f"重新登录后 pause 仍然失败: {e2}") + return False return False async def stop(self) -> bool: @@ -72,6 +105,21 @@ async def stop(self) -> bool: return True except Exception as e: log.error(f"stop 失败: {e}") + # 检查是否是登录失败的错误 + if "Login failed" in str(e) or "登录验证失败" in str(e): + log.info("检测到登录失败,尝试重新登录...") + # 重置登录状态并重新登录 + self.auth._logged_in = False + await self.auth.login() + # 重新尝试停止 + try: + await self.auth.ensure_login() + await self.auth.mina_service.player_stop(self.device_id) + await self.pause() + return True + except Exception as e2: + log.error(f"重新登录后 stop 仍然失败: {e2}") + return False return False async def set_volume(self, volume: int) -> bool: @@ -86,6 +134,22 @@ async def set_volume(self, volume: int) -> bool: return True except Exception as e: log.error(f"set_volume 失败: {e}") + # 检查是否是登录失败的错误 + if "Login failed" in str(e) or "登录验证失败" in str(e): + log.info("检测到登录失败,尝试重新登录...") + # 重置登录状态并重新登录 + self.auth._logged_in = False + await self.auth.login() + # 重新尝试设置音量 + try: + await self.auth.ensure_login() + await self.auth.mina_service.player_set_volume(self.device_id, volume) + if volume > 0: + self._last_volume = volume + return True + except Exception as e2: + log.error(f"重新登录后 set_volume 仍然失败: {e2}") + return False return False async def get_volume(self) -> int: @@ -100,6 +164,24 @@ async def get_volume(self) -> int: return volume except Exception as e: log.error(f"get_volume 失败: {e}") + # 检查是否是登录失败的错误 + if "Login failed" in str(e) or "登录验证失败" in str(e): + log.info("检测到登录失败,尝试重新登录...") + # 重置登录状态并重新登录 + self.auth._logged_in = False + await self.auth.login() + # 重新尝试获取音量 + try: + await self.auth.ensure_login() + status = await self.auth.mina_service.player_get_status(self.device_id) + info = json.loads(status.get("data", {}).get("info", "{}")) + volume = int(info.get("volume", 0)) + if volume > 0: + self._last_volume = volume + return volume + except Exception as e2: + log.error(f"重新登录后 get_volume 仍然失败: {e2}") + return self._last_volume return self._last_volume async def get_status(self) -> dict: @@ -132,6 +214,31 @@ async def get_status(self) -> dict: "volume": int(info.get("volume", 0)), } except Exception as e: + # 检查是否是登录失败的错误 + if "Login failed" in str(e) or "登录验证失败" in str(e): + log.info("检测到登录失败,尝试重新登录...") + # 重置登录状态并重新登录 + self.auth._logged_in = False + await self.auth.login() + # 重新尝试获取状态 + try: + await self.auth.ensure_login() + playing_info = await self.auth.mina_service.player_get_status( + self.device_id + ) + if playing_info.get("code") != 0: + raise Exception(f"Mina API Error: {playing_info}") + data = playing_info.get("data", {}) + info_str = data.get("info") + if not info_str: + raise Exception(f"Mina API response missing 'info': {playing_info}") + info = json.loads(info_str) + return { + "status": info.get("status", 0), + "volume": int(info.get("volume", 0)), + } + except Exception as e2: + log.error(f"重新登录后 get_status 仍然失败: {e2}") # 向上抛出异常,让调用者(如 DeviceServer 的轮询任务)捕获并忽略本次轮询 raise Exception(f"get_status 失败: {e}") diff --git a/miair/web/api.py b/miair/web/api.py index 58beb80..c27a825 100644 --- a/miair/web/api.py +++ b/miair/web/api.py @@ -14,10 +14,25 @@ log = logging.getLogger("miair") +def _is_docker(): + """检测是否在 Docker 容器中运行""" + try: + with open('/proc/1/cgroup', 'r') as f: + return 'docker' in f.read() + except: + return False + def _restart_process(): """重启当前 Python 进程""" log.info(f"重启进程: {sys.executable} {sys.argv}") - if sys.platform == "win32": + + # 检测是否在 Docker 容器中 + if _is_docker(): + # Docker 环境下,直接退出进程,让 Docker 容器重启 + log.info("在 Docker 环境中,退出进程以触发容器重启") + import os + os._exit(1) + elif sys.platform == "win32": # Windows 上 os.execv 行为不同,使用 subprocess 重启 import subprocess subprocess.Popen([sys.executable] + sys.argv) @@ -100,6 +115,12 @@ async def handle_save_setting(request): if "auto_play_on_set_uri" in data: config.auto_play_on_set_uri = data["auto_play_on_set_uri"] + # 更新端口配置 + if "dlna_port" in data: + config.dlna_port = data["dlna_port"] + if "web_port" in data: + config.web_port = data["web_port"] + # 更新实验性功能配置 if "auto_resume_on_interrupt" in data: config.auto_resume_on_interrupt = data["auto_resume_on_interrupt"] diff --git a/miair/web/static/index.html b/miair/web/static/index.html index f87987b..e6f3941 100644 --- a/miair/web/static/index.html +++ b/miair/web/static/index.html @@ -230,6 +230,10 @@ .delay-label { font-size: 13px; color: var(--text-secondary); } .delay-unit { font-size: 13px; color: var(--text-muted); } + /* Section styles */ + .section { margin-bottom: 20px; padding: 16px; background-color: var(--card-bg); border-radius: 8px; border: 1px solid var(--border); } + .section-title { font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border); } + /* Footer */ .footer { text-align: center; margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--border); } .footer-text { font-size: 11px; color: var(--text-muted); } @@ -264,7 +268,7 @@

- 登录 account.xiaomi.com → F12 开发者工具 → Application → Cookies → 复制 userIdpassToken + 登录 account.xiaomi.com → F12 开发者工具 → 应用程序(Application) → Cookies → 复制 userIdpassToken

@@ -276,20 +280,34 @@
实验性功能
-
-
-
打断后续播
-
被语音唤醒打断后自动恢复播放
+
+
打断后续播
+
+
+
打断后续播
+
被语音唤醒打断后自动恢复播放
+
+ +
+
+ 恢复延迟 + +
-
-
- 恢复延迟 - - +
+
端口设置
+
+ + +
+
+ + +
@@ -326,7 +344,7 @@
@@ -350,7 +368,7 @@ currentSetting = data; updateStatusBar(data); - // 仅首次加载时填充账号和实验性设置,避免覆盖用户正在编辑的内容 + // 仅首次加载时填充账号、端口和实验性设置,避免覆盖用户正在编辑的内容 if (!_initialLoaded) { _initialLoaded = true; if (data.cookie) { @@ -359,13 +377,16 @@ if (userIdMatch) document.getElementById('input-userId').value = userIdMatch[1]; if (passTokenMatch) document.getElementById('input-passToken').value = passTokenMatch[1]; } + // 加载端口设置 + if (data.dlna_port) document.getElementById('input-dlna-port').value = data.dlna_port; + if (data.web_port) document.getElementById('input-web-port').value = data.web_port; loadExperimentalSettings(); } if (data.device_list && data.device_list.length > 0) { renderDeviceList(data.device_list, data.mi_did || ''); } else if (data.has_account && withDeviceList) { - document.getElementById('device-list').innerHTML = '
未发现设备,请检查账号是否正确
'; + document.getElementById('device-list').innerHTML = '
未发现设备,请检查账号密码是否正确
'; } if (data.dlna_running) await fetchRenderers(); @@ -382,7 +403,7 @@ if (data.dlna_running) { bar.className = 'status-bar status-running'; dot.className = 'status-dot dot-green'; - text.textContent = '服务运行中 · ' + data.renderers_count + ' 个渲染器 · ' + data.hostname + ':' + data.dlna_port; + text.textContent = '服务运行中 · 共 ' + data.renderers_count + ' 个渲染器正在工作'; } else if (data.has_account && data.mi_did) { bar.className = 'status-bar status-stopped'; dot.className = 'status-dot dot-yellow'; @@ -498,23 +519,16 @@ body: JSON.stringify({ cookie }), }); - const resp = await fetch('/api/devices'); - const data = await resp.json(); - - if (data.error) { - tip.textContent = data.error; - tip.className = 'tip error'; - } else if (data.devices && data.devices.length > 0) { - tip.textContent = '登录成功,发现 ' + data.devices.length + ' 个设备'; - tip.className = 'tip success'; - renderDeviceList(data.devices, currentSetting.mi_did || ''); - } else { - tip.textContent = '未发现可用设备,请检查账号是否正确'; - tip.className = 'tip error'; - } + // 保存 cookie 后服务器会重启,等待后刷新页面 + tip.textContent = '正在登录...'; + tip.className = 'tip success'; + // 等待服务重启 + setTimeout(() => location.reload(), 4000); } catch (e) { - tip.textContent = '请求失败: ' + e.message; - tip.className = 'tip error'; + // 进程重启导致连接断开是正常的,或者登录失败 + tip.textContent = '正在重启服务...'; + tip.className = 'tip success'; + setTimeout(() => location.reload(), 4000); } finally { btn.disabled = false; btn.textContent = '登录并获取设备'; @@ -670,9 +684,18 @@ document.getElementById('btn-save-experimental').addEventListener('click', async function() { const autoResume = document.getElementById('chk-auto-resume').checked; const resumeDelay = parseInt(document.getElementById('input-resume-delay').value) || 5; + const dlnaPort = parseInt(document.getElementById('input-dlna-port').value) || 8200; + const webPort = parseInt(document.getElementById('input-web-port').value) || 8300; const tip = document.getElementById('tip-experimental'); const btn = this; + // 端口验证 + if (dlnaPort < 1 || dlnaPort > 65535 || webPort < 1 || webPort > 65535) { + tip.textContent = '端口必须在 1-65535 之间'; + tip.className = 'tip error'; + return; + } + btn.disabled = true; btn.textContent = '保存中...'; tip.textContent = ''; @@ -684,6 +707,8 @@ body: JSON.stringify({ auto_resume_on_interrupt: autoResume, resume_delay_seconds: resumeDelay, + dlna_port: dlnaPort, + web_port: webPort, }), }); const data = await resp.json(); @@ -693,6 +718,8 @@ tip.className = 'tip success'; currentSetting.auto_resume_on_interrupt = autoResume; currentSetting.resume_delay_seconds = resumeDelay; + currentSetting.dlna_port = dlnaPort; + currentSetting.web_port = webPort; } else { tip.textContent = data.message || '保存失败'; tip.className = 'tip error'; diff --git a/preview.png b/preview.png deleted file mode 100644 index 3e2b2949acc898ace019fc3ac9c325f05c3de6bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179823 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 Date: Mon, 27 Apr 2026 01:02:17 +0800 Subject: [PATCH 18/83] v0.2.1-alpha --- README.md | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ preview.png | Bin 0 -> 179823 bytes 2 files changed, 82 insertions(+) create mode 100644 README.md create mode 100644 preview.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..658545a --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# MiAir - 为小爱音箱添加 DLNA 与 AirPlay 支持 + +## 引用以下开源项目代码 由衷感谢 + +**[XiaoMusic](https://github.com/hanxi/xiaomusic "XiaoMusic")**   **[AirPlay2 Receiver](https://github.com/openairplay/airplay2-receiver "AirPlay2 Receiver")**   **[MaCast](https://github.com/xfangfang/Macast "MaCast")** + +## 快速开始 +## Windows +*确保设备已安装 Python 3.12+* + +前往Release页面下载最新版本\ +进入项目目录,使用终端执行 +```python +python miair.py +``` +程序将自动安装相关依赖库,请确保网络畅通\ +安装完成后访问 `http://主机IP:8300` 即可打开 Web 管理界面。 + +## Docker (Thanks @SyunSS) + +支持平台:Linux / OpenWrt / macOS + +### 使用脚本部署 +```bash +# 安装 Git +opkg update +opkg install git +opkg install git-http + +# 克隆项目 +git clone -b docker https://github.com/KiriChen-Wind/MiAir.git +cd MiAir + +# 赋予权限并运行安装脚本 +chmod +x deploy.sh manage.sh +./deploy.sh +``` + +### 在线镜像部署 +```bash +docker run -d \ + --name miair \ + --network=host \ + -e MIAIR_HOSTNAME=你的局域网IP \ + ghcr.io/syunss/miair:latest +``` + +> **示例:** `MIAIR_HOSTNAME=192.168.31.1` + +### 本地构建部署 + +```bash +git clone -b docker https://github.com/SyunSS/MiAir.git +cd MiAir +docker build -t miair . +docker run -d --name miair --network=host -e MIAIR_HOSTNAME=你的IP miair +``` + +安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 +请确保容器网络为Host。\ +部分情况下,修改配置后容器可能无法自动重启,请手动重启容器。 + +### Docker 相关命令 +```bash +docker logs -f miair # 查看日志 +docker stop miair # 停止 +docker start miair # 启动 +docker restart miair # 重启 +``` + +## 我们 +**[需要帮助&交流&测试版本发布](https://qun.qq.com/universal-share/share?ac=1&authKey=1zXhx2zxgw9GG2mkecypT9clD7q0B3W3l4K0D4fQirmpDWakz0Oy2BI3ocDrgzbh&busi_data=eyJncm91cENvZGUiOiI3NDEyNjcyOTgiLCJ0b2tlbiI6InYwbitXQTF5cE9MaUJCR0hMUk03OWV0WkFoMThxbjJRaWI4dHVlbUpGdW5OdEZBVEpXMXF0T1dQUnRmRXRzYVgiLCJ1aW4iOiIxODQxOTM4MDQwIn0%3D&data=_OrA-eASJMwYwx-Uj-BReC1Xh3zGAdkn8CQskbEsQ5S66bhqvvO6dJ-QrSlRl-Ks00l5XDw1FANE8Um0w5yB8Q&svctype=4&tempid=h5_group_info "需要帮助&交流&测试版本发布")** + +## 后续 可能 添加的功能 + +- ~~支持 Docker 部署~~ ✅ 已支持 +- 支持 OpenWrt 部署 +- ~~支持 MacOS 部署~~ +- ...... + + +[![preview](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview")](https://raw.githubusercontent.com/KiriChen-Wind/MiAir/main/preview.png "preview") diff --git a/preview.png b/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2b2949acc898ace019fc3ac9c325f05c3de6bd GIT binary patch literal 179823 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 Date: Mon, 27 Apr 2026 01:09:49 +0800 Subject: [PATCH 19/83] =?UTF-8?q?docker=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 16 +++ Dockerfile | 24 ++++ deploy.sh | 334 +++++++++++++++++++++++++++++++++++++++++++++++++++ manage.sh | 71 +++++++++++ 4 files changed, 445 insertions(+) create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 deploy.sh create mode 100644 manage.sh diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..304eb3d --- /dev/null +++ b/.env.example @@ -0,0 +1,16 @@ +# MiAir Docker 部署配置 +# 复制此文件为 .env 并填入实际值 + +# 小米账号 (手机号或邮箱) +MI_USER= + +# 小米密码 +MI_PASS= + +# 设备 DID (可选,留空则自动搜索) +# 多个设备用逗号分隔 +MI_DID= + +# 局域网 IP (通常自动检测,如有需要可手动指定) +# 例如:192.168.1.1 +# HOST_IP=192.168.1.1 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..df24964 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM python:3.12-slim + +LABEL maintainer="MiAir" +LABEL description="DLNA/AirPlay receiver for Xiaomi AI Speaker" + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ffmpeg \ + libportaudio2 \ + dnsutils \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY pyproject.toml . +RUN pip install --no-cache-dir . --root-user-action=ignore + +COPY miair.py ./ +COPY miair/ ./miair/ + +RUN mkdir -p /app/conf + +EXPOSE 8200 8300 + +ENTRYPOINT ["python", "miair.py", "--conf-path", "/app/conf"] diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..5abc33e --- /dev/null +++ b/deploy.sh @@ -0,0 +1,334 @@ +#!/bin/bash +# MiAir Docker 部署脚本 +# 支持 Linux / OpenWrt / iStoreOS / macOS 等平台 + +set -e + +echo "==========================================" +echo " MiAir Docker 部署脚本" +echo "==========================================" +echo "" + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +APP_DIR="$(cd "$(dirname "$0")" && pwd)" +CONTAINER_NAME="miair" +IMAGE_NAME="miair:latest" + +# 检测设备架构 +ARCH=$(uname -m) +echo -e "${GREEN}检测到设备架构: $ARCH${NC}" + +# 根据架构设置基础镜像 +case "$ARCH" in + arm*|aarch64) + BASE_IMAGE="python:3.12-slim" + ;; + x86_64|amd64) + BASE_IMAGE="python:3.12-slim" + ;; + *) + echo -e "${YELLOW}警告: 未知架构 $ARCH,使用默认基础镜像${NC}" + BASE_IMAGE="python:3.12-slim" + ;; +esac +echo -e "${GREEN}使用基础镜像: $BASE_IMAGE${NC}" + +# 进入脚本所在目录 +cd "$APP_DIR" + +# 检测是否以 root 运行 +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}错误: 请使用 root 权限运行此脚本${NC}" + echo "运行: sudo ./deploy.sh" + exit 1 +fi + +# ============================================ +# 步骤 1: 检查 Docker 是否安装 +# ============================================ +echo -e "${GREEN}[1/8] 检查 Docker 环境...${NC}" + +if command -v docker &> /dev/null; then + echo -e "${GREEN}✓ Docker 已安装: $(docker --version)${NC}" +else + echo -e "${YELLOW}Docker 未安装,正在安装...${NC}" + opkg update + opkg install dockerd docker-compose + /etc/init.d/dockerd start + /etc/init.d/dockerd enable + echo -e "${GREEN}✓ Docker 安装完成${NC}" +fi + +# 等待 Docker 服务就绪 +echo "等待 Docker 服务启动..." +for i in {1..30}; do + if docker info &> /dev/null; then + echo -e "${GREEN}✓ Docker 服务运行正常${NC}" + break + fi + if [ $i -eq 30 ]; then + echo -e "${RED}✗ Docker 服务启动超时${NC}" + exit 1 + fi + sleep 1 +done + +# ============================================ +# 步骤 2: 获取宿主机 IP +# ============================================ +echo -e "${GREEN}[2/8] 获取局域网 IP...${NC}" + +# 获取 LAN 口 IP 的函数:按优先级依次尝试各种方式 +get_lan_ip() { + local ip="" + + # 1. 优先尝试常见 LAN 桥接口名 + for iface in br-lan br0 eth0 eth1 lan; do + ip=$(ip addr show "$iface" 2>/dev/null \ + | grep -oP 'inet \K[\d.]+' \ + | grep -v '^127\.' | head -1) + [ -n "$ip" ] && echo "$ip" && return + done + + # 2. 找所有以 br- 开头的桥接口 + for iface in $(ip link show 2>/dev/null | awk -F': ' '/^[0-9]+: br-/{print $2}'); do + ip=$(ip addr show "$iface" 2>/dev/null \ + | grep -oP 'inet \K[\d.]+' \ + | grep -v '^127\.' | head -1) + [ -n "$ip" ] && echo "$ip" && return + done + + # 3. 取默认路由出口接口的 IP + local gw_iface + gw_iface=$(ip route 2>/dev/null | awk '/^default/{print $5; exit}') + if [ -n "$gw_iface" ]; then + ip=$(ip addr show "$gw_iface" 2>/dev/null \ + | grep -oP 'inet \K[\d.]+' \ + | grep -v '^127\.' | head -1) + [ -n "$ip" ] && echo "$ip" && return + fi + + # 4. 兜底:取第一个非 lo、非 docker 的内网 IP + ip=$(ip addr 2>/dev/null \ + | grep -oP 'inet \K(192\.168|10\.|172\.(1[6-9]|2[0-9]|3[01]))[\d.]+' \ + | head -1) + [ -n "$ip" ] && echo "$ip" && return + + echo "127.0.0.1" +} + +HOST_IP=$(get_lan_ip) +echo -e "${GREEN}✓ 宿主机 IP: $HOST_IP${NC}" + +# ============================================ +# 步骤 3: 检查并下载 MiAir 代码 +# ============================================ +echo -e "${GREEN}[3/8] 检查 MiAir 代码...${NC}" + +# 检查必要文件是否存在 +if [ -f "miair.py" ] && [ -f "pyproject.toml" ] && [ -d "miair" ]; then + echo -e "${GREEN}✓ MiAir 代码已存在${NC}" +else + echo -e "${YELLOW}未找到 MiAir 代码,开始从 GitHub 下载...${NC}" + + # 下载代码 + echo "下载 MiAir 源代码..." + if command -v wget &> /dev/null; then + wget -O miair.tar.gz https://github.com/KiriChen-Wind/MiAir/archive/refs/heads/main.tar.gz + elif command -v curl &> /dev/null; then + curl -L https://github.com/KiriChen-Wind/MiAir/archive/refs/heads/main.tar.gz -o miair.tar.gz + else + opkg install wget + wget -O miair.tar.gz https://github.com/KiriChen-Wind/MiAir/archive/refs/heads/main.tar.gz + fi + + # 解压并整理 + echo "解压文件..." + tar -xzf miair.tar.gz + cp -r MiAir-main/* . 2>/dev/null || true + cp MiAir-main/.* . 2>/dev/null || true + rm -rf MiAir-main miair.tar.gz + + # 验证下载 + if [ -f "miair.py" ] && [ -f "pyproject.toml" ] && [ -d "miair" ]; then + echo -e "${GREEN}✓ MiAir 代码下载并准备完成${NC}" + else + echo -e "${RED}✗ MiAir 代码下载失败${NC}" + echo "请手动下载: https://github.com/KiriChen-Wind/MiAir" + exit 1 + fi +fi + +# ============================================ +# 步骤 4: 配置参数 +# ============================================ + +# 加载 .env 文件(如果存在) +if [ -f ".env" ]; then + echo "加载 .env 配置文件..." + set -a + source .env + set +a +fi + +# ============================================ +# 步骤 5: 创建 Dockerfile +# ============================================ +echo -e "${GREEN}[5/8] 创建 Dockerfile...${NC}" + +# 确保在正确目录 +cd "$APP_DIR" + +# 检查 pyproject.toml 是否存在 +if [ ! -f "pyproject.toml" ]; then + echo -e "${RED}错误: pyproject.toml 不存在${NC}" + echo "请确保 MiAir 代码已正确放置" + exit 1 +fi + +# 创建 Dockerfile +cat > Dockerfile << DOCKERFILE_EOF +FROM $BASE_IMAGE + +LABEL maintainer="MiAir" +LABEL description="DLNA/AirPlay receiver for Xiaomi AI Speaker" + +# 安装系统依赖 +RUN apt-get update && apt-get install -y --no-install-recommends \ + ffmpeg \ + libportaudio2 \ + dnsutils \ + && rm -rf /var/lib/apt/lists/* + +# 架构特定的依赖安装 +RUN case "$(uname -m)" in \ + arm*|aarch64) \ + # ARM 架构特定依赖(如果需要) \ + apt-get update && apt-get install -y --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* \ + ;; + x86_64|amd64) \ + # x86 架构特定依赖(如果需要) \ + apt-get update && apt-get install -y --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* \ + ;; + *) \ + # 其他架构 \ + echo "Unknown architecture, using default dependencies" \ + ;; + esac + +WORKDIR /app + +# 安装 Python 依赖 +COPY pyproject.toml . +RUN pip install --no-cache-dir . + +# 复制应用代码 +COPY miair.py ./ +COPY miair/ ./miair/ + +# 创建配置目录 +RUN mkdir -p /app/conf + +# 暴露端口 +EXPOSE 8200 8300 + +ENTRYPOINT ["python", "miair.py", "--conf-path", "/app/conf"] +DOCKERFILE_EOF + +echo -e "${GREEN}✓ Dockerfile 创建完成${NC}" + +# ============================================ +# 步骤 6: 构建 Docker 镜像 +# ============================================ +echo -e "${GREEN}[6/8] 构建 Docker 镜像 (可能需要几分钟)...${NC}" + +docker build -t miair:latest . + +if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 镜像构建成功${NC}" +else + echo -e "${RED}✗ 镜像构建失败${NC}" + exit 1 +fi + +# ============================================ +# 步骤 7: 停止并删除旧容器(如存在) +# ============================================ +echo -e "${GREEN}[7/8] 清理旧容器...${NC}" + +# 询问用户是否保留之前的配置 +echo -e "${YELLOW}是否保留之前的配置文件?${NC}" +echo "1) 保留配置" +echo "2) 重置配置" +read -p "请选择 (1/2): " KEEP_CONFIG + +# 清理旧容器 +docker rm -f "$CONTAINER_NAME" 2>/dev/null || true + +# 根据用户选择处理配置 +if [ "$KEEP_CONFIG" != "1" ]; then + echo -e "${YELLOW}重置配置文件...${NC}" + rm -rf "$APP_DIR/conf" 2>/dev/null || true +fi + +# 确保配置目录存在 +mkdir -p "$APP_DIR/conf" +echo -e "${GREEN}✓ 清理完成${NC}" + +# ============================================ +# 步骤 8: 启动容器 +# ============================================ +echo -e "${GREEN}[8/8] 启动 MiAir 容器...${NC}" + +# 构建环境变量参数 +ENV_VARS="-e TZ=Asia/Shanghai -e MIAIR_HOSTNAME=$HOST_IP" +[ -n "$MI_USER" ] && ENV_VARS="$ENV_VARS -e MI_USER=$MI_USER" +[ -n "$MI_PASS" ] && ENV_VARS="$ENV_VARS -e MI_PASS=$MI_PASS" +[ -n "$MI_DID" ] && ENV_VARS="$ENV_VARS -e MI_DID=$MI_DID" + +# 启动命令 +docker run -d \ + --name "$CONTAINER_NAME" \ + --network=host \ + $ENV_VARS \ + -v "$APP_DIR/conf:/app/conf" \ + --restart unless-stopped \ + --cap-add=NET_ADMIN \ + --cap-add=NET_BIND_SERVICE \ + --cap-add=NET_BROADCAST \ + "$IMAGE_NAME" + +if [ $? -eq 0 ]; then + echo "" + echo "==========================================" + echo -e "${GREEN} 🎉 MiAir 部署成功!${NC}" + echo "==========================================" + echo "" + echo -e "Web 管理界面: ${GREEN}YourHostIP:8300${NC}" + echo -e "DLNA 端口: ${GREEN}8200${NC}" + echo "" + echo "查看日志命令:" + echo " docker logs -f miair" + echo "" + echo "停止服务:" + echo " docker stop miair" + echo "" + + # 显示日志前 20 行 + echo "最近日志:" + echo "----------------------------------------" + docker logs miair 2>&1 | tail -20 + echo "----------------------------------------" +else + echo -e "${RED}✗ 容器启动失败,请查看日志${NC}" + echo "docker logs miair" + exit 1 +fi diff --git a/manage.sh b/manage.sh new file mode 100644 index 0000000..8264fb9 --- /dev/null +++ b/manage.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# MiAir 管理脚本 +# 用法: ./manage.sh [start|stop|restart|logs|status|update|uninstall] + +APP_DIR="$(cd "$(dirname "$0")" && pwd)" +CONTAINER_NAME="miair" + +case "$1" in + start) + echo "启动 MiAir..." + docker start "$CONTAINER_NAME" + ;; + stop) + echo "停止 MiAir..." + docker stop "$CONTAINER_NAME" + ;; + restart) + echo "重启 MiAir..." + docker restart "$CONTAINER_NAME" + ;; + logs) + if [ "$2" = "-f" ]; then + docker logs -f "$CONTAINER_NAME" + else + docker logs "$CONTAINER_NAME" + fi + ;; + status) + docker ps -a | grep "$CONTAINER_NAME" + ;; + update) + echo "更新 MiAir..." + cd "$APP_DIR" + # 备份配置 + cp -r conf conf.bak + + # 下载最新代码 + wget -O miair.tar.gz https://github.com/KiriChen-Wind/MiAir/archive/refs/heads/main.tar.gz + tar -xzf miair.tar.gz + cp -r MiAir-main/* . + rm -rf MiAir-main miair.tar.gz + + # 重新构建 + docker build -t miair:latest . + docker rm -f "$CONTAINER_NAME" + ./deploy.sh + ;; + uninstall) + echo "卸载 MiAir..." + read -p "确定要删除容器和配置吗? (y/N): " confirm + if [ "$confirm" = "y" ]; then + docker rm -f "$CONTAINER_NAME" + docker rmi miair:latest + rm -rf "$APP_DIR" + echo "卸载完成" + fi + ;; + *) + echo "用法: $0 {start|stop|restart|logs|status|update|uninstall}" + echo "" + echo " start - 启动服务" + echo " stop - 停止服务" + echo " restart - 重启服务" + echo " logs - 查看日志" + echo " logs -f - 实时查看日志" + echo " status - 查看状态" + echo " update - 更新到最新版本" + echo " uninstall - 卸载" + exit 1 + ;; +esac From 0cfa37ba5e3642443b35ea2b2edf2a6f2b2fb1c1 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Mon, 27 Apr 2026 01:11:13 +0800 Subject: [PATCH 20/83] Update README.md --- README.md | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/README.md b/README.md index 658545a..2409447 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ opkg install git opkg install git-http # 克隆项目 -git clone -b docker https://github.com/KiriChen-Wind/MiAir.git +git clone https://github.com/KiriChen-Wind/MiAir.git cd MiAir # 赋予权限并运行安装脚本 @@ -36,26 +36,6 @@ chmod +x deploy.sh manage.sh ./deploy.sh ``` -### 在线镜像部署 -```bash -docker run -d \ - --name miair \ - --network=host \ - -e MIAIR_HOSTNAME=你的局域网IP \ - ghcr.io/syunss/miair:latest -``` - -> **示例:** `MIAIR_HOSTNAME=192.168.31.1` - -### 本地构建部署 - -```bash -git clone -b docker https://github.com/SyunSS/MiAir.git -cd MiAir -docker build -t miair . -docker run -d --name miair --network=host -e MIAIR_HOSTNAME=你的IP miair -``` - 安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 请确保容器网络为Host。\ 部分情况下,修改配置后容器可能无法自动重启,请手动重启容器。 From a08e3c21187fd936529bcd5d2205d76c2ff8c6a4 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 01:14:03 +0800 Subject: [PATCH 21/83] v0.2.1-alpha --- deploy.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deploy.sh b/deploy.sh index 5abc33e..af773c1 100644 --- a/deploy.sh +++ b/deploy.sh @@ -332,3 +332,9 @@ else echo "docker logs miair" exit 1 fi + +# 自动删除部署目录 +echo -e "${YELLOW}正在删除部署目录...${NC}" +cd "$(dirname "$APP_DIR")" +rm -rf "$APP_DIR" +echo -e "${GREEN}✓ 部署目录已删除${NC}" From fe3c48028dda2e072bd429c3412cfa254a0d4567 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 01:17:34 +0800 Subject: [PATCH 22/83] fix deploy --- deploy.sh | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/deploy.sh b/deploy.sh index af773c1..6fbd2c3 100644 --- a/deploy.sh +++ b/deploy.sh @@ -206,24 +206,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ dnsutils \ && rm -rf /var/lib/apt/lists/* -# 架构特定的依赖安装 -RUN case "$(uname -m)" in \ - arm*|aarch64) \ - # ARM 架构特定依赖(如果需要) \ - apt-get update && apt-get install -y --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* \ - ;; - x86_64|amd64) \ - # x86 架构特定依赖(如果需要) \ - apt-get update && apt-get install -y --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* \ - ;; - *) \ - # 其他架构 \ - echo "Unknown architecture, using default dependencies" \ - ;; - esac - WORKDIR /app # 安装 Python 依赖 From 258e6f655b6c5747d8420cbdfddaa9aacf8f6df6 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 01:41:04 +0800 Subject: [PATCH 23/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dip=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miair/airplay/server.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/miair/airplay/server.py b/miair/airplay/server.py index 1b4fcd2..5b5f066 100644 --- a/miair/airplay/server.py +++ b/miair/airplay/server.py @@ -174,6 +174,10 @@ def device_id_bin(self) -> bytes: def _get_ipv4(self) -> str: """获取本机 IPv4 地址""" + hostname = os.getenv("MIAIR_HOSTNAME", "") + if hostname and hostname != "127.0.0.1": + return hostname + try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) From 265ad38b2496c5298c59769b3e1609421e0ccf79 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 01:43:08 +0800 Subject: [PATCH 24/83] =?UTF-8?q?=E6=88=91=E4=B9=9F=E4=B8=8D=E7=9F=A5?= =?UTF-8?q?=E9=81=93=E4=BF=AE=E4=BA=86=E4=BB=80=E4=B9=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/deploy.sh b/deploy.sh index 6fbd2c3..22ec98b 100644 --- a/deploy.sh +++ b/deploy.sh @@ -17,6 +17,7 @@ NC='\033[0m' # No Color # 配置变量 APP_DIR="$(cd "$(dirname "$0")" && pwd)" +PARENT_DIR="$(dirname "$APP_DIR")" CONTAINER_NAME="miair" IMAGE_NAME="miair:latest" @@ -317,6 +318,7 @@ fi # 自动删除部署目录 echo -e "${YELLOW}正在删除部署目录...${NC}" -cd "$(dirname "$APP_DIR")" -rm -rf "$APP_DIR" +( + cd "$PARENT_DIR" && rm -rf "$APP_DIR" +) echo -e "${GREEN}✓ 部署目录已删除${NC}" From 4d6c466d029ad024f5d11d1ee43a6b480fad7bb0 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 01:47:12 +0800 Subject: [PATCH 25/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E4=B8=8Eip=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/deploy.sh b/deploy.sh index 22ec98b..2a15cf6 100644 --- a/deploy.sh +++ b/deploy.sh @@ -125,6 +125,14 @@ get_lan_ip() { } HOST_IP=$(get_lan_ip) +if [ "$HOST_IP" = "127.0.0.1" ]; then + echo -e "${YELLOW}无法自动检测到有效的局域网 IP,请手动输入:${NC}" + read -p "请输入宿主机 IP 地址: " HOST_IP + while [ -z "$HOST_IP" ]; do + echo -e "${RED}IP 地址不能为空,请重新输入${NC}" + read -p "请输入宿主机 IP 地址: " HOST_IP + done +fi echo -e "${GREEN}✓ 宿主机 IP: $HOST_IP${NC}" # ============================================ @@ -257,9 +265,21 @@ read -p "请选择 (1/2): " KEEP_CONFIG docker rm -f "$CONTAINER_NAME" 2>/dev/null || true # 根据用户选择处理配置 -if [ "$KEEP_CONFIG" != "1" ]; then +if [ "$KEEP_CONFIG" = "1" ]; then + # 备份配置 + echo -e "${GREEN}保留配置,备份现有配置...${NC}" + TEMP_CONF="/tmp/miair_conf_backup_$$" + if [ -d "$APP_DIR/conf" ] && [ -n "$(ls -A "$APP_DIR/conf" 2>/dev/null)" ]; then + cp -r "$APP_DIR/conf" "$TEMP_CONF" + echo -e "${GREEN}✓ 配置已备份${NC}" + else + TEMP_CONF="" + echo -e "${YELLOW}未找到现有配置,将使用默认配置${NC}" + fi +else echo -e "${YELLOW}重置配置文件...${NC}" rm -rf "$APP_DIR/conf" 2>/dev/null || true + TEMP_CONF="" fi # 确保配置目录存在 @@ -295,6 +315,15 @@ if [ $? -eq 0 ]; then echo -e "${GREEN} 🎉 MiAir 部署成功!${NC}" echo "==========================================" echo "" + + # 恢复备份的配置 + if [ -n "$TEMP_CONF" ] && [ -d "$TEMP_CONF" ]; then + echo -e "${GREEN}恢复配置...${NC}" + cp -r "$TEMP_CONF"/* "$APP_DIR/conf/" 2>/dev/null || true + rm -rf "$TEMP_CONF" + echo -e "${GREEN}✓ 配置已恢复${NC}" + fi + echo -e "Web 管理界面: ${GREEN}YourHostIP:8300${NC}" echo -e "DLNA 端口: ${GREEN}8200${NC}" echo "" From f951ca7b7eac8b880e8d77feebc5be30a6d207f3 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 01:55:35 +0800 Subject: [PATCH 26/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8C=81=E4=B9=85=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 33 +++++++++++++++++++++++---------- miair/web/api.py | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/deploy.sh b/deploy.sh index 2a15cf6..41e5b8e 100644 --- a/deploy.sh +++ b/deploy.sh @@ -40,6 +40,18 @@ case "$ARCH" in esac echo -e "${GREEN}使用基础镜像: $BASE_IMAGE${NC}" +# 询问用户配置目录位置 +echo -e "${YELLOW}配置文件目录设置${NC}" +echo "建议使用持久化存储路径,如: /root/miair_conf 或 /opt/miair_conf" +read -p "请输入配置目录路径(直接回车使用默认: /tmp/miair_conf): " CONFIG_DIR +if [ -z "$CONFIG_DIR" ]; then + CONFIG_DIR="/tmp/miair_conf" +fi + +# 确保配置目录存在 +mkdir -p "$CONFIG_DIR" +echo -e "${GREEN}✓ 配置目录: $CONFIG_DIR${NC}" + # 进入脚本所在目录 cd "$APP_DIR" @@ -261,16 +273,13 @@ echo "1) 保留配置" echo "2) 重置配置" read -p "请选择 (1/2): " KEEP_CONFIG -# 清理旧容器 -docker rm -f "$CONTAINER_NAME" 2>/dev/null || true - # 根据用户选择处理配置 if [ "$KEEP_CONFIG" = "1" ]; then # 备份配置 echo -e "${GREEN}保留配置,备份现有配置...${NC}" TEMP_CONF="/tmp/miair_conf_backup_$$" - if [ -d "$APP_DIR/conf" ] && [ -n "$(ls -A "$APP_DIR/conf" 2>/dev/null)" ]; then - cp -r "$APP_DIR/conf" "$TEMP_CONF" + if [ -d "$CONFIG_DIR" ] && [ -n "$(ls -A "$CONFIG_DIR" 2>/dev/null)" ]; then + cp -r "$CONFIG_DIR" "$TEMP_CONF" echo -e "${GREEN}✓ 配置已备份${NC}" else TEMP_CONF="" @@ -278,12 +287,15 @@ if [ "$KEEP_CONFIG" = "1" ]; then fi else echo -e "${YELLOW}重置配置文件...${NC}" - rm -rf "$APP_DIR/conf" 2>/dev/null || true + rm -rf "$CONFIG_DIR" 2>/dev/null || true TEMP_CONF="" fi +# 清理旧容器 +docker rm -f "$CONTAINER_NAME" 2>/dev/null || true + # 确保配置目录存在 -mkdir -p "$APP_DIR/conf" +mkdir -p "$CONFIG_DIR" echo -e "${GREEN}✓ 清理完成${NC}" # ============================================ @@ -292,7 +304,7 @@ echo -e "${GREEN}✓ 清理完成${NC}" echo -e "${GREEN}[8/8] 启动 MiAir 容器...${NC}" # 构建环境变量参数 -ENV_VARS="-e TZ=Asia/Shanghai -e MIAIR_HOSTNAME=$HOST_IP" +ENV_VARS="-e TZ=Asia/Shanghai -e MIAIR_HOSTNAME=$HOST_IP -e CONTAINER_NAME=$CONTAINER_NAME" [ -n "$MI_USER" ] && ENV_VARS="$ENV_VARS -e MI_USER=$MI_USER" [ -n "$MI_PASS" ] && ENV_VARS="$ENV_VARS -e MI_PASS=$MI_PASS" [ -n "$MI_DID" ] && ENV_VARS="$ENV_VARS -e MI_DID=$MI_DID" @@ -302,7 +314,7 @@ docker run -d \ --name "$CONTAINER_NAME" \ --network=host \ $ENV_VARS \ - -v "$APP_DIR/conf:/app/conf" \ + -v "$CONFIG_DIR:/app/conf" \ --restart unless-stopped \ --cap-add=NET_ADMIN \ --cap-add=NET_BIND_SERVICE \ @@ -319,11 +331,12 @@ if [ $? -eq 0 ]; then # 恢复备份的配置 if [ -n "$TEMP_CONF" ] && [ -d "$TEMP_CONF" ]; then echo -e "${GREEN}恢复配置...${NC}" - cp -r "$TEMP_CONF"/* "$APP_DIR/conf/" 2>/dev/null || true + cp -r "$TEMP_CONF"/* "$CONFIG_DIR/" 2>/dev/null || true rm -rf "$TEMP_CONF" echo -e "${GREEN}✓ 配置已恢复${NC}" fi + echo -e "配置文件目录: ${GREEN}$CONFIG_DIR${NC}" echo -e "Web 管理界面: ${GREEN}YourHostIP:8300${NC}" echo -e "DLNA 端口: ${GREEN}8200${NC}" echo "" diff --git a/miair/web/api.py b/miair/web/api.py index c27a825..2462e71 100644 --- a/miair/web/api.py +++ b/miair/web/api.py @@ -28,9 +28,51 @@ def _restart_process(): # 检测是否在 Docker 容器中 if _is_docker(): - # Docker 环境下,直接退出进程,让 Docker 容器重启 - log.info("在 Docker 环境中,退出进程以触发容器重启") - import os + # Docker 环境下,使用 docker restart 重启容器 + log.info("在 Docker 环境中,使用 docker restart 重启容器") + import subprocess + + # 优先使用容器名称(deploy.sh 中设置为 miair) + container_name = os.environ.get("CONTAINER_NAME", "miair") + + try: + # 尝试使用 docker restart 重启容器 + result = subprocess.run( + ["docker", "restart", container_name], + check=False, + capture_output=True, + text=True, + timeout=30 + ) + if result.returncode == 0: + log.info(f"容器 {container_name} 重启命令已发送") + return + else: + log.warning(f"docker restart 失败: {result.stderr}, 尝试使用容器ID") + except FileNotFoundError: + log.warning("docker 命令不可用,尝试直接退出进程") + except subprocess.TimeoutExpired: + log.error("docker restart 命令执行超时") + except Exception as e: + log.warning(f"docker restart 出错: {e}") + + # 如果 docker restart 失败,尝试使用容器ID(从 /proc/self/cgroup 获取) + try: + with open('/proc/1/cgroup', 'r') as f: + cgroup_content = f.read() + # 提取容器ID(格式通常是 12:devices:/docker/xxxxxxxxxxxx) + import re + match = re.search(r'/docker/([a-f0-9]{64})', cgroup_content) + if match: + container_id = match.group(1)[:12] # 取短ID + subprocess.run(["docker", "restart", container_id], check=True, timeout=30) + log.info(f"容器 {container_id} 重启命令已发送") + return + except Exception as e: + log.error(f"获取容器ID失败: {e}") + + # 最后尝试直接退出进程 + log.warning("无法使用 docker restart,尝试直接退出进程") os._exit(1) elif sys.platform == "win32": # Windows 上 os.execv 行为不同,使用 subprocess 重启 From 4946f3f3ad54d4f06798b77ba9da513fc955a467 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 02:02:21 +0800 Subject: [PATCH 27/83] =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 9 +------ miair/web/api.py | 49 +++---------------------------------- miair/web/static/index.html | 4 +-- 3 files changed, 7 insertions(+), 55 deletions(-) diff --git a/deploy.sh b/deploy.sh index 41e5b8e..f628790 100644 --- a/deploy.sh +++ b/deploy.sh @@ -304,7 +304,7 @@ echo -e "${GREEN}✓ 清理完成${NC}" echo -e "${GREEN}[8/8] 启动 MiAir 容器...${NC}" # 构建环境变量参数 -ENV_VARS="-e TZ=Asia/Shanghai -e MIAIR_HOSTNAME=$HOST_IP -e CONTAINER_NAME=$CONTAINER_NAME" +ENV_VARS="-e TZ=Asia/Shanghai -e MIAIR_HOSTNAME=$HOST_IP" [ -n "$MI_USER" ] && ENV_VARS="$ENV_VARS -e MI_USER=$MI_USER" [ -n "$MI_PASS" ] && ENV_VARS="$ENV_VARS -e MI_PASS=$MI_PASS" [ -n "$MI_DID" ] && ENV_VARS="$ENV_VARS -e MI_DID=$MI_DID" @@ -357,10 +357,3 @@ else echo "docker logs miair" exit 1 fi - -# 自动删除部署目录 -echo -e "${YELLOW}正在删除部署目录...${NC}" -( - cd "$PARENT_DIR" && rm -rf "$APP_DIR" -) -echo -e "${GREEN}✓ 部署目录已删除${NC}" diff --git a/miair/web/api.py b/miair/web/api.py index 2462e71..c0112ab 100644 --- a/miair/web/api.py +++ b/miair/web/api.py @@ -28,51 +28,10 @@ def _restart_process(): # 检测是否在 Docker 容器中 if _is_docker(): - # Docker 环境下,使用 docker restart 重启容器 - log.info("在 Docker 环境中,使用 docker restart 重启容器") - import subprocess - - # 优先使用容器名称(deploy.sh 中设置为 miair) - container_name = os.environ.get("CONTAINER_NAME", "miair") - - try: - # 尝试使用 docker restart 重启容器 - result = subprocess.run( - ["docker", "restart", container_name], - check=False, - capture_output=True, - text=True, - timeout=30 - ) - if result.returncode == 0: - log.info(f"容器 {container_name} 重启命令已发送") - return - else: - log.warning(f"docker restart 失败: {result.stderr}, 尝试使用容器ID") - except FileNotFoundError: - log.warning("docker 命令不可用,尝试直接退出进程") - except subprocess.TimeoutExpired: - log.error("docker restart 命令执行超时") - except Exception as e: - log.warning(f"docker restart 出错: {e}") - - # 如果 docker restart 失败,尝试使用容器ID(从 /proc/self/cgroup 获取) - try: - with open('/proc/1/cgroup', 'r') as f: - cgroup_content = f.read() - # 提取容器ID(格式通常是 12:devices:/docker/xxxxxxxxxxxx) - import re - match = re.search(r'/docker/([a-f0-9]{64})', cgroup_content) - if match: - container_id = match.group(1)[:12] # 取短ID - subprocess.run(["docker", "restart", container_id], check=True, timeout=30) - log.info(f"容器 {container_id} 重启命令已发送") - return - except Exception as e: - log.error(f"获取容器ID失败: {e}") - - # 最后尝试直接退出进程 - log.warning("无法使用 docker restart,尝试直接退出进程") + # Docker 环境下,直接退出进程 + # Docker 容器已设置 restart=unless-stopped,会自动重启 + log.info("在 Docker 环境中,退出进程,Docker 会自动重启容器") + import os os._exit(1) elif sys.platform == "win32": # Windows 上 os.execv 行为不同,使用 subprocess 重启 diff --git a/miair/web/static/index.html b/miair/web/static/index.html index e6f3941..0df5de6 100644 --- a/miair/web/static/index.html +++ b/miair/web/static/index.html @@ -531,7 +531,7 @@ setTimeout(() => location.reload(), 4000); } finally { btn.disabled = false; - btn.textContent = '登录并获取设备'; + btn.textContent = '登录小米账号'; } }); @@ -575,7 +575,7 @@ setTimeout(() => location.reload(), 4000); } finally { btn.disabled = false; - btn.textContent = '保存并启动'; + btn.textContent = '保存并重新启动'; } }); From 09ec6fd3b2213c7576f9a5ec5b42e5dc53945a03 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Mon, 27 Apr 2026 02:08:23 +0800 Subject: [PATCH 28/83] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2409447..7aeb421 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ opkg install git opkg install git-http # 克隆项目 +rm -rf MiAir //如果是更新,需要清理旧的部署目录 git clone https://github.com/KiriChen-Wind/MiAir.git cd MiAir From 7e145567c4095a2e7fda6a1e42b3e594d622f75b Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Mon, 27 Apr 2026 02:08:38 +0800 Subject: [PATCH 29/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7aeb421..dd54926 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ opkg install git opkg install git-http # 克隆项目 -rm -rf MiAir //如果是更新,需要清理旧的部署目录 +rm -rf MiAir #如果是更新,需要清理旧的部署目录 git clone https://github.com/KiriChen-Wind/MiAir.git cd MiAir From 65efe94fc8057c63145139a48257bb47bb29fcdb Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Mon, 27 Apr 2026 02:08:53 +0800 Subject: [PATCH 30/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd54926..12fd8b4 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ opkg install git opkg install git-http # 克隆项目 -rm -rf MiAir #如果是更新,需要清理旧的部署目录 +rm -rf MiAir # 如果是更新,需要清理旧的部署目录 git clone https://github.com/KiriChen-Wind/MiAir.git cd MiAir From 639e77753d60f5f0fcca0bcbfc543ea2199e6604 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 02:13:46 +0800 Subject: [PATCH 31/83] =?UTF-8?q?=E7=A7=BB=E9=99=A4AirPlay=E9=9D=9E?= =?UTF-8?q?=E7=BA=BF=E6=80=A7=E9=9F=B3=E9=87=8F=E8=B0=83=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miair/airplay/speaker_airplay.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/miair/airplay/speaker_airplay.py b/miair/airplay/speaker_airplay.py index 16ca0d6..ccbe6a3 100644 --- a/miair/airplay/speaker_airplay.py +++ b/miair/airplay/speaker_airplay.py @@ -205,20 +205,15 @@ def _on_volume_change(self, vol_db: float): 注意: 这个回调从 RTSP 线程调用,不在 asyncio 事件循环中。 """ # AirPlay 音量范围: -144 (静音) 到 0 (最大) + # 使用线性映射:手机音量直接对应音箱音量 if vol_db <= -144: volume = 0 elif vol_db >= 0: volume = 100 else: - # 使用声压级对数映射 (10^(dB/20)),这更符合人耳听觉和 iOS 的滑动曲线 - # 0dB -> 1.0 (100%) - # -20dB -> 0.1 (10%) - # -40dB -> 0.01 (1%) - volume = int(pow(10, vol_db / 20) * 100) - - # 确保即使在低分贝下也有基本的映射,避免由于 int() 导致的过早归零 - if volume == 0 and vol_db > -144: - volume = 1 + # 线性映射: -144dB -> 0%, 0dB -> 100% + volume = int((vol_db + 144) / 144 * 100) + volume = max(0, min(100, volume)) log.info(f"AirPlay 音量同步到 {self.device_name}: {vol_db} dB -> {volume}%") if self._loop and self._loop.is_running(): From db62810d0638a574bc5190a099e64000dab56dbe Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Mon, 27 Apr 2026 02:19:08 +0800 Subject: [PATCH 32/83] =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=8A=A0=E5=9B=9E?= =?UTF-8?q?=E9=9D=9E=E7=BA=BF=E6=80=A7=E9=9F=B3=E9=87=8F=E8=B0=83=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miair/airplay/speaker_airplay.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/miair/airplay/speaker_airplay.py b/miair/airplay/speaker_airplay.py index ccbe6a3..16ca0d6 100644 --- a/miair/airplay/speaker_airplay.py +++ b/miair/airplay/speaker_airplay.py @@ -205,15 +205,20 @@ def _on_volume_change(self, vol_db: float): 注意: 这个回调从 RTSP 线程调用,不在 asyncio 事件循环中。 """ # AirPlay 音量范围: -144 (静音) 到 0 (最大) - # 使用线性映射:手机音量直接对应音箱音量 if vol_db <= -144: volume = 0 elif vol_db >= 0: volume = 100 else: - # 线性映射: -144dB -> 0%, 0dB -> 100% - volume = int((vol_db + 144) / 144 * 100) - volume = max(0, min(100, volume)) + # 使用声压级对数映射 (10^(dB/20)),这更符合人耳听觉和 iOS 的滑动曲线 + # 0dB -> 1.0 (100%) + # -20dB -> 0.1 (10%) + # -40dB -> 0.01 (1%) + volume = int(pow(10, vol_db / 20) * 100) + + # 确保即使在低分贝下也有基本的映射,避免由于 int() 导致的过早归零 + if volume == 0 and vol_db > -144: + volume = 1 log.info(f"AirPlay 音量同步到 {self.device_name}: {vol_db} dB -> {volume}%") if self._loop and self._loop.is_running(): From a0031944ece353295be3ea76f38b2d1877ed7fc0 Mon Sep 17 00:00:00 2001 From: KiriChen <137511967+KiriChen-Wind@users.noreply.github.com> Date: Sat, 2 May 2026 20:00:17 +0800 Subject: [PATCH 33/83] Delete .gitignore --- .gitignore | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 3f80168..0000000 --- a/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -# Python -__pycache__/ -*.py[cod] -*$py.class -*.egg-info/ -dist/ -build/ -*.egg - -# IDE -.vscode/ -.idea/ -*.swp -*.swo - -# 配置与敏感信息 -conf/config.json -conf/.mi.token -conf/*.log -conf/*.log.* - -# 运行时产物 -*.log -*.pcm -nul - -# 系统文件 -.DS_Store -Thumbs.dbf - -*.exe - - \ No newline at end of file From 9780f04db65f6991c517b34999f0f8ec9f610448 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Sat, 2 May 2026 20:11:25 +0800 Subject: [PATCH 34/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miair/web/api.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/miair/web/api.py b/miair/web/api.py index c0112ab..d141763 100644 --- a/miair/web/api.py +++ b/miair/web/api.py @@ -16,11 +16,27 @@ def _is_docker(): """检测是否在 Docker 容器中运行""" + # 1. 环境变量显式指定(最可靠) + if os.environ.get("MIAIR_DOCKER"): + return True + # 2. Docker 会在容器根目录创建 .dockerenv 文件 + if os.path.exists("/.dockerenv"): + return True + # 3. 检查 cgroup(兼容 cgroup v1 和 v2) try: with open('/proc/1/cgroup', 'r') as f: - return 'docker' in f.read() - except: - return False + content = f.read() + return any(k in content for k in ('docker', 'containerd', 'kubepods')) + except Exception: + pass + # 4. 检查 /proc/self/mountinfo 中的 overlay/docker 挂载 + try: + with open('/proc/self/mountinfo', 'r') as f: + content = f.read() + return 'docker' in content or '/docker/' in content + except Exception: + pass + return False def _restart_process(): """重启当前 Python 进程""" @@ -31,14 +47,12 @@ def _restart_process(): # Docker 环境下,直接退出进程 # Docker 容器已设置 restart=unless-stopped,会自动重启 log.info("在 Docker 环境中,退出进程,Docker 会自动重启容器") - import os - os._exit(1) + # 使用 exit code 0,unless-stopped 策略下任何退出都会重启 + os._exit(0) elif sys.platform == "win32": # Windows 上 os.execv 行为不同,使用 subprocess 重启 import subprocess subprocess.Popen([sys.executable] + sys.argv) - # 退出当前进程 - import os os._exit(0) else: os.execv(sys.executable, [sys.executable] + sys.argv) From 56f15f78c637bf8bf6b30f41563625e1ed3bc6ee Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Sun, 3 May 2026 03:03:45 +0800 Subject: [PATCH 35/83] v0.3.1-alpha --- miair/airplay/server.py | 3 + miair/airplay/speaker_airplay.py | 27 +- miair/app.py | 2 +- miair/auth.py | 7 + miair/config.py | 7 + miair/dlna/device_server.py | 57 +- miair/dlna/eventing.py | 4 + miair/dlna/renderer.py | 60 +- miair/web/api.py | 11 +- miair/web/static/index.html | 1906 ++++++++++++++++++++---------- 10 files changed, 1434 insertions(+), 650 deletions(-) diff --git a/miair/airplay/server.py b/miair/airplay/server.py index 5b5f066..529487c 100644 --- a/miair/airplay/server.py +++ b/miair/airplay/server.py @@ -407,6 +407,9 @@ def _handle_rtsp_client(self, sock: socket.socket, addr: tuple): }) sock.sendall(vol_body) + elif method == "SET_VOLUME_NOTIFICATION": + self._send_rtsp_response(sock, 200, cseq) + elif method == "SET_PARAMETER": content_type = headers.get("Content-Type", "") log.info(f"SET_PARAMETER: Content-Type={content_type}, body size={len(body)}") diff --git a/miair/airplay/speaker_airplay.py b/miair/airplay/speaker_airplay.py index 16ca0d6..512306f 100644 --- a/miair/airplay/speaker_airplay.py +++ b/miair/airplay/speaker_airplay.py @@ -94,13 +94,38 @@ async def _play_on_speaker(self, stream_url: str): success = await self.controller.play_url(stream_url) if success: log.info(f"AirPlay 音频已在 {self.device_name} 开始播放") - # 启动状态轮询(打断续播) self._start_poll() + if self.config: + default_vol = getattr(self.config, 'default_volume', 0) + follow_dev_vol = getattr(self.config, 'follow_device_volume', False) + if follow_dev_vol: + try: + current_vol = await self.controller.get_volume() + if self.airplay_server: + self.airplay_server._last_volume_db = self._vol_pct_to_db(current_vol) + log.info(f"AirPlay 已跟随设备当前音量到 {self.device_name}: {current_vol}%") + except Exception as e: + log.error(f"AirPlay 获取当前音量失败: {e}") + elif default_vol > 0: + await asyncio.sleep(0.5) + await self.controller.set_volume(default_vol) + if self.airplay_server: + self.airplay_server._last_volume_db = self._vol_pct_to_db(default_vol) + log.info(f"AirPlay 已应用默认音量到 {self.device_name}: {default_vol}%") else: log.warning(f"AirPlay 音频在 {self.device_name} 播放失败") except Exception as e: log.error(f"AirPlay 播放到 {self.device_name} 失败: {e}") + @staticmethod + def _vol_pct_to_db(volume: int) -> float: + import math + if volume <= 0: + return -144.0 + if volume >= 100: + return 0.0 + return 20.0 * math.log10(volume / 100.0) + def _on_play_stop(self): """AirPlay 停止播放 diff --git a/miair/app.py b/miair/app.py index 66da3d8..774efab 100644 --- a/miair/app.py +++ b/miair/app.py @@ -125,7 +125,7 @@ async def _start_dlna_services(self): udn = speaker.udn friendly_name = speaker.get_dlna_name() - renderer = DLNARenderer(udn, friendly_name, controller) + renderer = DLNARenderer(udn, friendly_name, controller, self.config.default_volume, config=self.config) self.renderers[udn] = renderer self._did_to_udn[did] = udn diff --git a/miair/auth.py b/miair/auth.py index e90d4ac..112db96 100644 --- a/miair/auth.py +++ b/miair/auth.py @@ -122,6 +122,13 @@ async def login(self): ) else: log.error(f"登录失败: {e}") + + # 如果开启了自动重启,则在严重错误时尝试重启程序 + if self.config.auto_restart: + log.warning("检测到登录失败,正在尝试自动重启程序以恢复服务...") + from miair.web.api import _restart_process + import asyncio + asyncio.get_running_loop().call_later(5, _restart_process) # 无论是否登录成功,都设置 service (方便后续重试) self.mina_service = MiNAService(self.account) diff --git a/miair/config.py b/miair/config.py index 60a8792..01e99a5 100644 --- a/miair/config.py +++ b/miair/config.py @@ -66,8 +66,14 @@ class Config: # 实验性功能:打断后续播 auto_resume_on_interrupt: bool = False resume_delay_seconds: int = 5 + # 默认音量 (1-100) + default_volume: int = 50 + # 实验性功能:跟随设备当前音量 + follow_device_volume: bool = False # 语音控制 enable_voice_control: bool = False + # 自动重启(当登录失败或服务异常时) + auto_restart: bool = True voice_poll_interval: int = 1 speakers: dict = field(default_factory=dict) @@ -80,6 +86,7 @@ def log_file(self) -> str: return os.path.join(self.conf_path, "miair.log") def __post_init__(self): + self.resume_delay_seconds = max(1, min(15, self.resume_delay_seconds)) if not self.account: self.account = os.getenv("MI_USER", "") if not self.password: diff --git a/miair/dlna/device_server.py b/miair/dlna/device_server.py index 91593d0..17086bc 100644 --- a/miair/dlna/device_server.py +++ b/miair/dlna/device_server.py @@ -1069,6 +1069,9 @@ async def _handle_control(self, request: web.Request) -> web.Response: if not renderer: return web.Response(status=404, text="Device not found") + # 记录最后活动时间 + renderer._last_control_time = time.time() + # 解析 SOAPAction soap_action = request.headers.get("SOAPAction", "") if not soap_action: @@ -1099,6 +1102,11 @@ async def _handle_subscribe(self, request: web.Request) -> web.Response: if not event_manager: return web.Response(status=404) + # 记录活动时间(续订或新订阅都说明控制端仍在连接) + renderer = self.renderers.get(udn) + if renderer: + renderer._last_control_time = time.time() + # 检查是否是续订 (有 SID header) sid = request.headers.get("SID", "") if sid: @@ -1186,7 +1194,44 @@ async def _poll_speaker_states(self): while True: await asyncio.sleep(5) for udn, renderer in self.renderers.items(): - if not renderer.speaker or not renderer.current_uri: + if not renderer.speaker: + continue + + # 检测控制端断开:渲染器处于终端状态(PAUSED/STOPPED)且有媒体URI + # 1. PAUSED 振荡:音箱 STOP 但被强制保持 PAUSED 超过 30 秒 + # 语音打断场景(_user_stopped=False):直接重置 + # 用户手动暂停(_user_stopped=True):需确认无订阅者后重置 + # 2. STOPPED 持久:有 URI 但无控制活动超过 60 秒且无订阅者 + idle = False + if ( + renderer.current_uri + and renderer.transport_state == TRANSPORT_STATE_PAUSED + and renderer._stuck_paused_since > 0 + and (time.time() - renderer._stuck_paused_since) > 30 + ): + if not renderer._user_stopped: + idle = True + elif ( + renderer.event_manager + and not renderer.event_manager.has_subscribers() + ): + idle = True + elif ( + renderer.current_uri + and renderer.transport_state == TRANSPORT_STATE_STOPPED + and renderer._last_control_time > 0 + and (time.time() - renderer._last_control_time) > 60 + and renderer.event_manager + and not renderer.event_manager.has_subscribers() + ): + idle = True + + if idle: + await renderer.reset_to_idle() + renderer._stuck_paused_since = 0.0 + continue + + if not renderer.current_uri: continue try: status = await asyncio.wait_for( @@ -1264,7 +1309,15 @@ def _handle_state_transition( renderer._play_start_time = 0.0 renderer.transport_state = TRANSPORT_STATE_PAUSED - if self.config and self.config.auto_resume_on_interrupt: + if renderer._stuck_paused_since == 0.0: + renderer._stuck_paused_since = time.time() + + if ( + self.config + and self.config.auto_resume_on_interrupt + and not renderer._user_stopped + and (time.time() - renderer._stuck_paused_since) < 15 + ): if udn in self._resume_tasks: self._resume_tasks[udn].cancel() delay = self.config.resume_delay_seconds diff --git a/miair/dlna/eventing.py b/miair/dlna/eventing.py index 4cf38ec..a1dc04c 100644 --- a/miair/dlna/eventing.py +++ b/miair/dlna/eventing.py @@ -78,6 +78,10 @@ def unsubscribe(self, sid: str) -> bool: return True return False + def has_subscribers(self) -> bool: + """检查是否有未过期的订阅者""" + return any(not sub.expired for sub in self._subscriptions.values()) + async def notify_all(self, event_xml: str): """向所有活跃订阅者发送事件通知 (fire-and-forget,不等待慢订阅者)""" expired_sids = [] diff --git a/miair/dlna/renderer.py b/miair/dlna/renderer.py index 774d504..8369ffe 100644 --- a/miair/dlna/renderer.py +++ b/miair/dlna/renderer.py @@ -25,10 +25,11 @@ class DLNARenderer: """每个音箱对应一个 DLNA 渲染器实例,管理传输状态""" - def __init__(self, udn: str, friendly_name: str, speaker: SpeakerController): + def __init__(self, udn: str, friendly_name: str, speaker: SpeakerController, default_volume: int = 50, config=None): self.udn = udn self.friendly_name = friendly_name self.speaker = speaker + self.config = config # 保存did以便快速访问 self.did = speaker.did self._lock = asyncio.Lock() @@ -41,9 +42,9 @@ def __init__(self, udn: str, friendly_name: str, speaker: SpeakerController): self.play_speed = "1" # 音量/静音 - self.volume = 50 + self.volume = default_volume self.mute = False - self._pre_mute_volume = 50 + self._pre_mute_volume = default_volume # 事件管理器 (由 DeviceServer 注入) self.event_manager = None @@ -69,6 +70,13 @@ def __init__(self, udn: str, friendly_name: str, speaker: SpeakerController): self._play_check_task: asyncio.Task | None = None # play() 后的宽限期,在此时间之前轮询不覆盖 PLAYING 状态 self._play_grace_until: float = 0.0 + # 用户主动暂停/停止标志:True 表示用户手动暂停/停止,不应自动续播 + self._user_stopped: bool = False + # 最后一次接收 DLNA 控制命令的时间(用于检测控制端断开) + self._last_control_time: float = 0.0 + # 检测 "音箱已停而渲染器被强制保持PAUSED" 的起始时间 + # 当此模式持续超过阈值时,判定控制端已断开并重置为空闲 + self._stuck_paused_since: float = 0.0 # 视频格式扩展名列表 VIDEO_EXTENSIONS = {'.mp4', '.mov', '.avi', '.mkv', '.flv', '.wmv', '.m4v', '.3gp', '.ts', '.mts', '.m2ts'} @@ -161,6 +169,8 @@ async def play(self) -> bool: self._play_check_task = None self.transport_state = TRANSPORT_STATE_TRANSITIONING + self._user_stopped = False + self._stuck_paused_since = 0.0 log.info(f"[{self.friendly_name}] Play: {self.current_uri}") # 计算当前播放位置(用于从暂停位置继续播放) @@ -207,6 +217,7 @@ async def play(self) -> bool: self._play_grace_until = time.time() + 8.0 log.info(f"[{self.friendly_name}] 播放成功") self._play_check_task = asyncio.create_task(self._check_play_status()) + asyncio.create_task(self._apply_default_volume()) else: self.transport_state = TRANSPORT_STATE_STOPPED self._play_grace_until = 0.0 @@ -214,6 +225,25 @@ async def play(self) -> bool: await self.notify_state_change() return success + async def _apply_default_volume(self): + """播放开始后应用默认音量""" + try: + if getattr(self.config, 'follow_device_volume', False): + return + + default_vol = getattr(self.config, 'default_volume', 50) + if default_vol <= 0: + return + + await asyncio.sleep(0.5) + if self.speaker: + await self.speaker.set_volume(default_vol) + self.volume = default_vol + log.info(f"[{self.friendly_name}] 已应用默认音量: {default_vol}%") + await self.notify_state_change() + except Exception as e: + log.error(f"[{self.friendly_name}] 应用默认音量失败: {e}") + async def pause(self) -> bool: """暂停播放 (DLNA Pause)""" async with self._lock: @@ -227,6 +257,7 @@ async def pause(self) -> bool: self._accumulated_time += time.time() - self._play_start_time self._play_start_time = 0.0 self.transport_state = TRANSPORT_STATE_PAUSED + self._user_stopped = True # 取消播放状态检查任务 if self._play_check_task: self._play_check_task.cancel() @@ -250,6 +281,7 @@ async def stop(self) -> bool: self.transport_state = TRANSPORT_STATE_STOPPED self._accumulated_time = 0.0 self._play_start_time = 0.0 + self._user_stopped = True # 取消播放状态检查任务 if self._play_check_task: self._play_check_task.cancel() @@ -258,6 +290,28 @@ async def stop(self) -> bool: await self.notify_state_change() return success + async def reset_to_idle(self): + """重置为空闲状态(控制端断开连接后调用)""" + async with self._lock: + if self.transport_state == TRANSPORT_STATE_NO_MEDIA: + return + old_state = self.transport_state + self.transport_state = TRANSPORT_STATE_NO_MEDIA + self.current_uri = "" + self.current_uri_metadata = "" + self.next_uri = "" + self.next_uri_metadata = "" + self._accumulated_time = 0.0 + self._play_start_time = 0.0 + self._track_duration = 0.0 + self._user_stopped = False + self._stuck_paused_since = 0.0 + if self._play_check_task: + self._play_check_task.cancel() + self._play_check_task = None + log.info(f"[{self.friendly_name}] 控制端断开,重置为空闲 ({old_state})") + await self.notify_state_change() + async def seek(self, unit: str, target: str) -> bool: """Seek - 生成格式正确的 seeked 音频并重新播放 diff --git a/miair/web/api.py b/miair/web/api.py index d141763..2ac8106 100644 --- a/miair/web/api.py +++ b/miair/web/api.py @@ -89,6 +89,9 @@ async def handle_get_setting(request): # 实验性功能 "auto_resume_on_interrupt": config.auto_resume_on_interrupt, "resume_delay_seconds": config.resume_delay_seconds, + "default_volume": config.default_volume, + "follow_device_volume": config.follow_device_volume, + "auto_restart": config.auto_restart, } # 返回已配置的 speakers 信息 @@ -140,7 +143,13 @@ async def handle_save_setting(request): if "auto_resume_on_interrupt" in data: config.auto_resume_on_interrupt = data["auto_resume_on_interrupt"] if "resume_delay_seconds" in data: - config.resume_delay_seconds = data["resume_delay_seconds"] + config.resume_delay_seconds = max(1, min(15, int(data["resume_delay_seconds"]))) + if "default_volume" in data: + config.default_volume = max(1, min(100, int(data["default_volume"]))) + if "follow_device_volume" in data: + config.follow_device_volume = data["follow_device_volume"] + if "auto_restart" in data: + config.auto_restart = data["auto_restart"] # 更新 speaker 名称 if "speakers" in data: diff --git a/miair/web/static/index.html b/miair/web/static/index.html index 0df5de6..d423b44 100644 --- a/miair/web/static/index.html +++ b/miair/web/static/index.html @@ -1,748 +1,1370 @@ + MiAir + + + + + -

-
- -
为小爱音箱添加 DLNA / AirPlay 投送支持
+
+
+
+
+
+ - -
- - 加载中... -
+
+ + 正在同步状态... +
-
- -
-
+
+ +
- 小米账号 + + 设备列表 +
-
- - + +
+
+ 正在加载设备列表... +
-
- - + +
+
-

- 登录 account.xiaomi.com → F12 开发者工具 → 应用程序(Application) → Cookies → 复制 userIdpassToken -

-
- + +
+
+ + +
+
+ + 渲染器媒体状态 + +
+
+
+ 暂无媒体 +
-

-
+ +
- 实验性功能 + + 配置选项 +
+
-
打断后续播
+ 实验性配置
-
-
打断后续播
-
被语音唤醒打断后自动恢复播放
+
+
打断后续播 (Auto-Resume)
+
被语音唤醒等操作打断后自动恢复播放
-
-
- 恢复延迟 - - + +
+
+
自动故障应对
+
当检测到服务或网络发生故障时,将尝试自动重新启动
+
+ +
+ +
+ 续播延迟 (秒) + +
+ +
+
+ 默认音量级别 + 50% +
+ +
+ 1 + 50 + 100 +
+
+ +
+
+
跟随设备当前音量级别
+
+
+
-
端口设置
+ 网络设置
- - + +
- - + +
-
- + +
+
-

+ +
- -
-
-
- 选择音箱 -
-

勾选要作为媒体接收器的小爱音箱,点击名称可自定义显示名称

-
-
请先登录小米账号
-
-
- -
-

+
+ MiAir by KiriChen V0.3.1-alpha +
+
+ + + + + if (data.auto_resume_on_interrupt !== undefined) { + document.getElementById('chk-auto-resume').checked = data.auto_resume_on_interrupt; + } + if (data.resume_delay_seconds !== undefined) { + document.getElementById('input-resume-delay').value = data.resume_delay_seconds; + } + if (data.default_volume !== undefined) { + document.getElementById('input-default-volume').value = data.default_volume; + document.getElementById('volume-display').textContent = data.default_volume + '%'; + } + if (data.follow_device_volume !== undefined) { + document.getElementById('chk-follow-volume').checked = data.follow_device_volume; + } + if (data.auto_restart !== undefined) { + document.getElementById('chk-auto-restart').checked = data.auto_restart; + } + toggleDefaultVolume(); + } + + function toggleDefaultVolume() { + const follow = document.getElementById('chk-follow-volume').checked; + const div = document.getElementById('div-default-volume'); + if (follow) { + div.style.opacity = '0.5'; + div.style.pointerEvents = 'none'; + } else { + div.style.opacity = '1'; + div.style.pointerEvents = 'auto'; + } + } + + function updateStatusBar(data) { + const bar = document.getElementById('status-bar'); + const text = document.getElementById('status-text'); + + if (data.dlna_running) { + bar.className = 'status-bar status-running'; + text.textContent = `服务运行中 · ${data.renderers_count} 个渲染器正活跃`; + } else if (!data.has_account) { + bar.className = 'status-bar status-stopped'; + text.textContent = '等待配置小米账号'; + } else if (!data.mi_did) { + bar.className = 'status-bar status-stopped'; + text.textContent = '已登录,请选择设备'; + } else { + bar.className = 'status-bar status-stopped'; + text.textContent = '服务已就绪...'; + } + } + + const deviceModelMap = { + 'L06A': { model: '小爱音箱', image: 'L06A.webp' }, + 'L07A': { model: 'Redmi小爱音箱 Play', image: 'L07A.webp' }, + 'S12': { model: '小米AI音箱', image: 'S12_S12A_MDZ-25-DA.webp' }, + 'S12A': { model: '小米AI音箱', image: 'S12_S12A_MDZ-25-DA.webp' }, + 'MDZ-25-DA': { model: '小米AI音箱', image: 'S12_S12A_MDZ-25-DA.webp' }, + 'LX5A': { model: '小爱音箱 万能遥控版', image: 'LX5A.webp' }, + 'LX05': { model: '小爱音箱Play (2019款)', image: 'LX05.webp' }, + 'L15A': { model: '小米AI音箱(第二代)', image: 'L15A.webp' }, + 'L16A': { model: 'Xiaomi Sound', image: 'L16A.webp' }, + 'L17A': { model: 'Xiaomi Sound Pro', image: 'L17A.webp' }, + 'LX06': { model: '小爱音箱Pro', image: 'LX06.webp' }, + 'LX01': { model: '小爱音箱mini', image: 'LX01.webp' }, + 'L05B': { model: '小爱音箱Play', image: 'L05B.webp' }, + 'L05C': { model: '小爱音箱Play 增强版', image: 'L05C.webp' }, + 'L09A': { model: '小爱音箱Art', image: 'L09A.webp' }, + 'LX04': { model: '小爱触屏音箱', image: 'LX04_X10A_X08A.webp' }, + 'X10A': { model: '小爱触屏音箱', image: 'LX04_X10A_X08A.webp' }, + 'X08A': { model: '小爱触屏音箱', image: 'LX04_X10A_X08A.webp' }, + 'X08C': { model: '小米触屏音箱', image: 'X08C_X08E_X8F.webp' }, + 'X08E': { model: '小米触屏音箱', image: 'X08C_X08E_X8F.webp' }, + 'X8F': { model: '小米触屏音箱', image: 'X08C_X08E_X8F.webp' }, + 'M01': { model: '小爱音箱HD', image: 'L05B.webp' }, + 'XMYX01JY': { model: '小爱音箱HD', image: 'L05B.webp' }, + 'OH2P': { model: 'Xiaomi 智能音箱 Pro', image: 'OH2P.webp' }, + 'OH2': { model: 'Xiaomi 智能音箱', image: 'OH2.webp' } + }; + + function getDeviceInfo(hardware) { + const h = hardware || ''; + for (const key in deviceModelMap) { + if (h.includes(key)) return deviceModelMap[key]; + } + return { model: h || '未知音箱', image: 'L05B.webp' }; + } + + function renderDeviceList(devices, selectedDids) { + const container = document.getElementById('device-list'); + const selectedList = selectedDids ? selectedDids.split(',') : []; + + if (!devices.length) { + container.innerHTML = '
未发现任何设备,请检查账号是否配置正确
'; + return; + } + + let html = ''; + devices.forEach(dev => { + const did = dev.miotDID; + const isSelected = selectedList.includes(did); + const info = getDeviceInfo(dev.hardware); + const displayName = (currentSetting.speakers && currentSetting.speakers[did]) + ? currentSetting.speakers[did].dlna_name : dev.name; + + html += ` +
+ +
+ +
${info.model} · ${dev.hardware}
+
+
+ + + +
+
`; + }); + container.innerHTML = html; + document.getElementById('btn-save').disabled = false; + } + + function toggleDevice(el, did) { + el.classList.toggle('selected'); + const svg = el.querySelector('.device-checkbox svg'); + if (el.classList.contains('selected')) { + svg.setAttribute('stroke', 'var(--accent)'); + } else { + svg.setAttribute('stroke', 'var(--text-muted)'); + } + } + + async function saveSelection() { + const btn = document.getElementById('btn-save'); + const selected = Array.from(document.querySelectorAll('.device-item.selected')) + .map(item => item.querySelector('input').getAttribute('onblur').match(/'([^']+)'/)[1]); + + showLoading(btn, true, '正在保存'); + try { + await fetch('/api/setting', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ mi_did: selected.join(',') }), + }); + showLoading(btn, true, '正在同步'); + setTimeout(() => location.reload(), 3000); + } catch (e) { + showLoading(btn, true, '正在同步'); + setTimeout(() => location.reload(), 4000); + } + } + + async function loginXiaomi() { + const btn = document.getElementById('btn-login'); + const tip = document.getElementById('tip-account'); + const uid = document.getElementById('input-userId').value.trim(); + const token = document.getElementById('input-passToken').value.trim(); + + if (!uid || !token) { + showTip(tip, '请输入完整的信息', 'error'); + return; + } + + showLoading(btn, true, '正在保存'); + try { + await fetch('/api/setting', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ cookie: `userId=${uid}; passToken=${token}` }), + }); + showLoading(btn, true, '正在同步'); + setTimeout(() => location.reload(), 3000); + } catch (e) { + showLoading(btn, true, '正在同步'); + setTimeout(() => location.reload(), 4000); + } + } + + async function saveExperimental() { + const btn = document.getElementById('btn-save-experimental'); + const data = { + auto_resume_on_interrupt: document.getElementById('chk-auto-resume').checked, + resume_delay_seconds: parseInt(document.getElementById('input-resume-delay').value), + default_volume: parseInt(document.getElementById('input-default-volume').value), + follow_device_volume: document.getElementById('chk-follow-volume').checked, + auto_restart: document.getElementById('chk-auto-restart').checked, + dlna_port: parseInt(document.getElementById('input-dlna-port').value), + web_port: parseInt(document.getElementById('input-web-port').value), + }; + + showLoading(btn, true, '正在保存'); + try { + await fetch('/api/setting', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data), + }); + showLoading(btn, true, '正在同步'); + setTimeout(() => location.reload(), 3000); + } catch (e) { + showLoading(btn, true, '正在同步'); + setTimeout(() => location.reload(), 4000); + } + } + + async function renameDevice(did, name) { + if (!name) return; + try { + await fetch(`/api/speakers/${did}/rename`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ dlna_name: name }), + }); + } catch (e) { console.error('Rename failed:', e); } + } + + async function fetchRenderers() { + try { + const resp = await fetch('/api/speakers'); + const speakers = await resp.json(); + renderRenderers(speakers); + } catch (e) { } + } + + function renderRenderers(speakers) { + const container = document.getElementById('renderers-list'); + if (!speakers.length) { + container.innerHTML = '
暂无媒体
'; + return; + } + + const stateMap = { + 'NO_MEDIA_PRESENT': '空闲', + 'STOPPED': '已停止', + 'PLAYING': '播放中', + 'PAUSED_PLAYBACK': '已暂停', + 'TRANSITIONING': '加载中' + }; + + let html = ''; + speakers.forEach(s => { + const isPlaying = s.airplay_active || s.transport_state === 'PLAYING'; + // 只有在非空闲(有媒体、播放中、暂停等)时才显示标签 + const showBadge = s.airplay_active || (s.current_uri && s.transport_state !== 'NO_MEDIA_PRESENT'); + + const info = getDeviceInfo(s.hardware); + let source = s.airplay_active ? (s.airplay_client || '苹果设备') : formatSource(s.current_uri); + + html += ` +
+
+
+ ${s.dlna_name} + ${showBadge ? `${s.airplay_active ? 'AirPlay' : 'DLNA'}` : ''} +
+
${info.model} · ${source ? '来自 ' + source : '暂无媒体'}
+
+
+ ${isPlaying ? '正在播放' : (stateMap[s.transport_state] || '待机')} +
+
`; + }); + container.innerHTML = html; + } + + function formatSource(uri) { + if (!uri) return ''; + try { + const host = new URL(uri).hostname; + if (host.includes('qq.com')) return 'QQ音乐'; + if (host.includes('music.126.net') || host.includes('163.com')) return '网易云音乐'; + if (host.includes('kugou.com')) return '酷狗音乐'; + return host; + } catch { return '外部音频'; } + } + + // UI Utils + function openAccountModal() { document.getElementById('modal-account').classList.add('active'); } + function closeAccountModal() { document.getElementById('modal-account').classList.remove('active'); } + + function showTip(el, msg, type, duration = 5000) { + el.textContent = msg; + el.className = `tip active tip-${type}`; + if (duration) setTimeout(() => el.classList.remove('active'), duration); + } + + function showLoading(btn, loading, text) { + if (loading) { + btn.disabled = true; + btn.dataset.original = btn.innerHTML; + btn.innerHTML = `
${text}...`; + } else { + btn.disabled = false; + btn.innerHTML = btn.dataset.original || text; + } + } + - + + \ No newline at end of file From 1025baeca5f55e23d09288e2a9e0d73e678a7229 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Sun, 3 May 2026 03:05:39 +0800 Subject: [PATCH 36/83] v0.3.1-alpha --- README.md | 2 ++ pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 12fd8b4..9e6c2c5 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,10 @@ chmod +x deploy.sh manage.sh 安装完成后访问 `http://容器宿主机IP:8300` 即可打开 Web 管理界面。 请确保容器网络为Host。\ +请确保 Docker 容器重启策略设定为 Unless Stopped。\ 部分情况下,修改配置后容器可能无法自动重启,请手动重启容器。 + ### Docker 相关命令 ```bash docker logs -f miair # 查看日志 diff --git a/pyproject.toml b/pyproject.toml index aafdf40..c7959f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "miair" -version = "0.2.1" +version = "0.3.1" description = "Make Xiaomi AI speakers act as Music renderers" readme = "README.md" license = {text = "MIT"} From b0583541801388460d2face6d593486d841ae9df Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Sun, 3 May 2026 03:32:07 +0800 Subject: [PATCH 37/83] v0.3.1-alpha --- miair/app.py | 6 ++++++ miair/auth.py | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/miair/app.py b/miair/app.py index 774efab..a78f01a 100644 --- a/miair/app.py +++ b/miair/app.py @@ -105,6 +105,12 @@ async def _start_dlna_services(self): self._did_to_udn.clear() if hasattr(self, 'speaker_manager'): self.speaker_manager.controllers.clear() + + # 如果开启了自动重启,则尝试重启 + if self.config.auto_restart: + log.warning("未获取到设备列表,正在尝试自动重启程序...") + from miair.web.api import _restart_process + asyncio.get_running_loop().call_later(5, _restart_process) return # 初始化音箱 diff --git a/miair/auth.py b/miair/auth.py index 112db96..b8b90d6 100644 --- a/miair/auth.py +++ b/miair/auth.py @@ -128,7 +128,12 @@ async def login(self): log.warning("检测到登录失败,正在尝试自动重启程序以恢复服务...") from miair.web.api import _restart_process import asyncio - asyncio.get_running_loop().call_later(5, _restart_process) + try: + loop = asyncio.get_running_loop() + loop.call_later(5, _restart_process) + except RuntimeError: + # 如果没有正在运行的 loop,则直接重启 + _restart_process() # 无论是否登录成功,都设置 service (方便后续重试) self.mina_service = MiNAService(self.account) From d8fedc2598f7925acdcdf2e13c1a79d8d290486d Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Sun, 3 May 2026 03:44:43 +0800 Subject: [PATCH 38/83] v0.3.1-alpha --- miair/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miair/config.py b/miair/config.py index 01e99a5..1d84045 100644 --- a/miair/config.py +++ b/miair/config.py @@ -73,7 +73,7 @@ class Config: # 语音控制 enable_voice_control: bool = False # 自动重启(当登录失败或服务异常时) - auto_restart: bool = True + auto_restart: bool = False voice_poll_interval: int = 1 speakers: dict = field(default_factory=dict) From f87d0716916624b99a3c704404d49f1b4a5d5690 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Sun, 3 May 2026 03:53:31 +0800 Subject: [PATCH 39/83] v0.3.1-alpha --- miair/config.py | 2 +- miair/web/static/index.html | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/miair/config.py b/miair/config.py index 1d84045..5d0fb33 100644 --- a/miair/config.py +++ b/miair/config.py @@ -67,7 +67,7 @@ class Config: auto_resume_on_interrupt: bool = False resume_delay_seconds: int = 5 # 默认音量 (1-100) - default_volume: int = 50 + default_volume: int = 38 # 实验性功能:跟随设备当前音量 follow_device_volume: bool = False # 语音控制 diff --git a/miair/web/static/index.html b/miair/web/static/index.html index d423b44..68ba953 100644 --- a/miair/web/static/index.html +++ b/miair/web/static/index.html @@ -930,14 +930,14 @@
默认音量级别 - 50% + 38%
-
1 - 50 + 38 100
From ab392adb4680c0d02fc5a27f956a7317a514e451 Mon Sep 17 00:00:00 2001 From: lyj Date: Mon, 4 May 2026 22:24:37 +0800 Subject: [PATCH 40/83] Refactor get_lan_ip function for IP retrieval --- deploy.sh | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/deploy.sh b/deploy.sh index f628790..ec234b0 100644 --- a/deploy.sh +++ b/deploy.sh @@ -99,38 +99,22 @@ echo -e "${GREEN}[2/8] 获取局域网 IP...${NC}" # 获取 LAN 口 IP 的函数:按优先级依次尝试各种方式 get_lan_ip() { - local ip="" - - # 1. 优先尝试常见 LAN 桥接口名 - for iface in br-lan br0 eth0 eth1 lan; do - ip=$(ip addr show "$iface" 2>/dev/null \ - | grep -oP 'inet \K[\d.]+' \ - | grep -v '^127\.' | head -1) - [ -n "$ip" ] && echo "$ip" && return - done + local ip - # 2. 找所有以 br- 开头的桥接口 - for iface in $(ip link show 2>/dev/null | awk -F': ' '/^[0-9]+: br-/{print $2}'); do - ip=$(ip addr show "$iface" 2>/dev/null \ - | grep -oP 'inet \K[\d.]+' \ - | grep -v '^127\.' | head -1) - [ -n "$ip" ] && echo "$ip" && return - done + # 最获取默认出网使用的本机源 IP + ip=$(ip -4 route get 1.1.1.1 2>/dev/null \ + | awk '{for(i=1;i<=NF;i++) if($i=="src") {print $(i+1); exit}}') - # 3. 取默认路由出口接口的 IP - local gw_iface - gw_iface=$(ip route 2>/dev/null | awk '/^default/{print $5; exit}') - if [ -n "$gw_iface" ]; then - ip=$(ip addr show "$gw_iface" 2>/dev/null \ - | grep -oP 'inet \K[\d.]+' \ - | grep -v '^127\.' | head -1) - [ -n "$ip" ] && echo "$ip" && return - fi + [ -n "$ip" ] && echo "$ip" && return + + # 没有默认路由时,兜底取第一个非 lo/docker/tailscale/veth/br-* 的 IPv4 + ip=$(ip -o -4 addr show scope global 2>/dev/null \ + | awk '$2 !~ /^(lo|docker0|tailscale0|veth.*|br-[a-f0-9]+)$/ { + split($4,a,"/"); + print a[1]; + exit + }') - # 4. 兜底:取第一个非 lo、非 docker 的内网 IP - ip=$(ip addr 2>/dev/null \ - | grep -oP 'inet \K(192\.168|10\.|172\.(1[6-9]|2[0-9]|3[01]))[\d.]+' \ - | head -1) [ -n "$ip" ] && echo "$ip" && return echo "127.0.0.1" From d01ac3d20b7add4cf0357491d31e636b10bfa50b Mon Sep 17 00:00:00 2001 From: Autumn <44563868+autunn@users.noreply.github.com> Date: Tue, 5 May 2026 02:31:21 +0800 Subject: [PATCH 41/83] Create build.yml --- .github/workflows/build.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..0763873 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,32 @@ +name: Build and Push Docker Image + +on: + push: + branches: [ "main" ] + workflow_dispatch: # 允许在网页上手动点击运行 + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write # 授予推送到 GitHub Packages 的权限 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to the GitHub Container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + # 这里的 autunn 是您的 GitHub 用户名,会自动打包并打上 latest 标签 + tags: ghcr.io/autunn/miair:latest From 7b6373aa2cef508e384f426a5b6d607971ed8453 Mon Sep 17 00:00:00 2001 From: Autumn <1150108426@qq.com> Date: Tue, 5 May 2026 02:31:32 +0800 Subject: [PATCH 42/83] Update Dockerfile --- Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index df24964..4c9cccc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,7 @@ FROM python:3.12-slim LABEL maintainer="MiAir" LABEL description="DLNA/AirPlay receiver for Xiaomi AI Speaker" +# 保持官方默认源,仅安装必要的依赖(包含群友补充的 dnsutils) RUN apt-get update && apt-get install -y --no-install-recommends \ ffmpeg \ libportaudio2 \ @@ -12,13 +13,16 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /app COPY pyproject.toml . +# 保持官方 pip 源进行安装 RUN pip install --no-cache-dir . --root-user-action=ignore COPY miair.py ./ COPY miair/ ./miair/ +# 保留群友的优秀修改:统一配置文件夹 RUN mkdir -p /app/conf EXPOSE 8200 8300 -ENTRYPOINT ["python", "miair.py", "--conf-path", "/app/conf"] +# 启动命令指向新建的配置文件夹 +ENTRYPOINT ["python", "miair.py", "--conf-path", "/app/conf"] \ No newline at end of file From 0710fefef88919178df9cc1cc05a54049843aae3 Mon Sep 17 00:00:00 2001 From: Autumn <44563868+autunn@users.noreply.github.com> Date: Tue, 5 May 2026 02:40:36 +0800 Subject: [PATCH 43/83] Update Dockerfile --- Dockerfile | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4c9cccc..a7ca814 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,6 @@ FROM python:3.12-slim LABEL maintainer="MiAir" LABEL description="DLNA/AirPlay receiver for Xiaomi AI Speaker" -# 保持官方默认源,仅安装必要的依赖(包含群友补充的 dnsutils) RUN apt-get update && apt-get install -y --no-install-recommends \ ffmpeg \ libportaudio2 \ @@ -13,16 +12,19 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /app COPY pyproject.toml . -# 保持官方 pip 源进行安装 RUN pip install --no-cache-dir . --root-user-action=ignore +# 这里明确把示例配置文件也拷贝进镜像的备用区 +COPY config-example.json .env.example ./ COPY miair.py ./ COPY miair/ ./miair/ -# 保留群友的优秀修改:统一配置文件夹 RUN mkdir -p /app/conf EXPOSE 8200 8300 -# 启动命令指向新建的配置文件夹 -ENTRYPOINT ["python", "miair.py", "--conf-path", "/app/conf"] \ No newline at end of file +# 【核心修改】智能启动命令: +# 1. 检查 /app/conf/config.json 是否存在,不存在就复制一份示例文件过去 +# 2. 检查 /app/conf/.env 是否存在,不存在也复制过去 +# 3. 最后使用 exec 移交进程控制权并启动真正的 Python 服务 +ENTRYPOINT ["/bin/sh", "-c", "if [ ! -f /app/conf/config.json ]; then cp /app/config-example.json /app/conf/config.json; fi && if [ ! -f /app/conf/.env ]; then cp /app/.env.example /app/conf/.env; fi && exec python miair.py --conf-path /app/conf"] From 25f174b876e8b9a86624645c828b9b55dce00608 Mon Sep 17 00:00:00 2001 From: KiriChen-Wind <1841938040@qq.com> Date: Thu, 7 May 2026 01:08:43 +0800 Subject: [PATCH 44/83] v0.3.7-alpha --- miair/config.py | 2 +- miair/const.py | 4 + miair/dlna/device_server.py | 3 + miair/dlna/renderer.py | 12 ++- miair/speaker.py | 15 +++- miair/web/api.py | 5 +- miair/web/static/index.html | 166 +++++++++++++++++++++++++++++++----- pyproject.toml | 2 +- 8 files changed, 183 insertions(+), 26 deletions(-) diff --git a/miair/config.py b/miair/config.py index 5d0fb33..7f6a94d 100644 --- a/miair/config.py +++ b/miair/config.py @@ -69,7 +69,7 @@ class Config: # 默认音量 (1-100) default_volume: int = 38 # 实验性功能:跟随设备当前音量 - follow_device_volume: bool = False + follow_device_volume: bool = True # 语音控制 enable_voice_control: bool = False # 自动重启(当登录失败或服务异常时) diff --git a/miair/const.py b/miair/const.py index fafe202..997ebb4 100644 --- a/miair/const.py +++ b/miair/const.py @@ -1,5 +1,8 @@ """MiAir 常量定义""" +VERSION = "0.3.7-alpha" + + # SSDP 相关 SSDP_ADDR = "239.255.255.250" SSDP_PORT = 1900 @@ -40,6 +43,7 @@ "X8F", "X4B", "LX05", + "LX05A", "OH2", "OH2P", "X6A", diff --git a/miair/dlna/device_server.py b/miair/dlna/device_server.py index 17086bc..bc9aeab 100644 --- a/miair/dlna/device_server.py +++ b/miair/dlna/device_server.py @@ -1135,6 +1135,9 @@ async def _handle_subscribe(self, request: web.Request) -> web.Response: # 发送初始事件 (参照 MaCast: 在后台发送完整状态,不阻塞 SUBSCRIBE 响应) renderer = self.renderers.get(udn) if renderer: + # 客户端建立新订阅,视为新会话或重连,重置音量初始化标志 + # 以便在接下来的播放中重新应用默认音量 + renderer._volume_initialized = False task = asyncio.get_running_loop().create_task( self._send_initial_event(event_manager, sid, renderer, service) ) diff --git a/miair/dlna/renderer.py b/miair/dlna/renderer.py index 8369ffe..e242280 100644 --- a/miair/dlna/renderer.py +++ b/miair/dlna/renderer.py @@ -77,6 +77,8 @@ def __init__(self, udn: str, friendly_name: str, speaker: SpeakerController, def # 检测 "音箱已停而渲染器被强制保持PAUSED" 的起始时间 # 当此模式持续超过阈值时,判定控制端已断开并重置为空闲 self._stuck_paused_since: float = 0.0 + # 标记是否已应用过默认音量(避免切歌时重复重置) + self._volume_initialized: bool = False # 视频格式扩展名列表 VIDEO_EXTENSIONS = {'.mp4', '.mov', '.avi', '.mkv', '.flv', '.wmv', '.m4v', '.3gp', '.ts', '.mts', '.m2ts'} @@ -226,11 +228,15 @@ async def play(self) -> bool: return success async def _apply_default_volume(self): - """播放开始后应用默认音量""" + """播放开始后应用默认音量(仅首次连接时应用,切歌不重置)""" try: if getattr(self.config, 'follow_device_volume', False): return + # 仅首次播放时应用默认音量,避免切歌时覆盖用户调整的音量 + if self._volume_initialized: + return + default_vol = getattr(self.config, 'default_volume', 50) if default_vol <= 0: return @@ -239,6 +245,7 @@ async def _apply_default_volume(self): if self.speaker: await self.speaker.set_volume(default_vol) self.volume = default_vol + self._volume_initialized = True log.info(f"[{self.friendly_name}] 已应用默认音量: {default_vol}%") await self.notify_state_change() except Exception as e: @@ -258,6 +265,8 @@ async def pause(self) -> bool: self._play_start_time = 0.0 self.transport_state = TRANSPORT_STATE_PAUSED self._user_stopped = True + # 启动 idle 超时计时器,以便控制端断开后可以正常重置 + self._stuck_paused_since = time.time() # 取消播放状态检查任务 if self._play_check_task: self._play_check_task.cancel() @@ -306,6 +315,7 @@ async def reset_to_idle(self): self._track_duration = 0.0 self._user_stopped = False self._stuck_paused_since = 0.0 + self._volume_initialized = False if self._play_check_task: self._play_check_task.cancel() self._play_check_task = None diff --git a/miair/speaker.py b/miair/speaker.py index 7fcfe8e..1f1ff9b 100644 --- a/miair/speaker.py +++ b/miair/speaker.py @@ -72,8 +72,14 @@ async def pause(self) -> bool: """暂停播放""" try: await self.auth.ensure_login() - ret = await self.auth.mina_service.player_pause(self.device_id) - log.info(f"player_pause device_id={self.device_id} ret={ret}") + if self._should_use_music_api(): + # 某些使用 play_by_music_url 的设备,调用 pause 后 API 状态不会 + # 正确更新为 paused (status=2),需改用 stop 来实现暂停语义 + ret = await self.auth.mina_service.player_stop(self.device_id) + log.info(f"player_stop(as pause) device_id={self.device_id} ret={ret}") + else: + ret = await self.auth.mina_service.player_pause(self.device_id) + log.info(f"player_pause device_id={self.device_id} ret={ret}") return True except Exception as e: log.error(f"pause 失败: {e}") @@ -86,7 +92,10 @@ async def pause(self) -> bool: # 重新尝试暂停 try: await self.auth.ensure_login() - await self.auth.mina_service.player_pause(self.device_id) + if self._should_use_music_api(): + await self.auth.mina_service.player_stop(self.device_id) + else: + await self.auth.mina_service.player_pause(self.device_id) return True except Exception as e2: log.error(f"重新登录后 pause 仍然失败: {e2}") diff --git a/miair/web/api.py b/miair/web/api.py index 2ac8106..2d730c3 100644 --- a/miair/web/api.py +++ b/miair/web/api.py @@ -10,6 +10,8 @@ import asyncio from miair.config import Config +from miair.const import VERSION + log = logging.getLogger("miair") @@ -76,6 +78,7 @@ async def handle_get_setting(request): need_device_list = request.query.get("need_device_list", "false") == "true" data = { + "version": VERSION, "hostname": config.hostname, "dlna_port": config.dlna_port, "web_port": config.web_port, @@ -248,7 +251,7 @@ async def handle_rename_speaker(request): async def handle_status(request): """系统状态""" return web.json_response({ - "version": "0.1.0", + "version": VERSION, "dlna_running": app_instance.dlna_running, "renderers_count": len(app_instance.renderers), "hostname": config.hostname, diff --git a/miair/web/static/index.html b/miair/web/static/index.html index 68ba953..10e58eb 100644 --- a/miair/web/static/index.html +++ b/miair/web/static/index.html @@ -137,10 +137,21 @@ } @keyframes blob-float { - 0% { transform: translate(0, 0) scale(1) rotate(0deg); } - 33% { transform: translate(30%, 20%) scale(1.3) rotate(120deg); } - 66% { transform: translate(-20%, 40%) scale(0.7) rotate(240deg); } - 100% { transform: translate(0, 0) scale(1) rotate(360deg); } + 0% { + transform: translate(0, 0) scale(1) rotate(0deg); + } + + 33% { + transform: translate(30%, 20%) scale(1.3) rotate(120deg); + } + + 66% { + transform: translate(-20%, 40%) scale(0.7) rotate(240deg); + } + + 100% { + transform: translate(0, 0) scale(1) rotate(360deg); + } } .container { @@ -157,14 +168,14 @@ flex-direction: column; gap: 4px; } - + .nav-top { display: flex; justify-content: space-between; align-items: center; gap: 16px; } - + .logo { font-family: 'Outfit', sans-serif; font-size: 28px; @@ -174,8 +185,10 @@ -webkit-background-clip: text; -webkit-text-fill-color: transparent; line-height: 1.2; + display: flex; + align-items: center; } - + .tagline { font-size: 13px; color: var(--text-secondary); @@ -211,7 +224,7 @@ .status-running { border-color: rgba(59, 130, 246, 0.2); } - + @media (prefers-color-scheme: light) { .status-running { border-color: rgba(37, 99, 235, 0.15); @@ -819,6 +832,65 @@ .text-link:hover { text-decoration: underline; } + + .update-badge { + position: relative; + display: inline-flex; + align-items: center; + background: rgba(59, 130, 246, 0.1); + color: var(--accent); + padding: 5px 8px; + border-radius: 6px; + font-size: 12px; + font-weight: 800; + margin-left: 12px; + margin-top: -4px; + text-decoration: none; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + border: 1px solid rgba(59, 130, 246, 0.2); + vertical-align: middle; + cursor: pointer; + overflow: hidden; + -webkit-text-fill-color: initial; + /* 修复因继承 logo 样式导致的文字透明问题 */ + } + + /* 高光划过效果 */ + .update-badge::after { + content: ""; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, + transparent, + rgba(255, 255, 255, 0.2), + transparent); + transform: skewX(-25deg); + animation: shine 4s infinite; + } + + @keyframes shine { + 0% { + left: -150%; + } + + 30% { + left: 150%; + } + + 100% { + left: 150%; + } + } + + .update-badge:hover { + background: rgba(59, 130, 246, 0.2); + border-color: var(--accent); + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15); + } @@ -831,11 +903,14 @@
+ + +