add packages

This commit is contained in:
Xuan Sang LE 2018-04-14 15:52:19 +00:00
parent 1d4957b4c5
commit 2d7acf3f35
21 changed files with 1222 additions and 0 deletions

24
About/README.md Normal file
View File

@ -0,0 +1,24 @@
# About
This is an example project, generated by AntOS Development Kit
## Howto
1. Open the project.apj file with AntOSDK (simply double Click on it)
2. Modify the UI in *assets/scheme.html*
3. Modify application code in *coffees/main.coffee*
4. Modify CSS style in *css/main.css*
5. Other files need to be copied: put in to assets
## Set up build target
Click **Menu> Build > Build Option** or simply hit **ALT-Y**
In the build options dialog, add or remove files that need to be
included into the build
Click **Save**
## Build application
* To build: **Menu > Build > Build** or **ALT-C**
* To build and run: **Menu > Build > Build and Run** or **CTRL-R**
* To release: **Menu > Build > Build release** or **ALT-P**

5
About/assets/scheme.html Normal file
View File

@ -0,0 +1,5 @@
<afx-app-window apptitle="__(About AntOS)" width="450" height="500" data-id="About">
<afx-hbox >
<div data-id="container" style="padding:10px;overflow:auto;"></div>
</afx-hbox>
</afx-app-window>

View File

@ -0,0 +1,24 @@
# About
This is an example project, generated by AntOS Development Kit
## Howto
1. Open the project.apj file with AntOSDK (simply double Click on it)
2. Modify the UI in *assets/scheme.html*
3. Modify application code in *coffees/main.coffee*
4. Modify CSS style in *css/main.css*
5. Other files need to be copied: put in to assets
## Set up build target
Click **Menu> Build > Build Option** or simply hit **ALT-Y**
In the build options dialog, add or remove files that need to be
included into the build
Click **Save**
## Build application
* To build: **Menu > Build > Build** or **ALT-C**
* To build and run: **Menu > Build > Build and Run** or **CTRL-R**
* To release: **Menu > Build > Build release** or **ALT-P**

28
About/build/debug/main.js Normal file
View File

@ -0,0 +1,28 @@
(function() {
var About;
About = class About extends this.OS.GUI.BaseApplication {
constructor(args) {
super("About", args);
}
main() {
var me;
me = this;
this.container = this.find("container");
return "os://README.md".asFileHandler().read(function(txt) {
var converter;
converter = new showdown.Converter();
return ($(me.container)).html(converter.makeHtml(txt));
});
}
};
About.singleton = true;
About.dependencies = ["showdown.min"];
this.OS.register("About", About);
}).call(this);

View File

@ -0,0 +1,13 @@
{
"app":"About",
"name":"About",
"description":"AntOS about",
"info":{
"author": "Xuan Sang LE",
"email": "xsang.le@gmail.com"
},
"version":"0.0.1-a",
"category":"Other",
"iconclass":"fa fa-question-circle",
"mimes":["none"]
}

View File

@ -0,0 +1,5 @@
<afx-app-window apptitle="__(About AntOS)" width="450" height="500" data-id="About">
<afx-hbox >
<div data-id="container" style="padding:10px;overflow:auto;"></div>
</afx-hbox>
</afx-app-window>

14
About/coffees/main.coffee Normal file
View File

@ -0,0 +1,14 @@
class About extends this.OS.GUI.BaseApplication
constructor: ( args ) ->
super "About", args
main: () ->
me = @
@container = @find "container"
"os://README.md".asFileHandler().read (txt) ->
converter = new showdown.Converter()
($ me.container).html converter.makeHtml txt
About.singleton = true
About.dependencies = [ "showdown.min" ]
this.OS.register "About", About

13
About/package.json Normal file
View File

@ -0,0 +1,13 @@
{
"app":"About",
"name":"About",
"description":"AntOS about",
"info":{
"author": "Xuan Sang LE",
"email": "xsang.le@gmail.com"
},
"version":"0.0.1-a",
"category":"Other",
"iconclass":"fa fa-question-circle",
"mimes":["none"]
}

