flet-audio 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flet-audio might be problematic. Click here for more details.

@@ -0,0 +1,43 @@
1
+ Metadata-Version: 2.2
2
+ Name: flet-audio
3
+ Version: 0.1.0
4
+ Summary: Audio control for Flet
5
+ Author-email: Flet contributors <hello@flet.dev>
6
+ Project-URL: Homepage, https://flet.dev
7
+ Project-URL: Documentation, https://flet.dev/docs/controls/audio
8
+ Project-URL: Repository, https://github.com/flet-dev/flet-audio
9
+ Project-URL: Issues, https://github.com/flet-dev/flet-audio/issues
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Requires-Python: >=3.8
12
+ Description-Content-Type: text/markdown
13
+ Requires-Dist: flet>=0.25.1
14
+
15
+ # Flet Audio control
16
+
17
+ `Audio` control for Flet.
18
+
19
+ ## Usage
20
+
21
+ Add `flet-audio` as dependency (`pyproject.toml` or `requirements.txt`) to your Flet project.
22
+
23
+ ## Example
24
+
25
+ ```py
26
+
27
+ import flet as ft
28
+
29
+ import flet_audio as fta
30
+
31
+
32
+ def main(page: ft.Page):
33
+ audio1 = fta.Audio(
34
+ src="https://luan.xyz/files/audio/ambient_c_motion.mp3", autoplay=True
35
+ )
36
+ page.overlay.append(audio1)
37
+ page.add(
38
+ ft.Text("This is an app with background audio."),
39
+ ft.ElevatedButton("Stop playing", on_click=lambda _: audio1.pause()),
40
+ )
41
+
42
+ ft.app(main)
43
+ ```
@@ -0,0 +1,29 @@
1
+ # Flet Audio control
2
+
3
+ `Audio` control for Flet.
4
+
5
+ ## Usage
6
+
7
+ Add `flet-audio` as dependency (`pyproject.toml` or `requirements.txt`) to your Flet project.
8
+
9
+ ## Example
10
+
11
+ ```py
12
+
13
+ import flet as ft
14
+
15
+ import flet_audio as fta
16
+
17
+
18
+ def main(page: ft.Page):
19
+ audio1 = fta.Audio(
20
+ src="https://luan.xyz/files/audio/ambient_c_motion.mp3", autoplay=True
21
+ )
22
+ page.overlay.append(audio1)
23
+ page.add(
24
+ ft.Text("This is an app with background audio."),
25
+ ft.ElevatedButton("Stop playing", on_click=lambda _: audio1.pause()),
26
+ )
27
+
28
+ ft.app(main)
29
+ ```
@@ -0,0 +1,36 @@
1
+ [project]
2
+ name = "flet-audio"
3
+ version = "0.1.0"
4
+ description = "Audio control for Flet"
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "Flet contributors", email = "hello@flet.dev" }
8
+ ]
9
+ classifiers = [
10
+ "License :: OSI Approved :: Apache Software License",
11
+ ]
12
+ requires-python = ">=3.8"
13
+ dependencies = [
14
+ "flet>=0.25.1",
15
+ ]
16
+
17
+ [project.urls]
18
+ Homepage = "https://flet.dev"
19
+ Documentation = "https://flet.dev/docs/controls/audio"
20
+ Repository = "https://github.com/flet-dev/flet-audio"
21
+ Issues = "https://github.com/flet-dev/flet-audio/issues"
22
+
23
+ [tool.setuptools.package-data]
24
+ "flutter.flet_audio" = ["**/*"]
25
+
26
+ [tool.uv]
27
+ dev-dependencies = [
28
+ "flet[all]>=0.25.1",
29
+ ]
30
+
31
+ [tool.setuptools]
32
+ license-files = []
33
+
34
+ [build-system]
35
+ requires = ["setuptools"]
36
+ build-backend = "setuptools.build_meta"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,7 @@
1
+ from flet_audio.audio import (
2
+ Audio,
3
+ AudioDurationChangeEvent,
4
+ AudioPositionChangeEvent,
5
+ AudioState,
6
+ AudioStateChangeEvent,
7
+ )
@@ -0,0 +1,294 @@
1
+ from enum import Enum
2
+ from typing import Any, Optional
3
+
4
+ from flet.core.control import Control, OptionalNumber
5
+ from flet.core.control_event import ControlEvent
6
+ from flet.core.event_handler import EventHandler
7
+ from flet.core.ref import Ref
8
+ from flet.core.types import OptionalControlEventCallable, OptionalEventCallable
9
+ from flet.utils import deprecated
10
+
11
+
12
+ class ReleaseMode(Enum):
13
+ RELEASE = "release"
14
+ LOOP = "loop"
15
+ STOP = "stop"
16
+
17
+
18
+ class AudioState(Enum):
19
+ STOPPED = "stopped"
20
+ PLAYING = "playing"
21
+ PAUSED = "paused"
22
+ COMPLETED = "completed"
23
+ DISPOSED = "disposed"
24
+
25
+
26
+ class AudioStateChangeEvent(ControlEvent):
27
+ def __init__(self, e: ControlEvent):
28
+ super().__init__(e.target, e.name, e.data, e.control, e.page)
29
+ self.state: AudioState = AudioState(e.data)
30
+
31
+
32
+ class AudioPositionChangeEvent(ControlEvent):
33
+ def __init__(self, e: ControlEvent):
34
+ super().__init__(e.target, e.name, e.data, e.control, e.page)
35
+ self.position: int = int(e.data)
36
+
37
+
38
+ class AudioDurationChangeEvent(ControlEvent):
39
+ def __init__(self, e: ControlEvent):
40
+ super().__init__(e.target, e.name, e.data, e.control, e.page)
41
+ self.duration: int = int(e.data)
42
+
43
+
44
+ class Audio(Control):
45
+ """
46
+ A control to simultaneously play multiple audio files. Works on macOS, Linux, Windows, iOS, Android and web. Based on audioplayers Flutter widget (https://pub.dev/packages/audioplayers).
47
+
48
+ Audio control is non-visual and should be added to `page.overlay` list.
49
+
50
+ Example:
51
+ ```
52
+ import flet as ft
53
+
54
+ import flet_audio as fta
55
+
56
+ def main(page: ft.Page):
57
+ audio1 = fta.Audio(
58
+ src="https://luan.xyz/files/audio/ambient_c_motion.mp3", autoplay=True
59
+ )
60
+ page.overlay.append(audio1)
61
+ page.add(
62
+ ft.Text("This is an app with background audio."),
63
+ ft.ElevatedButton("Stop playing", on_click=lambda _: audio1.pause()),
64
+ )
65
+
66
+ ft.app(target=main)
67
+ ```
68
+
69
+ -----
70
+
71
+ Online docs: https://flet.dev/docs/controls/audio
72
+ """
73
+
74
+ def __init__(
75
+ self,
76
+ src: Optional[str] = None,
77
+ src_base64: Optional[str] = None,
78
+ autoplay: Optional[bool] = None,
79
+ volume: OptionalNumber = None,
80
+ balance: OptionalNumber = None,
81
+ playback_rate: OptionalNumber = None,
82
+ release_mode: Optional[ReleaseMode] = None,
83
+ on_loaded: OptionalControlEventCallable = None,
84
+ on_duration_changed: OptionalEventCallable[AudioDurationChangeEvent] = None,
85
+ on_state_changed: OptionalEventCallable[AudioStateChangeEvent] = None,
86
+ on_position_changed: OptionalEventCallable[AudioPositionChangeEvent] = None,
87
+ on_seek_complete: OptionalControlEventCallable = None,
88
+ #
89
+ # Control
90
+ #
91
+ ref: Optional[Ref] = None,
92
+ data: Any = None,
93
+ ):
94
+ Control.__init__(
95
+ self,
96
+ ref=ref,
97
+ data=data,
98
+ )
99
+
100
+ self.__on_state_changed = EventHandler(lambda e: AudioStateChangeEvent(e))
101
+ self._add_event_handler("state_changed", self.__on_state_changed.get_handler())
102
+
103
+ self.__on_position_changed = EventHandler(lambda e: AudioPositionChangeEvent(e))
104
+ self._add_event_handler(
105
+ "position_changed", self.__on_position_changed.get_handler()
106
+ )
107
+
108
+ self.__on_duration_changed = EventHandler(lambda e: AudioDurationChangeEvent(e))
109
+ self._add_event_handler(
110
+ "duration_changed", self.__on_duration_changed.get_handler()
111
+ )
112
+
113
+ self.src = src
114
+ self.src_base64 = src_base64
115
+ self.autoplay = autoplay
116
+ self.volume = volume
117
+ self.balance = balance
118
+ self.playback_rate = playback_rate
119
+ self.release_mode = release_mode
120
+ self.on_loaded = on_loaded
121
+ self.on_duration_changed = on_duration_changed
122
+ self.on_state_changed = on_state_changed
123
+ self.on_position_changed = on_position_changed
124
+ self.on_seek_complete = on_seek_complete
125
+
126
+ def _get_control_name(self):
127
+ return "audio"
128
+
129
+ def play(self):
130
+ self.invoke_method("play")
131
+
132
+ def pause(self):
133
+ self.invoke_method("pause")
134
+
135
+ def resume(self):
136
+ self.invoke_method("resume")
137
+
138
+ def release(self):
139
+ self.invoke_method("release")
140
+
141
+ def seek(self, position_milliseconds: int):
142
+ self.invoke_method("seek", {"position": str(position_milliseconds)})
143
+
144
+ def get_duration(self, wait_timeout: Optional[float] = 5) -> Optional[int]:
145
+ sr = self.invoke_method(
146
+ "get_duration",
147
+ wait_for_result=True,
148
+ wait_timeout=wait_timeout,
149
+ )
150
+ return int(sr) if sr else None
151
+
152
+ async def get_duration_async(
153
+ self, wait_timeout: Optional[float] = 5
154
+ ) -> Optional[int]:
155
+ sr = await self.invoke_method_async(
156
+ "get_duration",
157
+ wait_for_result=True,
158
+ wait_timeout=wait_timeout,
159
+ )
160
+ return int(sr) if sr else None
161
+
162
+ def get_current_position(self, wait_timeout: Optional[float] = 5) -> Optional[int]:
163
+ sr = self.invoke_method(
164
+ "get_current_position",
165
+ wait_for_result=True,
166
+ wait_timeout=wait_timeout,
167
+ )
168
+ return int(sr) if sr else None
169
+
170
+ async def get_current_position_async(
171
+ self, wait_timeout: Optional[float] = 5
172
+ ) -> Optional[int]:
173
+ sr = await self.invoke_method_async(
174
+ "get_current_position",
175
+ wait_for_result=True,
176
+ wait_timeout=wait_timeout,
177
+ )
178
+ return int(sr) if sr else None
179
+
180
+ # src
181
+ @property
182
+ def src(self):
183
+ return self._get_attr("src")
184
+
185
+ @src.setter
186
+ def src(self, value):
187
+ self._set_attr("src", value)
188
+
189
+ # src_base64
190
+ @property
191
+ def src_base64(self):
192
+ return self._get_attr("srcBase64")
193
+
194
+ @src_base64.setter
195
+ def src_base64(self, value):
196
+ self._set_attr("srcBase64", value)
197
+
198
+ # autoplay
199
+ @property
200
+ def autoplay(self) -> bool:
201
+ return self._get_attr("autoplay", data_type="bool", def_value=False)
202
+
203
+ @autoplay.setter
204
+ def autoplay(self, value: Optional[bool]):
205
+ self._set_attr("autoplay", value)
206
+
207
+ # volume
208
+ @property
209
+ def volume(self) -> OptionalNumber:
210
+ return self._get_attr("volume")
211
+
212
+ @volume.setter
213
+ def volume(self, value: OptionalNumber):
214
+ if value is None or (0 <= value <= 1):
215
+ self._set_attr("volume", value)
216
+
217
+ # balance
218
+ @property
219
+ def balance(self) -> OptionalNumber:
220
+ return self._get_attr("balance")
221
+
222
+ @balance.setter
223
+ def balance(self, value: OptionalNumber):
224
+ if value is None or (-1 <= value <= 1):
225
+ self._set_attr("balance", value)
226
+
227
+ # playback_rate
228
+ @property
229
+ def playback_rate(self) -> OptionalNumber:
230
+ return self._get_attr("playbackRate")
231
+
232
+ @playback_rate.setter
233
+ def playback_rate(self, value: OptionalNumber):
234
+ if value is None or (0 <= value <= 2):
235
+ self._set_attr("playbackRate", value)
236
+
237
+ # release_mode
238
+ @property
239
+ def release_mode(self):
240
+ return self._get_attr("releaseMode")
241
+
242
+ @release_mode.setter
243
+ def release_mode(self, value: Optional[ReleaseMode]):
244
+ self._set_enum_attr("releaseMode", value, ReleaseMode)
245
+
246
+ # on_loaded
247
+ @property
248
+ def on_loaded(self):
249
+ return self._get_event_handler("loaded")
250
+
251
+ @on_loaded.setter
252
+ def on_loaded(self, handler: OptionalControlEventCallable):
253
+ self._add_event_handler("loaded", handler)
254
+
255
+ # on_duration_changed
256
+ @property
257
+ def on_duration_changed(self):
258
+ return self.__on_duration_changed.handler
259
+
260
+ @on_duration_changed.setter
261
+ def on_duration_changed(
262
+ self, handler: OptionalEventCallable[AudioDurationChangeEvent]
263
+ ):
264
+ self.__on_duration_changed.handler = handler
265
+
266
+ # on_state_changed
267
+ @property
268
+ def on_state_changed(self):
269
+ return self.__on_state_changed.handler
270
+
271
+ @on_state_changed.setter
272
+ def on_state_changed(self, handler: OptionalEventCallable[AudioStateChangeEvent]):
273
+ self.__on_state_changed.handler = handler
274
+
275
+ # on_position_changed
276
+ @property
277
+ def on_position_changed(self):
278
+ return self.__on_position_changed.handler
279
+
280
+ @on_position_changed.setter
281
+ def on_position_changed(
282
+ self, handler: OptionalEventCallable[AudioPositionChangeEvent]
283
+ ):
284
+ self.__on_position_changed.handler = handler
285
+ self._set_attr("onPositionChanged", True if handler is not None else None)
286
+
287
+ # on_seek_complete
288
+ @property
289
+ def on_seek_complete(self):
290
+ return self._get_event_handler("seek_complete")
291
+
292
+ @on_seek_complete.setter
293
+ def on_seek_complete(self, handler: OptionalControlEventCallable):
294
+ self._add_event_handler("seek_complete", handler)
@@ -0,0 +1,43 @@
1
+ Metadata-Version: 2.2
2
+ Name: flet-audio
3
+ Version: 0.1.0
4
+ Summary: Audio control for Flet
5
+ Author-email: Flet contributors <hello@flet.dev>
6
+ Project-URL: Homepage, https://flet.dev
7
+ Project-URL: Documentation, https://flet.dev/docs/controls/audio
8
+ Project-URL: Repository, https://github.com/flet-dev/flet-audio
9
+ Project-URL: Issues, https://github.com/flet-dev/flet-audio/issues
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Requires-Python: >=3.8
12
+ Description-Content-Type: text/markdown
13
+ Requires-Dist: flet>=0.25.1
14
+
15
+ # Flet Audio control
16
+
17
+ `Audio` control for Flet.
18
+
19
+ ## Usage
20
+
21
+ Add `flet-audio` as dependency (`pyproject.toml` or `requirements.txt`) to your Flet project.
22
+
23
+ ## Example
24
+
25
+ ```py
26
+
27
+ import flet as ft
28
+
29
+ import flet_audio as fta
30
+
31
+
32
+ def main(page: ft.Page):
33
+ audio1 = fta.Audio(
34
+ src="https://luan.xyz/files/audio/ambient_c_motion.mp3", autoplay=True
35
+ )
36
+ page.overlay.append(audio1)
37
+ page.add(
38
+ ft.Text("This is an app with background audio."),
39
+ ft.ElevatedButton("Stop playing", on_click=lambda _: audio1.pause()),
40
+ )
41
+
42
+ ft.app(main)
43
+ ```
@@ -0,0 +1,18 @@
1
+ README.md
2
+ pyproject.toml
3
+ src/flet_audio/__init__.py
4
+ src/flet_audio/audio.py
5
+ src/flet_audio.egg-info/PKG-INFO
6
+ src/flet_audio.egg-info/SOURCES.txt
7
+ src/flet_audio.egg-info/dependency_links.txt
8
+ src/flet_audio.egg-info/requires.txt
9
+ src/flet_audio.egg-info/top_level.txt
10
+ src/flutter/flet_audio/CHANGELOG.md
11
+ src/flutter/flet_audio/LICENSE
12
+ src/flutter/flet_audio/README.md
13
+ src/flutter/flet_audio/analysis_options.yaml
14
+ src/flutter/flet_audio/pubspec.lock
15
+ src/flutter/flet_audio/pubspec.yaml
16
+ src/flutter/flet_audio/lib/flet_audio.dart
17
+ src/flutter/flet_audio/lib/src/audio.dart
18
+ src/flutter/flet_audio/lib/src/create_control.dart
@@ -0,0 +1 @@
1
+ flet>=0.25.1
@@ -0,0 +1,2 @@
1
+ flet_audio
2
+ flutter
@@ -0,0 +1,3 @@
1
+ # 0.1.0
2
+
3
+ Initial release of the package.