8
About/project.apj Normal file
View File

@ -0,0 +1,8 @@
{
"name": "About",
"root": "home://workspace/About",
"css": [],
"javascripts": [],
"coffees": ["coffees/main.coffee"],
"copies": ["assets/scheme.html", "package.json", "README.md"]
}

24
MediaPlayer/README.md Normal file
View File

@ -0,0 +1,24 @@
# MediaPlayer
This is an example project, generated by AntOS Development Kit
## Howto
1. Open the project.apj file with AntOSDK (simply double Click on it)
2. Modify the UI in *assets/scheme.html*
3. Modify application code in *coffees/main.coffee*
4. Modify CSS style in *css/main.css*
5. Other files need to be copied: put in to assets
## Set up build target
Click **Menu> Build > Build Option** or simply hit **ALT-Y**
In the build options dialog, add or remove files that need to be
included into the build
Click **Save**
## Build application
* To build: **Menu > Build > Build** or **ALT-C**
* To build and run: **Menu > Build > Build and Run** or **CTRL-R**
* To release: **Menu > Build > Build release** or **ALT-P**

View File

@ -0,0 +1,44 @@
<afx-app-window apptitle="__(Media Player)" width="300" height="450" resizable="false" data-id="MediaPlayer">
<afx-vbox >
<afx-hbox data-height="85">
<afx-vbox>
<div data-height="5"></div>
<afx-hbox>
<div data-width="5"></div>
<afx-label data-id="play-time" data-width="50" ></afx-label>
<afx-label data-id = "song-name" ></afx-label>
<afx-label data-id="total-time" data-width="50"></afx-label>
<div data-width="5"></div>
</afx-hbox>
<afx-hbox>
<div data-width="5"></div>
<afx-slider data-id="play-slide" value="0" max="100"></afx-slider>
<div data-width="5"></div>
</afx-hbox>
<afx-hbox class = "play-control" data-height="50">
<div data-width="5"></div>
<afx-switch data-width = "22" data-id="play-random"></afx-switch>
<div data-id="animation" class="animation">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<afx-button class = "ctlbtn" data-width="26" data-id="play-prev" iconclass="fa fa-step-backward" ></afx-button>
<afx-switch data-width="38" data-id="play-pause" ></afx-switch>
<afx-button class = "ctlbtn" data-width="26" data-id="play-next" iconclass="fa fa-step-forward"></afx-button>
<afx-slider data-id="vol-control" max="100"></afx-slider>
<afx-switch data-width = "22" data-id="play-vol"></afx-switch>
</afx-hbox>
</afx-vbox>
</afx-hbox>
<afx-hbox>
<div data-width="5"></div>
<afx-list-view data-id="playlist"></afx-list-view>
<div data-width="5"></div>
</afx-hbox>
<div data-height="5"></div>
</afx-vbox>
</afx-app-window>

View File

@ -0,0 +1,24 @@
# MediaPlayer
This is an example project, generated by AntOS Development Kit
## Howto
1. Open the project.apj file with AntOSDK (simply double Click on it)
2. Modify the UI in *assets/scheme.html*
3. Modify application code in *coffees/main.coffee*
4. Modify CSS style in *css/main.css*
5. Other files need to be copied: put in to assets
## Set up build target
Click **Menu> Build > Build Option** or simply hit **ALT-Y**
In the build options dialog, add or remove files that need to be
included into the build
Click **Save**
## Build application
* To build: **Menu > Build > Build** or **ALT-C**
* To build and run: **Menu > Build > Build and Run** or **CTRL-R**
* To release: **Menu > Build > Build release** or **ALT-P**

View File

@ -0,0 +1,108 @@
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-button button{
border: 0;
font-size: 25px;
padding-top:9px;
background-color: transparent;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-pause"]{
padding-top:5px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-pause"] span::before{
content: "\f144";
font-size: 40px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-pause"] .swon::before{
content: "\f28b";
}
afx-app-window[data-id="MediaPlayer"] afx-label[data-id="play-time"] {
text-align: left;
}
afx-app-window[data-id="MediaPlayer"] afx-label[data-id="total-time"] {
text-align: right;
}
afx-app-window[data-id="MediaPlayer"] afx-label[data-id="song-name"] {
text-align: center;
display: inline;
overflow: hidden;
}
afx-app-window[data-id="MediaPlayer"] afx-slider .dragpoint {
width:12px;
height: 12px;
}
afx-app-window[data-id="MediaPlayer"] afx-slider[data-id="vol-control"] .progress {
background-color: #a6a6a6;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-vol"] {
margin-top:10px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-vol"] span::before{
content: "\f026";
font-size: 19px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-vol"] .swon::before{
content: "\f028";
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-random"] span::before{
content: "\f074";
font-size: 16px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-random"] .swon::before{
content: "\f074";
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-random"] {
margin-top:10px;
}
afx-app-window[data-id="MediaPlayer"] afx-list-view[data-id="playlist"] {
border:1px solid #a6a6a6;
}
afx-app-window[data-id="MediaPlayer"] afx-button.ctlbtn button:active{
background-color: transparent;
color:#2786F3;
}
afx-app-window[data-id="MediaPlayer"] .animation {
position: relative;
}
afx-app-window[data-id="MediaPlayer"] .animation span{
width:5px;
height: 5px;
bottom:18px;
position:absolute;
-webkit-animation: bodong 0.5s infinite ease;
}
afx-app-window[data-id="MediaPlayer"] .animation span:first-child{
left:10px;
-webkit-animation-delay:.3s;
background-color: red;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(2){
left:17px;
-webkit-animation-delay:.4s;
background-color:orange ;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(3){
left:24px;
-webkit-animation-delay:.6s;
background-color: #2786F3;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(4){
left:31px;
-webkit-animation-delay:.8s;
background-color: chocolate;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(5){
left:38px;
-webkit-animation-delay:1s;
background-color: blue;
}
@-webkit-keyframes bodong{
0%{height:5px; background:bule;}
30%{height:15px; background:bule;}
60%{height:20px; background:bule;}
80%{height:15px; background:bule;}
100%{height:5px; background:bule;}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
{
"app":"MediaPlayer",
"name":"Media Player",
"description":"MP3 player for AntOS",
"info":{
"author": "Xuan Sang LE",
"email": "xsang.le@gmail.com"
},
"version":"0.0.8-a",
"category":"Multimedia",
"iconclass":"fa fa-headphones",
"mimes":["none"]
}

View File

@ -0,0 +1,44 @@
<afx-app-window apptitle="__(Media Player)" width="300" height="450" resizable="false" data-id="MediaPlayer">
<afx-vbox >
<afx-hbox data-height="85">
<afx-vbox>
<div data-height="5"></div>
<afx-hbox>
<div data-width="5"></div>
<afx-label data-id="play-time" data-width="50" ></afx-label>
<afx-label data-id = "song-name" ></afx-label>
<afx-label data-id="total-time" data-width="50"></afx-label>
<div data-width="5"></div>
</afx-hbox>
<afx-hbox>
<div data-width="5"></div>
<afx-slider data-id="play-slide" value="0" max="100"></afx-slider>
<div data-width="5"></div>
</afx-hbox>
<afx-hbox class = "play-control" data-height="50">
<div data-width="5"></div>
<afx-switch data-width = "22" data-id="play-random"></afx-switch>
<div data-id="animation" class="animation">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<afx-button class = "ctlbtn" data-width="26" data-id="play-prev" iconclass="fa fa-step-backward" ></afx-button>
<afx-switch data-width="38" data-id="play-pause" ></afx-switch>
<afx-button class = "ctlbtn" data-width="26" data-id="play-next" iconclass="fa fa-step-forward"></afx-button>
<afx-slider data-id="vol-control" max="100"></afx-slider>
<afx-switch data-width = "22" data-id="play-vol"></afx-switch>
</afx-hbox>
</afx-vbox>
</afx-hbox>
<afx-hbox>
<div data-width="5"></div>
<afx-list-view data-id="playlist"></afx-list-view>
<div data-width="5"></div>
</afx-hbox>
<div data-height="5"></div>
</afx-vbox>
</afx-app-window>

View File

@ -0,0 +1,262 @@
class MediaPlayer extends this.OS.GUI.BaseApplication
constructor: ( args ) ->
super "MediaPlayer", args
main: () ->
me = @
@volsw = @find "play-vol"
@volctl = @find "vol-control"
@volsw.set "swon", true
@volctl.set "onchange", (v) ->
return unless (me.volsw.get "swon")
Howler.volume (me.volctl.get "value")/100
@volctl.set "value", 70
@playlist = @find "playlist"
@playtime = @find "play-time"
@songname = @find "song-name"
@totaltime = @find "total-time"
@playpause = @find "play-pause"
@progress = @find "play-slide"
@playran = @find "play-random"
@history = []
@currsong = undefined
@timer = undefined
@animator = @find "animation"
@volsw.set "onchange", (e) ->
return Howler.volume 0 if not e.data
Howler.volume (me.volctl.get "value")/100
@playlist.set "buttons", [
{
text: "+",
onbtclick: () ->
me.openDialog "FileDiaLog", (d,n,p,f) ->
return me.scanDir f if f.type is "dir"
f.text = f.filename
f.iconclass = "fa fa-music"
me.playlist.push f, true
, "__(Select MP3 file or a folder)"
, { mimes: ["dir", "audio/mpeg"] }
},
{
text: "-",
onbtclick: () ->
sel = me.playlist.get "selected"
return unless sel
me.stop() if sel is me.currsong
me.playlist.remove sel, true
},
{
text: "",
onbtclick: () ->
me.openDialog "PromptDialog", (link) ->
return unless link and link isnt ""
data = {
text: link,
path: link,
iconclass: "fa fa-link",
broadcast: true
}
me.playlist.push data, true
, "__(MP3 Radio broadcast)", { label:"Enter radio broadcast link" }
, iconclass: "fa fa-link"
},
{
text:"",
iconclass: "fa fa-save",
onbtclick: () ->
playlist = []
for v in me.playlist.get "items"
playlist.push {
text: v.text,
path: v.path,
iconclass: v.iconclass,
broadcast: if v.broadcast then v.broadcast else false
}
fp = "Untitled".asFileHandler()
me.openDialog "FileDiaLog", (d,n,p,f) ->
fp = "#{d}/#{n}".asFileHandler()
fp.cache = playlist
fp.write "object", (r) ->
return me.error __("Cannot save playlist: {0}", r.error) if r.error
me.notify __("Playlist saved")
, "__(Save Playlist)", { file: fp }
},
{
text:"",
iconclass: "fa fa-folder",
onbtclick: () ->
me.openDialog "FileDiaLog", (d,n,p,f) ->
f.path.asFileHandler().read (d) ->
me.stop()
me.playlist.set "items", d
, "json"
, "__(Open Playlist)", { mimes: ["application/json"] }
}
]
@playlist.set "onlistdbclick", (e) ->
return unless e
e.data.index = e.idx
me.play e.data
@progress.set "onchange", (s) ->
me.seek s
@playpause.set "onchange", (e) ->
me.togglePlayPause()
(@find "play-prev").set "onbtclick", () ->
me.prevSong()
(@find "play-next").set "onbtclick", () ->
me.nextSong()
$(@animator).css("visibility", "hidden")
scanDir: (f) ->
me = @
f.path.asFileHandler().read (d) ->
return me.error __("Unable to read {0}", d.error) if d.error
for v in d.result when v.mime.match /audio\/mpeg/
v.iconclass = "fa fa-music"
v.text = v.filename
me.playlist.push v, true
togglePlayPause: () ->
return @playpause.set "swon",false unless @currsong and @currsong.howl
sound = @currsong.howl
if sound.playing()
sound.pause()
else
sound.play()
nextSong: () ->
idx = -1
if (@playran.get "swon")
idx = @randomSong()
else
len = (@playlist.get "items").length
if len > 0
idx = 0
idx = @currsong.index + 1 if @currsong
idx = 0 if idx >= len
return if idx is -1
@history.pop() if history.length >= 10
@history.unshift @currsong.index if @currsong
@playlist.set "selected", idx
sel = @playlist.get "selected"
sel.index = idx
@play sel
prevSong: () ->
idx = -1
if (@playran.get "swon")
idx = @history.shift() if @history.length > 0
else
len = (@playlist.get "items").length
if len > 0
idx = @currsong.index - 1 if @currsong
idx = 0 if idx < 0
return if idx is -1
@playlist.set "selected", idx
sel = @playlist.get "selected"
sel.index = idx
@play sel
randomSong: () ->
len = (@playlist.get "items").length
return -1 unless len > 0
return Math.floor(Math.random() * Math.floor(len))
play: (file) ->
me = @
@stop()
@currsong = file
sound = file.howl
if not sound
sound = file.howl = new Howl {
src: [
file.path.asFileHandler().getlink()
],
preload:true,
buffer: true,
html5: true, # Force to HTML5 so that the audio can stream in (best for large files).
format: ['mp3', 'aac'],
onplay: () ->
$(me.animator).css("visibility", "visible")
#Display the duration.
me.playpause.set "swon", true
console.log "play"
me.songname.set "text", file.text
duration = Math.round(sound.duration())
if duration isnt Infinity
me.totaltime.set "text", me.formatDuration duration
me.progress.set "max", duration
else
me.totaltime.set "text", "--:--"
me.progress.set "max", 0
if not file.broadcast
func = () ->
if sound.playing()
seek = Math.round(sound.seek()) || 0
me.progress.set "value", seek
me.playtime.set "text", me.formatDuration seek
me.timer = setTimeout (() -> func()), 1000
func()
else
me.totaltime.set "text", "--:--"
me.progress.set "value", (me.progress.get "max")
func = () ->
if sound.playing()
seek = Math.round(sound.seek()) || 0
me.playtime.set "text", me.formatDuration seek
me.timer = setTimeout (() -> func()), 1000
func()
onload: () ->
# Start the wave animation.
console.log "load"
$(me.animator).css("visibility", "hidden")
sound.play() if not file.broadcast
onend: () ->
# Stop the wave animation.
me.progress.set "value", 0
clearTimeout me.timer if me.timer
me.playpause.set "swon", false
$(me.animator).css("visibility", "hidden")
me.nextSong()
onpause: ()->
# Stop the wave animation.
console.log "pause"
clearTimeout me.timer if me.timer
me.playpause.set "swon", false
$(me.animator).css("visibility", "hidden")
onstop: () ->
me.progress.set "value", 0
clearTimeout me.timer if me.timer
me.playpause.set "swon", false
$(me.animator).css("visibility", "hidden")
console.log "stop"
}
sound.play() if file.broadcast
else
sound.play()
$(@animator).css("visibility", "visible")
stop: () ->
if @currsong and @currsong.howl
@currsong.howl.stop() if @currsong.howl.playing()
seek: (v) ->
return unless @currsong and @currsong.howl and not @currsong.broadcast
return unless (@progress.get "max") > 0
sound = @currsong.howl
sound.seek(v)
formatDuration: (s) ->
min = Math.floor(s/60)
sec = s % 60
min = if min < 10 then "0#{min}" else "#{min}"
sec = if sec < 10 then "0#{sec}" else "#{sec}"
"#{min}:#{sec}"
cleanup: (evt) ->
@stop()
# only one instance is allow
MediaPlayer.singleton = true
this.OS.register "MediaPlayer", MediaPlayer

107
MediaPlayer/css/main.css Normal file
View File

@ -0,0 +1,107 @@
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-button button{
border: 0;
font-size: 25px;
padding-top:9px;
background-color: transparent;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-pause"]{
padding-top:5px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-pause"] span::before{
content: "\f144";
font-size: 40px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-pause"] .swon::before{
content: "\f28b";
}
afx-app-window[data-id="MediaPlayer"] afx-label[data-id="play-time"] {
text-align: left;
}
afx-app-window[data-id="MediaPlayer"] afx-label[data-id="total-time"] {
text-align: right;
}
afx-app-window[data-id="MediaPlayer"] afx-label[data-id="song-name"] {
text-align: center;
display: inline;
overflow: hidden;
}
afx-app-window[data-id="MediaPlayer"] afx-slider .dragpoint {
width:12px;
height: 12px;
}
afx-app-window[data-id="MediaPlayer"] afx-slider[data-id="vol-control"] .progress {
background-color: #a6a6a6;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-vol"] {
margin-top:10px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-vol"] span::before{
content: "\f026";
font-size: 19px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-vol"] .swon::before{
content: "\f028";
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-random"] span::before{
content: "\f074";
font-size: 16px;
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-random"] .swon::before{
content: "\f074";
}
afx-app-window[data-id="MediaPlayer"] afx-hbox.play-control afx-switch[data-id="play-random"] {
margin-top:10px;
}
afx-app-window[data-id="MediaPlayer"] afx-list-view[data-id="playlist"] {
border:1px solid #a6a6a6;
}
afx-app-window[data-id="MediaPlayer"] afx-button.ctlbtn button:active{
background-color: transparent;
color:#2786F3;
}
afx-app-window[data-id="MediaPlayer"] .animation {
position: relative;
}
afx-app-window[data-id="MediaPlayer"] .animation span{
width:5px;
height: 5px;
bottom:18px;
position:absolute;
-webkit-animation: bodong 0.5s infinite ease;
}
afx-app-window[data-id="MediaPlayer"] .animation span:first-child{
left:10px;
-webkit-animation-delay:.3s;
background-color: red;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(2){
left:17px;
-webkit-animation-delay:.4s;
background-color:orange ;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(3){
left:24px;
-webkit-animation-delay:.6s;
background-color: #2786F3;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(4){
left:31px;
-webkit-animation-delay:.8s;
background-color: chocolate;
}
afx-app-window[data-id="MediaPlayer"] .animation span:nth-child(5){
left:38px;
-webkit-animation-delay:1s;
background-color: blue;
}
@-webkit-keyframes bodong{
0%{height:5px; background:bule;}
30%{height:15px; background:bule;}
60%{height:20px; background:bule;}
80%{height:15px; background:bule;}
100%{height:5px; background:bule;}
}

4
MediaPlayer/javascripts/howler.min.js vendored Normal file

File diff suppressed because one or more lines are too long

13
MediaPlayer/package.json Normal file
View File

@ -0,0 +1,13 @@
{
"app":"MediaPlayer",
"name":"Media Player",
"description":"MP3 player for AntOS",
"info":{
"author": "Xuan Sang LE",
"email": "xsang.le@gmail.com"
},
"version":"0.0.8-a",
"category":"Multimedia",
"iconclass":"fa fa-headphones",
"mimes":["none"]
}

1
MediaPlayer/project.apj Normal file
View File

@ -0,0 +1 @@
{"name":"MediaPlayer","root":"home://workspace/MediaPlayer","css":["css/main.css"],"javascripts":["javascripts/howler.min.js"],"coffees":["coffees/main.coffee"],"copies":["assets/scheme.html","package.json","README.md"]}