From b5ee8d32513b30658a57333064684ce9233c7721 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 14 Nov 2018 15:54:07 +0200 Subject: [PATCH] 6.1 --- src/4.swf | Bin 32173 -> 11091 bytes src/5.swf | Bin 11091 -> 0 bytes src/6.swf | Bin 32955 -> 0 bytes src/Canv.java | 702 ++++++++++++++++----- src/Capuchin.java | 19 +- src/Effects.java | 128 ++++ src/Engine1.java | 195 ++++++ src/Engine2.java | 71 +-- src/FWCashe.java | 51 ++ src/FindLyrics.java | 4 +- src/FindText.java | 40 +- src/Images.java | 69 ++ src/Info.java | 14 +- src/Lang.java | 30 +- src/Menu.java | 42 -- src/Options.java | 32 +- src/RateImpl.java | 20 +- src/Rms.java | 2 +- src/SEPS.java | 6 +- src/SetSleepMode.java | 28 +- src/Skin.java | 129 ++-- src/about | 25 +- src/mobscrob/scrobbler/AudioScrobbler.java | 276 ++++++++ src/mobscrob/scrobbler/ByteUtil.java | 79 +++ src/mobscrob/scrobbler/HTTPUtil.java | 192 ++++++ src/mobscrob/scrobbler/MD5.java | 648 +++++++++++++++++++ src/newfile | 4 +- src/res/album.png | Bin 0 -> 751 bytes src/res/artist.png | Bin 0 -> 587 bytes src/res/exit.png | Bin 0 -> 548 bytes src/res/pal.png | Bin 0 -> 1152 bytes src/res/pound.png | Bin 0 -> 930 bytes src/res/sb.png | Bin 0 -> 100 bytes src/res/sbl.png | Bin 0 -> 231 bytes src/res/star.png | Bin 0 -> 185 bytes src/res/t.png | Bin 0 -> 132 bytes src/res/tl.png | Bin 0 -> 252 bytes src/res/track.png | Bin 0 -> 803 bytes src/res/zero.png | Bin 0 -> 504 bytes 39 files changed, 2349 insertions(+), 457 deletions(-) delete mode 100644 src/5.swf delete mode 100644 src/6.swf create mode 100644 src/Engine1.java create mode 100644 src/FWCashe.java create mode 100644 src/Images.java delete mode 100644 src/Menu.java create mode 100644 src/mobscrob/scrobbler/AudioScrobbler.java create mode 100644 src/mobscrob/scrobbler/ByteUtil.java create mode 100644 src/mobscrob/scrobbler/HTTPUtil.java create mode 100644 src/mobscrob/scrobbler/MD5.java create mode 100644 src/res/album.png create mode 100644 src/res/artist.png create mode 100644 src/res/exit.png create mode 100644 src/res/pal.png create mode 100644 src/res/pound.png create mode 100644 src/res/sb.png create mode 100644 src/res/sbl.png create mode 100644 src/res/star.png create mode 100644 src/res/t.png create mode 100644 src/res/tl.png create mode 100644 src/res/track.png create mode 100644 src/res/zero.png diff --git a/src/4.swf b/src/4.swf index 079d0a7c7f1d315ba8699b09ab6746e008e4cabc..60b3f77a876e5ccadfed501368a89575c2833505 100644 GIT binary patch literal 11091 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 ZgjXAh!R2L(p?UqESGx&~{|B3g^2NVU$3_4E literal 32173 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 ALI3~& diff --git a/src/5.swf b/src/5.swf deleted file mode 100644 index 60b3f77a876e5ccadfed501368a89575c2833505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11091 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 ZgjXAh!R2L(p?UqESGx&~{|B3g^2NVU$3_4E diff --git a/src/6.swf b/src/6.swf deleted file mode 100644 index 6773efc15e34eda12e0bac918d7741b6eef29357..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32955 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�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 HaSm^cs>7tN diff --git a/src/Canv.java b/src/Canv.java index 629b9c1..db8f84d 100644 --- a/src/Canv.java +++ b/src/Canv.java @@ -2,10 +2,11 @@ import com.nokia.mid.ui.DeviceControl; import com.sonyericsson.multimedia.*; import com.sonyericsson.multimedia.control.*; import java.io.IOException; -import java.util.Calendar; +import java.util.*; import javax.microedition.io.Connector; import javax.microedition.lcdui.*; import javax.microedition.sensor.*; +import mobscrob.scrobbler.AudioScrobbler; /* * To change this template, choose Tools | Templates @@ -18,25 +19,47 @@ import javax.microedition.sensor.*; */ public class Canv extends Canvas implements Runnable, MediaControlListener { - //public static int softUp1 = 0xFF242424, softUp2 = 0x87282828, softDn1 = 0x87151515, softDn2 = 0xFF181818, background = 0x00, - // line = 0x00BB00, text = 0x009900, valuet = 0x0000E6, inf = 0x992235; public static int softUp1, softUp2, softDn1, softDn2, background, line, text, valuet, inf; + private boolean rspressed; + + //Меню + private String[] m = new String[] {SEPS.midlet.lang.sleepmode, + SEPS.midlet.lang.findtext, SEPS.midlet.lang.visual, SEPS.midlet.lang.skin, SEPS.midlet.lang.options, SEPS.midlet.lang.about, + SEPS.midlet.lang.minimise, SEPS.midlet.lang.exit}; + private int menuwidth, menuheight, mcur, menuy, menuup; + private boolean menu, skin, vis; + private int volumeplus, volumeminus; //визуализация изменения громкости + private boolean fastF, fastR; //быстрая перемотка + private int cx, cy, thisskin;//выбор скина + private int chngx, chngmode;//переключение mode (all, visual) + private int accelPrevDelta = 0; + + //Скролллинг текста (исп, трек, альб, текст) + private int[] scrollPos = {0,0,0,0}; + private int[] sleepPos = {0,0,0,0}; + private boolean[] scrolldirection = {false, false, false, false}; + private int textWidth, lyricWidth; + + private Image old; private int w,h; - private boolean lite; private int mode; - private int accelPrevDelta = 0; private Lyrics lrc; public RateImpl ri; + private Engine1 e1, tmpe1; + private Engine2 e2, tmpe2; + private Object tmpswf; + private Images im; + private FWCashe mfwc; private byte repeat;//функция повтора private int a,b; public Object swf; + private boolean updateAlbum; private Image I, album; - private Engine2 e2; private Graphics G; private Thread thr; private final Font medFont = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM); @@ -51,22 +74,36 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { private SensorConnection sensor; private String URL; - public Canv() { + public Canv(Images im) { setFullScreenMode(true); - thr = new Thread(this); - thr.start(); - lite = false; - repeat = 0; - mode = 0; //Режим плейера w = getWidth(); - h = getHeight(); + volumeminus = h = getHeight(); I = Image.createImage(w, h); G = I.getGraphics(); + this.im = im; + thr = new Thread(this); + thr.start(); + lyricWidth = w/(smallFont_b.charWidth('a')+1); + textWidth = lyricWidth - 3; + mfwc = FWCashe.getCache(medFont); + menuwidth = mfwc.stringWidth(m[0]); + menuheight = m.length * (medFont.getHeight()+2); + for(int i=1; imenuwidth) menuwidth = mfwc.stringWidth(m[i]); + } + menuwidth+=6; + menuy = 2*im.statusBarHeight-menuheight; + updateAlbum = menu = rspressed = false; + volumeplus = menuup = mcur = chngx = repeat = 0; + mode = 0; //Режим плейера getInfo(); service = MultimediaServiceManager.getMultimediaService("MediaPlayer"); mediaControl = (MediaControl)service.getControl("MediaControl"); mediaControl.addMediaControlListener(this); - if(Rms.visid!=0) swf = new Capuchin(Rms.visid); + cx = w/2; + cy = 4*im.statusBarHeight+im.pal.getHeight()/2; + if(Rms.visid>=6) Rms.visid = 1; + if(Rms.visid>1) swf = new Capuchin(Rms.visid); if(Rms.stat) { ri = new RateImpl(); ri.open(); @@ -74,34 +111,134 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { if(Rms.startPlayer) playTrack(); } + protected void sizeChanged(int w, int h) { + w = getWidth(); + h = getHeight(); + volumeminus = h = getHeight(); + I = Image.createImage(w, h); + G = I.getGraphics(); + lyricWidth = w/(smallFont_b.charWidth('a')+1); + textWidth = lyricWidth - 3; + cx = w/2; + super.sizeChanged(w, h); + } + protected void paint(Graphics g) { - if(mode==0) drawPlayerCanvas(G); - else if(mode==1) drawVisual(G); - g.drawImage(I, 0, 0, 20); + setFullScreenMode(true); + //Выбор визуализации + if(vis) {choiceVisual(g, Rms.visid); return;} + if(skin) {choiceSkin(g, cx, cy); return;} + //Переключение режимов (all, visual) + if(chngx>0) { + if(old==null) { + old = Image.createImage(I.getWidth(), I.getHeight()); + old.getGraphics().drawImage(I, 0, 0, 20); + if(mode==0) drawPlayerCanvas(G); + else if(mode==1) drawVisual(G); + if(chngmode<3) chngx = h; + else chngx = w; + } + switch(chngmode) { + case 0: + g.drawImage(I, 0, -chngx, 20); + g.drawImage(old, 0, h-chngx, 20); + break; + case 1: + g.drawImage(I, 0, chngx, 20); + g.drawImage(old, 0, chngx-h, 20); + break; + case 2: + g.drawImage(old, 0, 0, 20); + g.drawRegion(I, 0, 0, w, h/2, 0, 0, -chngx/2, 20); + g.drawRegion(I, 0, h/2, w, h/2, 0, 0, h/2+chngx/2, 20); + break; + case 3: + g.drawImage(I, 0, 0, 20); + g.drawRegion(old, 0, 0, w, h/2, 0, 0, chngx/2-h/2, 20); + g.drawRegion(old, 0, h/2, w, h/2, 0, 0, -chngx/2+h, 20); + break; + case 4: + g.drawImage(I, -chngx, 0, 20); + g.drawImage(old, w-chngx, 0, 20); + break; + case 5: + g.drawImage(I, chngx, 0, 20); + g.drawImage(old, chngx-w, 0, 20); + break; + case 6: + g.drawImage(old, 0, 0, 20); + g.drawRegion(I, 0, 0, w/2, h, 0, -chngx/2, 0, 20); + g.drawRegion(I, w/2, 0, w/2, h, 0, w/2+chngx/2, 0, 20); + break; + default: + g.drawImage(I, 0, 0, 20); + g.drawRegion(old, 0, 0, w/2, h, 0, chngx/2-w/2, 0, 20); + g.drawRegion(old, w/2, 0, w/2, h, 0, -chngx/2+w, 0, 20); + break; + } + chngx-=4; + repaint(); + }else{ + if(mode==0) drawPlayerCanvas(G); + else if(mode==1) drawVisual(G); + g.drawImage(I, 0, 0, 20); + //Меню + if(menuup!=0) { + if(menuup>0) { + menuy-=25; + if(menuy<=2*im.statusBarHeight-menuheight) {menu = false; menuup=0;} + } else { + menuy+=25; + if(menuy>=2*im.statusBarHeight) {menu = true; menuup=0;} + } + drawMenu(g, mcur, menuy); + }else if(menu) drawMenu(g, mcur, menuy); + //Визуализации изменения громкости + if(volumeplus>0) { + drawRect(g, 0x33000000, 0xAA000000, 0, volumeplus-20, w, 20); + drawRect(g, 0xAA000000, 0x33000000, 0, volumeplus, w, 20); + volumeplus-=10; + } + if(volumeminusih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih); g.drawImage(album, w/2, h/2, 3); }else if(Rms.vis){ - int ih = h-(2*medFont.getHeight())-6; if(Rms.visid==0) { if(e2==null) { - e2 = new Engine2(w-6, ih); + e2 = new Engine2(w, ih); e2.setRun(true); } g.drawImage(e2.MainCanvas(), w/2, h/2, 3); + } else if(Rms.visid==1) { + if(e1==null) { + e1 = new Engine1(w, ih); + e1.setRun(true); + } + g.drawImage(e1.MainCanvas(), w/2, h/2, 3); } else{ ((Capuchin) swf).drawFlash(g, 3, h/2-(ih/2), w-6, ih); } @@ -113,7 +250,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } } } - drawSoft(g, SEPS.midlet.lang.menu, SEPS.midlet.lang.exit); + drawSoft(g); } private String getValue(MetaData metaData, String md) { @@ -128,40 +265,52 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { private void drawPlayerCanvas(Graphics g) { g.setColor(background); g.fillRect(0, 0, w, h); - drawTitle(g, "SEPS by aNNiMON"); + drawTitle(g, getTime()); int fh = smallFont_b.getHeight()+2; int py = fh+fh/2; g.setFont(medFont); if (media != null) { MetaData metaData = media.getMetaData(); if (metaData != null) { - Object data = getValue(metaData, MetaData.ARTIST_KEY); - if (data != null) py = drawText(g, (String) data, py); + String data = getValue(metaData, MetaData.ARTIST_KEY); + g.drawImage(im.artist, 2, py, 20); + if (data != null) py = drawText(g, scrollText(data, 0), py, 0); data = getValue(metaData, MetaData.TITLE_KEY); - if (data != null) py = drawText(g, (String) data, py); + g.drawImage(im.track, 1, py, 20); + if (data != null) py = drawText(g, scrollText(data, 1), py, 1); data = getValue(metaData, MetaData.ALBUM_KEY); - if (data != null) py = drawText(g, (String) data, py); + g.drawImage(im.album, 2, py, 20); + if (data != null) py = drawText(g, scrollText(data, 2), py, 2); - if(Rms.isLyric && lrc!=null) py = drawText(g, lrc.getLine(media.getMediaTime()), py); + if(Rms.isLyric && lrc!=null) py = drawText(g, scrollText(lrc.getLine(media.getMediaTime()), 3), py, 3); //else if(lrc==null) py = drawText(g, String.valueOf(media.getMediaTime()), "", py); //data = metaData.getValue(metaData.FILE_URI_KEY); //if (data != null) float div = ((float)w - 10) / (float)media.getDuration(); g.setColor(valuet); int mgt = media.getMediaTime(); - g.fillRect(5, py, (int)(mgt * div), 10); + int k = im.statusBarleftWidth+3; + drawRect(g, softUp1, softUp2, 5, py, (int)(mgt * div), im.statusBarHeight); + for(int i=k; iih) album = Effects.Resize(album, ih*album.getWidth()/album.getHeight(), ih); @@ -174,32 +323,100 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { e2.setRun(true); } g.drawImage(e2.MainCanvas(), w/2, py+15, 17); - } else{ + } else if(Rms.visid==1) { + if(e1==null) { + e1 = new Engine1(ih, ih); + e1.setRun(true); + } + g.drawImage(e1.MainCanvas(), w/2, py+15, 17); + }else{ ((Capuchin) swf).drawFlash(g, w/2-ih/2, py+15, ih, ih); } } g.setColor(inf); - if(Rms.vis) g.drawString("*-V", 2, py+15, 20); - if(Rms.isLyric) g.drawString("0-L", 2, py+15+(smallFont_b.getHeight()+2), 20); - if(Rms.accel) g.drawString("#-A", 2, py+15+2*(smallFont_b.getHeight()+2), 20); if(Rms.slpmode) g.drawString("S", 2, py+15+3*(smallFont_b.getHeight()+2), 20); - drawSoft(g, SEPS.midlet.lang.menu, SEPS.midlet.lang.exit); + drawSoft(g); } public void keyPressed(int key) { + if(key==-6 && !menu) { + menuup = menu?1:-1; + } + if((menuup!=0 || menu) && !vis && !skin) { + if(key==-6) { + menuup = menu?1:-1; + } + int ga=getGameAction(key); + switch (ga) { + case UP: + mcur--; + if(mcur<0) mcur=m.length-1; + break; + case DOWN: + mcur++; + if(mcur>=m.length) mcur=0; + break; + case FIRE: + menuAction(mcur); + break; + } + }else if(vis) { + int ga=getGameAction(key); + switch (ga) { + case UP: + case LEFT: + Rms.visid--; + if(Rms.visid<0) Rms.visid=5; + tmpswf=null; + break; + case DOWN: + case RIGHT: + Rms.visid++; + if(Rms.visid>=6) Rms.visid=0; + tmpswf=null; + break; + } + if(ga==FIRE || key==-6) { + tmpe2=null; tmpe1=null; tmpswf=null; + if(Rms.visid>1) swf = new Capuchin(Rms.visid); + vis = false; + } + }else if(skin) { + int ga=getGameAction(key); + if(ga==UP) {cy--;if(cy<4*im.statusBarHeight) cy=4*im.statusBarHeight+im.pal.getHeight()-1;} + else if(ga==DOWN) {cy++;if(cy>=4*im.statusBarHeight+im.pal.getHeight()) cy=4*im.statusBarHeight+1;} + else if(ga==LEFT) {cx--;if(cx=w/2+im.pal.getWidth()/2) cx=w/2-im.pal.getWidth()/2;} + else if(ga==FIRE || key==-6) { + Rms.skinid = thisskin; + new Skin(Rms.skinid); + skin = false; + } + }else{ + if(key==-7) rspressed = true; + else if(key==KEY_POUND) Rms.accel=!Rms.accel; + else if(key==KEY_STAR) Rms.vis=!Rms.vis; + else if(key==KEY_NUM0) Rms.isLyric=!Rms.isLyric; + else if(key== -36) volumeplus = h;//vol+; + else if(key== -37) volumeminus = 0;//vol-; + } + repaint(); + } + + public void keyReleased(int key) { + if(menuup!=0 || menu) return; int ga=getGameAction(key); if(key==-7) { + rspressed = false; if(Rms.closePlayer) pauseTrack(); SEPS.midlet.destroyApp(true); - } - if(key==-6) new Menu(); - if(key==KEY_POUND) Rms.accel=!Rms.accel; - if(key==KEY_STAR) Rms.vis=!Rms.vis; - if(key==KEY_NUM0) Rms.isLyric=!Rms.isLyric; + }else if(key==KEY_NUM9) new SetSleepMode(); if(key==KEY_NUM4) rewind(); - if(key==KEY_NUM6) fastForward(); + else if(key==KEY_NUM6) fastForward(); + if(ga==LEFT && key!=KEY_NUM4) prevTrack(); + else if(ga==RIGHT && key!=KEY_NUM6) nextTrack(); if(key==KEY_NUM3) ABRepeat(); - if(key==KEY_NUM1) { + else if(key==KEY_NUM1) { String art="",tit=""; try{ MetaData metaData = SEPS.midlet.cnv.media.getMetaData(); @@ -209,9 +426,6 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { FindLyrics fl = new FindLyrics(); fl.find(art, tit);//SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); } - if(key==KEY_NUM9) new SetSleepMode();//SEPS.midlet.dsp.setCurrent(); - if(ga==LEFT && key!=KEY_NUM4) prevTrack(); - if(ga==RIGHT && key!=KEY_NUM6) nextTrack(); switch(ga) { case UP: upMode(); @@ -231,7 +445,26 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } public void keyRepeated(int key) { - keyPressed(key); + if(key==KEY_NUM4) { + try { + if(!fastR) { + mediaControl.rewind(); + fastR = true; + } + } catch (ControlException ex) { + ex.printStackTrace(); + } + }else if(key==KEY_NUM6) { + try { + if(!fastF) { + mediaControl.fastForward(); + fastF = true; + } + } catch (ControlException ex) { + ex.printStackTrace(); + } + + }else keyPressed(key); } public int getDelta(int channel, int threshold) { @@ -285,7 +518,7 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } if(!Rms.vis) Thread.sleep(100); if(Rms.slpmode) { - if(getTime()) { + if(checkTime()) { pauseTrack(); SEPS.midlet.destroyApp(true); } @@ -307,9 +540,41 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { thisSong = thisSong+" - "+ (String) data; if(!thisSong.equalsIgnoreCase(Rms.lastSong)) { int thisTime = media.getMediaTime(); - int allTime = media.getDuration()*20/*% проиграно*//100; + int allTime = media.getDuration()*50/*% проиграно*//100; if(thisTime>allTime) { int cn = 1; + + try { + //GetPass + String username = "aNMCore"; //[0] + String password = "abcdcba"; //[1] + String md5pass = ""; //[2] + if (md5pass.equals("")) { + md5pass = AudioScrobbler.GetPasswordMD5(password); + } + //if (audioscrobbler == null) + AudioScrobbler audioscrobbler = new AudioScrobbler("tst", "1.0", username, md5pass); + audioscrobbler.connect(); + Thread.sleep(3000); + audioscrobbler.Submit( + (String) getValue(metaData, MetaData.ARTIST_KEY), + (String) getValue(metaData, MetaData.TITLE_KEY), + (String) getValue(metaData, MetaData.ALBUM_KEY), + "1", media.getDuration() + ); + + /*MobScrobblerImpl ms = new MobScrobblerImpl(); + ms.scrobble( + (String) getValue(metaData, MetaData.ARTIST_KEY), + (String) getValue(metaData, MetaData.TITLE_KEY), + (String) getValue(metaData, MetaData.ALBUM_KEY), + media.getDuration(), + thisTime + );*/ + }catch(Exception ex) { + SEPS.midlet.dsp.setCurrent(new Alert("Ahtung", ex.getMessage(), null, AlertType.INFO)); + } + if(Rms.stat) { Rms.lastSong = thisSong; cn = ri.update(thisSong); @@ -444,7 +709,11 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { private void fastForward() { try { - mediaControl.skip(10); + if(fastF) { + fastF = false; + mediaControl.play(); + } + else mediaControl.skip(10); } catch (ControlException ex) { ex.printStackTrace(); } @@ -452,20 +721,16 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { private void rewind() { try { - mediaControl.skip(-10); + if(fastR) { + fastR = false; + mediaControl.play(); + } + else mediaControl.skip(-10); } catch (ControlException ex) { ex.printStackTrace(); } } - private boolean getTime() { - Calendar cal = Calendar.getInstance (); - int ch = cal.get(Calendar.HOUR_OF_DAY); - int cm = cal.get(Calendar.MINUTE); - if(ch!=Rms.dh) return false; - else return (cm>=Rms.dm); - } - public void mediaControlUpdate(int eventId, ControlEvent event) { try { switch (eventId) { @@ -488,11 +753,8 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { MetaData data = this.media.getMetaData(); if (data != null) { byte[] alb = data.getAlbumArt(); - if (alb != null) { - album = Image.createImage(alb, 0, alb.length); - } else { - album = null; - } + if (alb != null) album = Image.createImage(alb, 0, alb.length); + else album = null; } a = b = 0; repeat = 0; if(Rms.isLyric) initLyric(this.media); @@ -502,63 +764,135 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } + private void upMode() { + old = null; + chngmode = random(0,8); + chngx = 2; + mode = 1-mode; + e2=null; + e1=null; + if(album!=null) updateAlbum = true; + } + + private void menuAction(int i) { + if(m[i].equals(SEPS.midlet.lang.sleepmode)) SEPS.midlet.dsp.setCurrent(new SetSleepMode()); + else if(m[i].equals(SEPS.midlet.lang.findtext)) { + MetaData metaData = this.media.getMetaData(); + String all = getValue(metaData, MetaData.ARTIST_KEY) + " - " + getValue(metaData, MetaData.TITLE_KEY); + SEPS.midlet.dsp.setCurrent(new FindText(all)); + } + else if(m[i].equals(SEPS.midlet.lang.options)) SEPS.midlet.dsp.setCurrent(new Options()); + else if(m[i].equals(SEPS.midlet.lang.about)) SEPS.midlet.dsp.setCurrent(new Info()); + else if(m[i].equals(SEPS.midlet.lang.minimise)) SEPS.midlet.dsp.setCurrent(null); + else if(m[i].equals(SEPS.midlet.lang.exit)) SEPS.midlet.destroyApp(true); + else if(m[i].equals(SEPS.midlet.lang.skin)) skin = true; + else if(m[i].equals(SEPS.midlet.lang.visual)) vis = true; + } + + //GUI - GRAPHICAL USER INTERFACE + + private int drawText(Graphics g, String value, int y, int id) { + g.setColor(line); + g.drawLine(3, y-1, w-3, y-1); + g.setColor(valuet); + g.setFont(smallFont_b); + g.drawString(value, (id!=3?im.track.getWidth()+4:w/2), y, (id!=3?20:17)); + return y+(smallFont_b.getHeight()+2); + } + + private void drawMenu(Graphics g, int cur, int y) { + ACLS(g,180,0x00); + int fh = medFont.getHeight()+2; + int x = w/2-menuwidth/2; + for(int i=0; i(h-2*im.statusBarHeight)) ww = h-2*im.statusBarHeight; + if(cur==0) { + if(tmpe2==null) tmpe2 = new Engine2(ww, ww); + kdr = tmpe2.MainCanvas(); + }else if(cur==1) { + if(tmpe1==null) tmpe1 = new Engine1(ww, ww); + kdr = tmpe1.MainCanvas(); + }else { + if(tmpswf==null) tmpswf = new Capuchin(Rms.visid); + kdr = ((Capuchin)tmpswf).getImage(ww, ww); + } + g.drawImage(Effects.reflection(kdr, 0.5D), w/2, 2*im.statusBarHeight, 17); + drawTitle(g, getTime()); + } + + private void choiceSkin(Graphics g, int cx, int cy) { + g.setColor(0); + int x = w/2-im.pal.getWidth()/2; + g.fillRect(0, 0, w, h); + g.drawImage(im.pal, x, 4*im.statusBarHeight, 20); + //cursor + g.setColor(0x00); + int dcur = 4; + g.drawLine(cx + 1, cy, cx + dcur, cy); + g.drawLine(cx - dcur, cy, cx - 1, cy); + g.drawLine(cx, cy - dcur, cx, cy - 1); + g.drawLine(cx, cy + 1, cx, cy + dcur); + // + thisskin=Effects.get(im.pal, cx-x, cy-4*im.statusBarHeight); + drawTitle(g, Integer.toHexString(thisskin)); + } + + private void drawSoft(Graphics g) { + int fh = medFont.getHeight()+2; + int wsoft = 26; + int msoft = (w-wsoft*2)/3; + g.setFont(medFont); + //Линия + g.setColor(0); + g.drawLine(0, h-fh-1, w, h-fh-1); + //Меню + drawRect(g, (menuup!=0 || menu)?softUp1:softDn1, (menuup!=0 || menu)?softUp2:softDn2, 0, h-fh, wsoft, fh); + g.setColor(valuet); + g.fillTriangle(wsoft/2, h-5, 3, h-fh+7, wsoft-3, h-fh+7); + //Выход + drawRect(g, rspressed?softUp1:softDn1, rspressed?softUp2:softDn2, w-wsoft, h-fh, wsoft, fh); + g.drawImage(im.exit, w-2, h-fh, 24); + //* - Визуализация + drawRect(g, Rms.vis?softUp1:softDn1, Rms.vis?softUp2:softDn2, wsoft, h-fh, msoft, fh); + g.drawChar('*', wsoft+msoft/6, h-fh+2, 20); + g.drawImage(im.star, wsoft+msoft-msoft/6, h-fh+fh/2, 10); + //0 - Тексты Песен + drawRect(g, Rms.isLyric?softUp1:softDn1, Rms.isLyric?softUp2:softDn2, wsoft+msoft, h-fh, w-2*(wsoft+msoft), fh); + g.drawChar('0', w/2-msoft/4, h-fh+2, 17); + g.drawImage(im.zero, w/2+msoft/4, h-fh+fh/2, 3); + // - Акселерометр + drawRect(g, Rms.accel?softUp1:softDn1, Rms.accel?softUp2:softDn2, w-wsoft-msoft, h-fh, msoft, fh); + g.drawChar('#', w-wsoft-msoft+msoft/6, h-fh+2, 20); + g.drawImage(im.pound, w-wsoft-msoft/6, h-fh+fh/2, 10); + } + private void drawTitle(Graphics g, String text) { - int fh = medFont.getHeight()+4; g.setColor(valuet); g.setFont(medFont); - if(Rms.skinid==3) {text=toEmo(text);} - g.drawString(text, w/2, 2, 17); - drawRect(g, softUp1, softUp2, 0, 0, w, fh/2); - drawRect(g, softDn1, softDn2, 0, fh/2, w, fh/2); - } - - public void drawRect(Graphics g, int color1, int color2, int x1, int y1, int w, int h) { - int a1 = (color1 >> 24) & 0xff; - int r1 = ((color1 & 0xFF0000) >> 16); - int g1 = ((color1 & 0x00FF00) >> 8); - int b1 = (color1 & 0x0000FF); - int a2 = (color2 >> 24) & 0xff; - int r2 = ((color2 & 0xFF0000) >> 16); - int g2 = ((color2 & 0x00FF00) >> 8); - int b2 = (color2 & 0x0000FF); - - int count = h / 3; - if (count < 0) { - count = -count; - } - if (count < 8) { - count = 8; - } - int crd1, crd2; - - for (int i = count - 1; i >= 0; i--) { - crd1 = i * h / count + y1; - crd2 = (i + 1) * h / count + y1; - if (crd1 == crd2) { - continue; - } - if(lite) { - g.setColor(i * (r2 - r1) / (count - 1) + r1, i * (g2 - g1) / (count - 1) + g1, i * (b2 - b1) / (count - 1) + b1); - g.fillRect(x1, crd1, w, crd2 - crd1); - }else{ - int[] pixelArray = new int[w * (crd2 - crd1)]; - for(int zi = 0; zi < pixelArray.length; zi++) - pixelArray[zi] = (int) ((i * (a2 - a1) / (count - 1) + a1) << 24) | - ((i * (r2 - r1) / (count - 1) + r1) << 16) | - ((i * (g2 - g1) / (count - 1) + g1) << 8) | (i * (b2 - b1) / (count - 1) + b1); - g.drawRGB(pixelArray, 0, w, x1, crd1, w, crd2 - crd1, true); - } - } - } - - private void drawSoft(Graphics g, String lsoft, String rsoft) { - int fh = medFont.getHeight()+2; - g.setColor(text); - g.setFont(medFont); - g.drawString(lsoft, 2, h-2, 36); - g.drawString(rsoft, w-2, h-2, 40); - drawRect(g, softUp1, softUp2, 0, h-fh, w, fh/2); - drawRect(g, softDn1, softDn2, 0, h-fh/2, w, fh/2); + int k = im.titleleft.getWidth(); + for(int i=k; i> 24) & 0xff; + int r1 = (color1 >> 16) & 0xff; + int g1 = (color1 >> 8) & 0xff; + int b1 = color1 & 0xff; + int a2 = (color2 >> 24) & 0xff; + int r2 = (color2 >> 16) & 0xff; + int g2 = (color2 >> 8) & 0xff; + int b2 = color2 & 0xff; + int beforecolor = g.getColor(); + int crd1, crd2; + int count = h/3; + if (count < 0) count = -count; + if (count < 8) count = 8; + boolean lite = false; + if(a1==0xff && a2==0xff) lite = true; + for (int i=count-1; i>=0; i--) { + crd1 = i*h/count+y1; + crd2 = (i+1)*h/count+y1; + if (crd1 == crd2) continue; + if(lite) { + g.setColor(i * (r2 - r1) / (count - 1) + r1, i * (g2 - g1) / (count - 1) + g1, i * (b2 - b1) / (count - 1) + b1); + g.fillRect(x1, crd1, w, crd2 - crd1); + }else{ + int[] pixelArray = new int[w * (crd2 - crd1)]; + for(int zi = 0; zi < pixelArray.length; zi++) + pixelArray[zi] = (int) ((i * (a2 - a1) / (count - 1) + a1) << 24) | + ((i * (r2 - r1) / (count - 1) + r1) << 16) | + ((i * (g2 - g1) / (count - 1) + g1) << 8) | (i * (b2 - b1) / (count - 1) + b1); + g.drawRGB(pixelArray, 0, w, x1, crd1, w, crd2 - crd1, true); + } } + g.setColor(beforecolor); + } + + private void ACLS(Graphics g, int a1, int color) { + int[] pixelArray = new int[g.getClipWidth() * g.getClipHeight()]; + for(int i = 0; i < pixelArray.length; i++) + pixelArray[i] = (int) (a1 << 24| color & 0x00ffffff); + g.drawRGB(pixelArray, 0, g.getClipWidth(), 0, 0, g.getClipWidth(), g.getClipHeight(), true); + } + + //Methods + + private boolean checkTime() { + Calendar cal = Calendar.getInstance (); + int ch = cal.get(Calendar.HOUR_OF_DAY); + int cm = cal.get(Calendar.MINUTE); + if(ch!=Rms.dh) return false; + else return (cm>=Rms.dm); + } + + private String getTime() { + StringBuffer sb = new StringBuffer(); + Calendar cal = Calendar.getInstance(); + int tmp; + tmp = cal.get(Calendar.HOUR_OF_DAY); + if(tmp<=9) sb.append('0'); sb.append(tmp); + sb.append(':'); + //Минута + tmp = cal.get(Calendar.MINUTE); + if(tmp<=9) sb.append('0'); sb.append(tmp); return sb.toString(); } - private void upMode() { - mode = 1-mode; - e2=null; - album = null; + private int random(int min, int max) { + return min + ((new Random().nextInt() >>> 1)%(max-min)); } private void ABRepeat() { @@ -640,4 +1008,32 @@ public class Canv extends Canvas implements Runnable, MediaControlListener { } catch (Exception e) { } } + + private String scrollText(String text, int id) { + int count; + if(id==3) count = lyricWidth; + else count = textWidth; + String tmp = text; + int lent = text.length(); + int scr = lent - count; + try { + if (lent > count) { + tmp = text.substring(scrollPos[id], scrollPos[id] + count); + if(sleepPos[id] scr) { + scrollPos[id]--; + scrolldirection[id] = !scrolldirection[id]; + } else if (scrollPos[id] < 0) { + scrollPos[id] = 0; + scrolldirection[id] = !scrolldirection[id]; + } + sleepPos[id] = 0; + } + } + }catch(Exception ex) {tmp = text;} + return tmp; + } } \ No newline at end of file diff --git a/src/Capuchin.java b/src/Capuchin.java index db558ea..007c457 100644 --- a/src/Capuchin.java +++ b/src/Capuchin.java @@ -10,23 +10,13 @@ import javax.microedition.lcdui.*; */ public class Capuchin { - //public FlashPlayer flashPlayer; public FlashImage flashImage; - //public FlashCanvas flashCanvas; public Capuchin(int i) { -// flashPlayer = null; flashImage = null; -// flashCanvas = null; try { - flashImage = FlashImage.createImage(getClass().getResourceAsStream("/"+String.valueOf(i)+".swf"), null); -// if(flashImage != null) -// { -// flashCanvas = new FlashCanvas(flashImage); -// flashPlayer = FlashPlayer.createFlashPlayer(flashImage, flashCanvas); -// flashCanvas.setFullScreenMode(true); -// } + flashImage = FlashImage.createImage(getClass().getResourceAsStream("/"+String.valueOf(i-1)+".swf"), null); } catch(Exception ex) {} } @@ -34,4 +24,11 @@ public class Capuchin { public void drawFlash(Graphics g, int x, int y, int w, int h) { if(flashImage!=null) flashImage.render(g, x, y, w, h); } + + public Image getImage(int w, int h) { + Image img = Image.createImage(w, h); + Graphics g = img.getGraphics(); + if(flashImage!=null) flashImage.render(g, 0, 0, w, h); + return img; + } } \ No newline at end of file diff --git a/src/Effects.java b/src/Effects.java index 046bd80..07ffd32 100644 --- a/src/Effects.java +++ b/src/Effects.java @@ -6,6 +6,41 @@ import javax.microedition.lcdui.*; */ public class Effects { + + public static Image reflection(Image img, double percent) { + int w = img.getWidth(); + int h = img.getHeight(); + int[] rgb = new int[w * h]; + int[] newRgb = new int[w * (h * 2 + 1)]; + img.getRGB(rgb, 0, w, 0, 0, w, h); + double column = 255D / ((double)h * percent); + System.arraycopy(rgb, 0, newRgb, 0, rgb.length); + + for(int i=0; i=h-h*percent; j--) + { + int alpha = (rgb[j*w+i] >> 24) & 0xff; + int red = (rgb[j*w+i] >> 16) & 0xff; + int green = (rgb[j*w+i] >> 8) & 0xff; + int blue = rgb[j*w+i] & 0xff; + int alp = (int)(255D - column * (double)(h - 1 - j)); + if(alp > alpha) alp = alpha; + newRgb[(2*h-j)*w+i] = (alp << 24) | (red << 16) | (green << 8) | blue; + } + } + Image image = Image.createRGBImage(newRgb, w, h*2+1, true); + rgb = null; + newRgb = null; + return image; + } + + public static int get(Image img, int x, int y) { + int[] pixel = new int[1]; + img.getRGB(pixel, 0, img.getWidth(), x, y, 1, 1); + return pixel[0]; + } + public static Image createScaledImage(Image image, int screenWidth, int screenHeight) { int sourceWidth = image.getWidth(); int sourceHeight = image.getHeight(); @@ -51,4 +86,97 @@ public class Effects { } return temp2; } + + public static Image HSV(Image img, float hh) { + float[] hsb = new float[3]; + int w = img.getWidth(); + int h = img.getHeight(); + int[] pixel = new int[w * h]; + img.getRGB(pixel, 0, w, 0, 0, w, h); + for (int io = 0; io < pixel.length; io++) { + int qa = (pixel[io] >> 24) & 0xff; + int qr = (pixel[io] >> 16) & 0xff; + int qg = (pixel[io] >> 8) & 0xff; + int qb = pixel[io] & 0xff; + hsb = Effects.RGBtoHSV(qr, qg, qb, hsb); + hsb[0] += hh; + while(hsb[0]>360) hsb[0]-=360; + /*if(c=='S' || c == 's') hsb[1] = hsb[1] + (float) (ch/256); + if(c=='B' || c == 'b') hsb[2] = hsb[2] + (float) (ch/256);*/ + pixel[io] = (qa << 24) | Effects.HSVtoRGB(hsb[0], hsb[1], hsb[2]); + } + return Image.createRGBImage(pixel, w, h, true); + } + + public static float getHSV(int color, int c) {//0-h, 1-s, 2-v + float[] hsb = new float[3]; + int qr = (color >> 16) & 0xff; + int qg = (color >> 8) & 0xff; + int qb = color & 0xff; + hsb = Effects.RGBtoHSV(qr, qg, qb, hsb); + return hsb[c]; + } + + public static int changeHSV(int color, int c, float value) {//0-h, 1-s, 2-v + float[] hsb = new float[3]; + int qa = (color >> 24) & 0xff; + int qr = (color >> 16) & 0xff; + int qg = (color >> 8) & 0xff; + int qb = color & 0xff; + hsb = Effects.RGBtoHSV(qr, qg, qb, hsb); + hsb[c]+=value; + if(c==0) while(hsb[0]>360) hsb[0]-=360; + else { + if(hsb[c]>1.0) hsb[c]=hsb[c]-1.0f; + else if(hsb[c]<0) hsb[c]=-hsb[c]; + } + return (qa << 24) | Effects.HSVtoRGB(hsb[0], hsb[1], hsb[2]); + } + + private static int HSVtoRGB(float h, float s, float v) { + float qr = 0, qg = 0, qb = 0; + int r = 0, g = 0, b = 0; + if(s==0.0 && h==-1.0) return ((int)v << 16) | ((int)v << 8) | (int)v; + int Hi = (int) ((h / 60) % 6); + float f = (float) (h / 60 - (float)Math.floor(h/60)); + float p = (float) ((float)v*(1.0f - (float)s)); + float q = (float) ((float)v*(1.0f - (float)f*(float)s)); + float t = (float) ((float)v*(1.0f - (s*(1.0-f)))); + switch(Hi) { + case 0: qr = v; qg = t; qb = p; break; + case 1: qr = q; qg = v; qb = p; break; + case 2: qr = p; qg = v; qb = t; break; + case 3: qr = p; qg = q; qb = v; break; + case 4: qr = t; qg = p; qb = v; break; + case 5: qr = v; qg = p; qb = q; break; + } + r = (int) (255 * qr); g = (int) (255 * qg); b = (int) (255 * qb); + return (r << 16) | (g << 8) | b; + } + + private static float[] RGBtoHSV(int qr, int qg, int qb, float[] hsv) { + float h = 0, s, v; + if (hsv == null) { + hsv = new float[3]; + } + float r = (float) qr/255; float g = (float) qg/255; float b = (float) qb/255; + v = (r > g) ? r : g; + if (b > v) v = b; + float min = (r < g) ? r : g; + if (b < min) min = b; + // hue + if(v==min) h=0; + if(v==r && g>=b) h = 60 * ((g-b)/(v-min)); + if(v==r && g>> 1) % 4; + init(max); + time = System.currentTimeMillis(); + thr = new Thread(this); + thr.start(); + } + + public void run() { + while (run) { + if(up) { + while(cf!=0) { + spd++; cf--; + try { Thread.sleep(25L);} catch (InterruptedException ex) {ex.printStackTrace();} + } + up=false; + } + if(dn) { + while(cf!=0) { + spd--; cf--; + try { Thread.sleep(25L);} catch (InterruptedException ex) {ex.printStackTrace();} + } + dn=false; + } + int r = (rnd.nextInt() >>> 1) % 20; + switch(r) { + case 5: up=true; cf=100; break; + case 15: up=true; cf=400; break; + case 8: dn=true; cf=100; break; + case 18: dn=true; cf=400; break; + case 3: if(max>11) max-=10; break; + case 13: if(max<1000) init(max+=100); break; + case 4: if(K<84) K+=15; break; + case 14: if(K>16) K-=15; break; + case 6: mode = (rnd.nextInt() >>> 1) % 4; break; + } + try { + if(spd<25 && spd>-25) Thread.sleep(500L); + else Thread.sleep(2000L); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + } + + public void setRun(boolean run) { + this.run=run; + } + + public Image MainCanvas() { + dt = System.currentTimeMillis() - time; + time = System.currentTimeMillis(); + if(K>=3) ACLS(G); + else CLS(G); + for (i = 1; i0) { + if (starz[i] <= -200) { + starx[i] = (rnd.nextInt()>>>1)%(w * 4) - w * 2; + stary[i] = (rnd.nextInt()>>>1)%(h * 4) - h * 2; + starz[i] = (rnd.nextInt()>>>1)%1900; + } + SetPix((255 - 255 * (starz[i] + 200) / 2100)); + }else{ + if (starz[i] > 2000) { + starx[i] = (rnd.nextInt()>>>1)%(w * 4) - w * 2; + stary[i] = (rnd.nextInt()>>>1)%(h * 4) - h * 2; + starz[i] = (rnd.nextInt()>>>1)%1900; + } + SetPix((255-255 * (starz[i]%2100) / 2100)); + } + } + return db; + } + + private void CLS(Graphics g) { + g.setColor(0); + g.fillRect(0, 0, w, h); + } + + private void ACLS(Graphics g) { + int[] pixelArray = new int[w * h]; + for (int io = 0; io < pixelArray.length; io++) { + pixelArray[io] = (int) ((100-K) << 24) | 0; + } + g.drawRGB(pixelArray, 0, w, 0, 0, w, h, true); + } + + private void SetPix(int c) { + int sx, sy, sx1 = 0, sy1 = 0; + sx = (w / 2 + starx[i] * 200 / (starz[i] + 200)); + sy = (h / 2 - stary[i] * 200 / (starz[i] + 200)); + if(c>255) c=255; if(c<0) c=0; + switch(mode) { + case 0: + G.setColor(c, c, c); + if(i!=22) G.drawLine(sx, sy, sx, sy); + else try{G.fillRoundRect(sx, sy, starz[i]/(255-c), starz[i]/(255-c), i, i);}catch(Exception ex) {}; + break; + case 1: + G.setColor(c, c, c); + int u=starz[i]==0?1:starz[i]; + G.fillArc(sx, sy, c/u, c/u, 0, 360); + break; + case 2: + u=(rnd.nextInt()>>>1)%6; + switch(u) { + case 0: G.setColor(255-c, c, c); break; + case 1: G.setColor(c, 255-c, c); break; + case 2: G.setColor(c, c, 255-c); break; + case 3: G.setColor(255-c, 255-c, c); break; + case 4: G.setColor(255-c, c, 255-c); break; + case 5: G.setColor(c, 255-c, 255-c); break; + case 6: G.setColor(255-c, 255-c, 255-c); break; + } + if(i!=22) G.drawLine(sx, sy, sx, sy); + else try{G.fillRoundRect(sx, sy, starz[i]/(255-c), starz[i]/(255-c), i, i);}catch(Exception ex) {}; break; + case 3: + u=rnd.nextInt()%6; + switch(u) { + case 0: G.setColor(255-c, c, c); break; + case 1: G.setColor(c, 255-c, c); break; + case 2: G.setColor(c, c, 255-c); break; + case 3: G.setColor(255-c, 255-c, c); break; + case 4: G.setColor(255-c, c, 255-c); break; + case 5: G.setColor(c, 255-c, 255-c); break; + case 6: G.setColor(255-c, 255-c, 255-c); break; + } + u=starz[i]==0?1:starz[i]; + G.fillArc(sx, sy, c/u, c/u, 0, 360); + break; + case 4: + u=rnd.nextInt()%6; + switch(u) { + case 0: G.setColor(255-c, c, c); break; + case 1: G.setColor(c, 255-c, c); break; + case 2: G.setColor(c, c, 255-c); break; + case 3: G.setColor(255-c, 255-c, c); break; + case 4: G.setColor(255-c, c, 255-c); break; + case 5: G.setColor(c, 255-c, 255-c); break; + case 6: G.setColor(255-c, 255-c, 255-c); break; + } + if(i>1) { + sx1 = (w / 2 + starx[i-1] * 200 / (starz[i-1] + 200)); + sy1 = (h / 2 - stary[i-1] * 200 / (starz[i-1] + 200)); + } + G.drawLine(sx1, sy1, sx, sy); break; + } + + } + + + + private void init(int max) { + starx = new int[max];stary = new int[max];starz = new int[max]; + for (i = 0; i>>1)%(w * 4) - w * 2; + stary[i] = (rnd.nextInt()>>>1)%(h * 4) - h * 2; + starz[i] = (rnd.nextInt()>>>1)%1900; + } + CLS(G); + } +} diff --git a/src/Engine2.java b/src/Engine2.java index 7fe967c..0c02377 100644 --- a/src/Engine2.java +++ b/src/Engine2.java @@ -17,7 +17,7 @@ public class Engine2 implements Runnable { private boolean rb, gb, bb; private float x, y, tx, ty, k, d, len; - private int rc = 0, gc = 0, bc = 0, rgb = 1, fr = 1, ar = 1; + private int rc, gc, bc, rgb, fr, ar; private float[] a = new float[40]; private Random rnd; private Thread thr; @@ -29,6 +29,10 @@ public class Engine2 implements Runnable { db = Image.createImage(w, h); G = db.getGraphics(); rnd = new Random(); + rc = gc = bc = 0; + ar=(rnd.nextInt() >>> 1) % 14; + fr=((rnd.nextInt()>>>1)%6)+1; + rgb = 1; thr = new Thread(this); thr.start(); } @@ -48,7 +52,6 @@ public class Engine2 implements Runnable { case 11: U=(rnd.nextInt() >>> 1) % 9; break; case 14: if(K>16) K-=15; break; } - try { Thread.sleep(2000L); } catch (InterruptedException ex) {} @@ -63,7 +66,6 @@ public class Engine2 implements Runnable { rgb(G); visual(G); return db; - } private void rgb(Graphics grf) { @@ -114,11 +116,7 @@ public class Engine2 implements Runnable { } private void visual(Graphics grf) { - if (w > h) { - len = (float) (h / L / N); - } else { - len = (float) (w / L / N); - } + len = (float) (w>h?h:w) / L / N; k = (float) (Math.abs(rnd.nextFloat() * 360) * Math.PI / 180); float r50 = (float) (Math.abs(rnd.nextFloat()) * 50); d = (float) (Math.PI * 2 / S); @@ -139,27 +137,22 @@ public class Engine2 implements Runnable { tx = (float) (x + Math.cos(j * d + a[1]) * len); ty = (float) (y + Math.sin(j * d + a[i]) * len); x = x + (float) (Math.cos(j * d + a[i]) * len); - } - if (fr == 2) { + }else if (fr == 2) { tx = (float) (x + Math.sin(j * d + a[i]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len); - } - if (fr == 3) { + }else if (fr == 3) { tx = (float) (x + Math.tan(j * d + a[1]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len); y = y - (float) (Math.sin(j * d + a[i]) * len); - } - if (fr == 4) { + }else if (fr == 4) { tx = (float) (x + Math.tan(j * d + a[1]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len); x = y - (float) (Math.sin(j * d + a[i]) * len); - } - if (fr == 5) { + }else if (fr == 5) { tx = (float) (x + Math.tan(j * d + a[1]) * len); ty = (float) (y + Math.cos(j * d + a[i]) * len); x = (float) (x * ty * d + a[i] - (float) (Math.sin(j * d + a[i]) * len)); - } - if (fr == 6) { + }else if (fr == 6) { tx = (float) (x + Math.cos(j * d + a[1]) * len); ty = (float) (y + Math.sin(j * d + a[1]) * len); x = x + (float) (Math.sin(j * d + a[i]) * len); @@ -171,46 +164,34 @@ public class Engine2 implements Runnable { } if (ar == 2) { grf.setColor(255, (255 - 255 * i / N), 0); - } - if (ar == 3) { + }else if (ar == 3) { grf.setColor(rc, (255 - 255 * i / N), 255); - } - if (ar == 4) { + }else if (ar == 4) { grf.setColor((255 - 255 * i / N), 255, 0); - } - if (ar == 5) { + }else if (ar == 5) { grf.setColor((255 - 255 * i / N), (255 - 255 * i / N), 255); - } - if (ar == 6) { + }else if (ar == 6) { grf.setColor((255 - 255 * i / N), 255, 255); - } - if (ar == 7) { + }else if (ar == 7) { grf.setColor(0, 255, (255 - 255 * i / N)); - } - if (ar == 8) { + }else if (ar == 8) { grf.setColor(255, gc, (255 - 255 * i / N)); - } - if (ar == 9) { + }else if (ar == 9) { grf.setColor(255, (255 - 255 * i / N), (255 - 255 * i / N)); - } - if (ar == 10) { + }else if (ar == 10) { grf.setColor(rc, (255 - 255 * i / N), 0); - } - if (ar == 11) { + }else if (ar == 11) { grf.setColor(255, (255 - 255 * i / N), 255); - } - if (ar == 12) { + }else if (ar == 12) { grf.setColor((255 - 255 * i / N), 0, 255); - } - if (ar == 13) { + }else if (ar == 13) { grf.setColor((255 - 255 * i / N), 255 * i / N, 0); - } - if (ar == 14) { + }else if (ar == 14) { grf.setColor(bc, 255, (255 - 255 * i / N)); } if (T==0) grf.drawLine((int) x, (int) y, (int) tx, (int) ty); - if (T==1) grf.fillArc((int) tx, (int) ty, (int) x, (int) y, 0, 360); - if (T==2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y); + else if (T==1) grf.fillArc((int) tx, (int) ty, (int) x, (int) y, 0, 360); + else if (T==2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y); x = tx; y = ty; } @@ -227,7 +208,7 @@ public class Engine2 implements Runnable { private void ACLS(Graphics g) { int[] pixelArray = new int[w * h]; for (int io = 0; io < pixelArray.length; io++) { - pixelArray[io] = (int) (100-K << 24) | Canv.background; + pixelArray[io] = (int)(100-K << 24) | Canv.background & 0x00ffffff; } g.drawRGB(pixelArray, 0, w, 0, 0, w, h, true); } diff --git a/src/FWCashe.java b/src/FWCashe.java new file mode 100644 index 0000000..d498fc5 --- /dev/null +++ b/src/FWCashe.java @@ -0,0 +1,51 @@ + + +import javax.microedition.lcdui.Font; +import java.util.Vector; + +public class FWCashe +{ + + public static FWCashe getCache (Font font) + { + Vector fwc = new Vector (); + Vector fwc_f = new Vector (); + for (int i = 0; i < fwc.size (); i++) + if (fwc_f.elementAt(i).equals (font)) + return (FWCashe)fwc.elementAt(i); + fwc_f.addElement (font); + FWCashe f; + fwc.addElement (f = new FWCashe (font)); + return f; + } + protected Font font; + protected byte caches [][]; + + protected FWCashe (Font font) + { + this.font = font; + caches = new byte [256][]; + for (int i = 0; i < 256; i++) + caches [i] = null; + } + + public int charWidth (char ch) { + int hi = (ch >> 8)&0xFF, lo = (ch)&0xFF; + if (caches[hi] == null) { + caches[hi] = new byte [256]; + for (int i = 0; i < 256; i++) + caches [hi][i] = -1; + } + if (caches [hi][lo] == -1) + caches [hi][lo] = (byte) font.charWidth(ch); + return caches [hi][lo]; + } + + public int stringWidth(String s) + { + int l = s.length (), i, r; + for (r = 0, i = 0; i < l; i++) + r += charWidth(s.charAt(i)); + return r; + } +} diff --git a/src/FindLyrics.java b/src/FindLyrics.java index a87c343..8c824c3 100644 --- a/src/FindLyrics.java +++ b/src/FindLyrics.java @@ -24,7 +24,7 @@ public class FindLyrics { String url = "http://www.lyricsplugin.com/winamp03/plugin/?artist="+urlName(artist)+"&title="+urlName(title); try { byte[] res = send(url); - int lr1 = MSG.indexOf("
"); + int lr1 = MSG.indexOf("
"); int lr2 = MSG.indexOf("
", lr1); if((lr2-lr1)>30) { FileConnection fc; @@ -47,7 +47,7 @@ public class FindLyrics { String artist = song.substring(0, song.lastIndexOf('-')).trim(); String title = song.substring(song.lastIndexOf('-')+1).trim(); MSG = ""; - String url = "http://annimon.z83.ru/nowplaying.php?id="+Rms.id+"&a="+urlName(artist)+"&t="+urlName(title); + String url = "http://annimon.com/seps/seps.php?id="+Rms.id+"&a="+urlName(artist)+"&t="+urlName(title); try { send(url); } catch (Exception e) { diff --git a/src/FindText.java b/src/FindText.java index aeb6936..0105e55 100644 --- a/src/FindText.java +++ b/src/FindText.java @@ -1,5 +1,3 @@ - -import com.sonyericsson.multimedia.MetaData; import javax.microedition.lcdui.*; /* @@ -13,45 +11,31 @@ import javax.microedition.lcdui.*; public class FindText extends Form implements CommandListener { private Command back, ok; - public TextField artist, title; + public TextField all_tb; - public FindText() { + public FindText(String all) { super(SEPS.midlet.lang.findtext); back = new Command(SEPS.midlet.lang.back, Command.BACK, 2); ok = new Command(SEPS.midlet.lang.ok, Command.OK, 1); - String ar="",ti=""; - try{ - MetaData metaData = SEPS.midlet.cnv.media.getMetaData(); - ti = getValue(metaData, MetaData.TITLE_KEY); - ar = getValue(metaData, MetaData.ARTIST_KEY); - }catch(Exception ex){} - artist = new TextField(SEPS.midlet.lang.artist, ar, 255, TextField.ANY); - title = new TextField(SEPS.midlet.lang.title, ti, 255, TextField.ANY); - append(artist); - append(title); + all_tb = new TextField(SEPS.midlet.lang.artist, all, 512, TextField.ANY); + append(all_tb); addCommand(ok); addCommand(back); setCommandListener(this); SEPS.midlet.dsp.setCurrent(this); } - private String getValue(MetaData metaData, String md) { - String data = metaData.getValue(md); - StringBuffer sb = new StringBuffer(); - for(int i=0; i>> 1) % 10000000; } new Skin(Rms.skinid); - cnv = new Canv(); + cnv = new Canv(im); dsp = Display.getDisplay(this); dsp.setCurrent(cnv); } diff --git a/src/SetSleepMode.java b/src/SetSleepMode.java index 320adb6..e2231d1 100644 --- a/src/SetSleepMode.java +++ b/src/SetSleepMode.java @@ -33,19 +33,23 @@ public class SetSleepMode extends Form implements CommandListener { } if (c == ok) { - Calendar cal = Calendar.getInstance(); - //текущее время - int ch = cal.get(Calendar.HOUR_OF_DAY); - int cm = cal.get(Calendar.MINUTE); - //время выключения - int dh = ch; - int dm = cm + Integer.parseInt(zw.getString()); - while(dm>=60) { - dm=dm-60; dh++; + int time = Integer.parseInt(zw.getString()); + if(time == 0) Rms.slpmode=false; + else { + Calendar cal = Calendar.getInstance(); + //текущее время + int ch = cal.get(Calendar.HOUR_OF_DAY); + int cm = cal.get(Calendar.MINUTE); + //время выключения + int dh = ch; + int dm = cm + time; + while(dm>=60) { + dm=dm-60; dh++; + } + if(dh>=24) dh=dh-24; + Rms.slpmode=true; + Rms.dh=dh; Rms.dm=dm; } - if(dh>=24) dh=dh-24; - Rms.slpmode=true; - Rms.dh=dh; Rms.dm=dm; SEPS.midlet.dsp.setCurrent(SEPS.midlet.cnv); } } diff --git a/src/Skin.java b/src/Skin.java index bbebf1e..8cfdcab 100644 --- a/src/Skin.java +++ b/src/Skin.java @@ -10,97 +10,44 @@ public class Skin { public Skin(int skin) { - switch(skin) { - case 0: //default - setSEPS(); - break; - case 1: //PPM - setPPM(); - break; - case 2: //Gothic - setGothic(); - break; - case 3: //Emo - setEmo(); - break; - case 4: //SEclub - setSEclub(); - break; - case 5: //SEclub - setaNM(); - break; + if(skin==1) skin = Rms.skinid = 0xFF3477d5; + else if(skin==2) skin = Rms.skinid = 0xFF181818; + else if(skin==3) skin = Rms.skinid = 0xFFCE6BA6; + else if(skin==4) skin = Rms.skinid = 0; + else if(skin==5) skin = Rms.skinid = 0xFFFFFF99; + Canv.background = 0xFF2F8400; + Canv.valuet = 0xFFFFFFFF; + if(skin!=0) { + Canv.softUp1 = Effects.changeHSV(Canv.background, 2, 0.4352941f); + Canv.softUp2 = Effects.changeHSV(Canv.background, 2, 0.19215685f); + Canv.softDn1 = Effects.changeHSV(Canv.background, 2, -0.007843137f); + Canv.softDn2 = Effects.changeHSV(Canv.background, 2, -0.16862747f); + Canv.line = Effects.changeHSV(Canv.background, 0, 22); + Canv.line = Effects.changeHSV(Canv.line, 2, 0.21568626f); + Canv.text = Effects.changeHSV(Canv.background, 0, 22); + Canv.text = Effects.changeHSV(Canv.text, 2, 0.082352936f); + Canv.inf = Effects.changeHSV(Canv.background, 2, -0.16078433f); + for(int i=0; i<=2; i++) { + float delta = Effects.getHSV(skin, i) - Effects.getHSV(Canv.background, i); + if(delta>-0.05 && delta<0.05) continue; + Canv.softUp1 = Effects.changeHSV(Canv.softUp1, i, delta); + Canv.softUp2 = Effects.changeHSV(Canv.softUp2, i, delta); + Canv.softDn1 = Effects.changeHSV(Canv.softDn1, i, delta); + Canv.softDn2 = Effects.changeHSV(Canv.softDn2, i, delta); + Canv.line = Effects.changeHSV(Canv.line, i, delta); + Canv.text = Effects.changeHSV(Canv.text, i, delta); + Canv.inf = Effects.changeHSV(Canv.inf, i, delta); + } + Canv.background = skin; + }else{ + Canv.softUp1 = 0xFF57f300; + Canv.softUp2 = 0xFF41b500; + Canv.softDn1 = 0xFF2e8200; + Canv.softDn2 = 0xFF205900; + Canv.line = 0x00BB00; + Canv.text = 0x009900; + Canv.inf = 0x215B00; } - } - - private void setSEPS() { - Canv.softUp1 = 0xFF242424; - Canv.softUp2 = 0x87282828; - Canv.softDn1 = 0x87151515; - Canv.softDn2 = 0xFF181818; - Canv.background = 0x00; - Canv.line = 0x00BB00; - Canv.text = 0x009900; - Canv.valuet = 0x0000E6; - Canv.inf = 0x992235; - } - - private void setPPM() { - Canv.softUp1 = 0xFF3477d5; - Canv.softUp2 = 0x883477d5; - Canv.softDn1 = 0x8812396f; - Canv.softDn2 = 0xFF12396f; - Canv.background = 0xFFFFFF; - Canv.line = 0x0064A8; - Canv.text = 0x282828; - Canv.valuet = 0x296321; - Canv.inf = 0xA2DBF9; - } - - private void setGothic() { - Canv.softUp1 = 0xFF141414; - Canv.softUp2 = 0x87181818; - Canv.softDn1 = 0x87151515; - Canv.softDn2 = 0xFF181818; - Canv.background = 0x00; - Canv.line = 0x6D6D6D; - Canv.text = 0x595959; - Canv.valuet = 0x666666; - Canv.inf = 0x474747; - } - - private void setEmo() { - Canv.softUp1 = 0xFF1E1012; - Canv.softUp2 = 0x8887466D; - Canv.softDn1 = 0x88512C31; - Canv.softDn2 = 0xFFCE6BA6; - Canv.background = 0xFF879B; - Canv.line = 0xFF28A9; - Canv.text = 0x00; - Canv.valuet = 0x60204A; - Canv.inf = 0xD17DDB; - } - - private void setSEclub() { - Canv.softUp1 = 0xFF295723; - Canv.softUp2 = 0x88295723; - Canv.softDn1 = 0x8834EB5E; - Canv.softDn2 = 0xFF34EB5E; - Canv.background = 0x295723; - Canv.line = 0xDFFFFF; - Canv.text = 0x2ED45E; - Canv.valuet = 0x34EB5E; - Canv.inf = 0xCAC410; - } - - private void setaNM() { - Canv.softUp1 = 0xFF99AACC; - Canv.softUp2 = 0x7599AACC; - Canv.softDn1 = 0x75CCFF99; - Canv.softDn2 = 0xFFCCFF99; - Canv.background = 0xFFFF99; - Canv.line = 0x002B55; - Canv.text = 0x333399; - Canv.valuet = 0x640022; - Canv.inf = 0x008000; + } } diff --git a/src/about b/src/about index 593cdca..1a296cf 100644 --- a/src/about +++ b/src/about @@ -1,15 +1,15 @@ -Sony Ericsson Player Service 5.2 +Sony Ericsson Player Service 7.0 Автор: Виктор aNNiMON Мельник -Сайт разработчика: http://annimon.z83.ru/ +Сайт разработчика: http://annimon.com/ -Программа - управление родным плейером для телефонов Sony Ericsson с поддержкой MultimediaService API и датчиком движения. +Программа - управление стандартным плейером телефонов Sony Ericsson с поддержкой Multimedia Service API и акселерометром. Управление: Влево/Вправо/Движение акселерометром - Переключение песен. - Вверх/Вниз - переключение режимов: Всё/Визуализация/Текст. + Вверх/Вниз - переключение режимов: Всё/Визуализация. 1 - Горячая клавиша поиска текста. - 3 - установить начало/конец отрезка или отключить повтор. + 3 - установить начало/конец отрезка для повтора или отключить повтор. 4/6 - Перемотка назад/вперед. 5/Огонь - Пауза. 9 - Спящий режим. @@ -18,6 +18,21 @@ Sony Ericsson Player Service 5.2 # - Включение/Отключение акселерометра. Изменения: + Версия 7.0 + - При выборе цвета скина, по нажатию кн.0 можно выбрать цвет текста. + + Версия 6.0 + - Перерисован интерфейс. Огромное спасибо за идею EviGL. + - Выбор цвета скина. Принципиально новая технология - весь интерфейс строиться всего-лишь на одном цвете - цвете фона. Остальные цвета генерируются при помощи некоторой системы преобразований. + - Добавил еще одну программную визуализацию - звезды. + - Выбор визуализации теперь доступен из отдельного пункта меню, при этом есть возможность её предпросмотра. Кнопки 4/6 - переключить визуализацию. + - Визуализация переключения режимов (показ всех данных / визуализация). + - Скробблинг теперь успешно перенесен на сайт annimon.com. + - Обновление скрипта скробблера: теперь вместо текстового режима будет выдаваться html-страница; в списке проигранных треков, теперь будет выдаваться ссылка на просмотр текста песен; сортировка по последним обновленным записям; некоторые другие исправления. Теперь скрипт доступен по адресу http://annimon.com/seps/seps.php. + - Отключение таймера при вводе 0 в спящем режиме. + - Скроллинг длинных названий песен. + - Добавлена быстрая перемотка на зажатие кнопок 4 или 6. + - Добавлена визуализация смены громкости. Версия 5.2 - Добавлен пункт в настройках, при котором переключение треков будет идти только вперед, независимо от направления рывка. - Поддержка русской кодировки в именах файлов. diff --git a/src/mobscrob/scrobbler/AudioScrobbler.java b/src/mobscrob/scrobbler/AudioScrobbler.java new file mode 100644 index 0000000..385bd56 --- /dev/null +++ b/src/mobscrob/scrobbler/AudioScrobbler.java @@ -0,0 +1,276 @@ +/* + * aNNiMON 2011 + * For more info visit http://annimon.com/ + */ +package mobscrob.scrobbler; + +import java.io.OutputStream; +import java.util.Calendar; +import java.util.Vector; +import javax.microedition.io.Connector; +import javax.microedition.io.HttpConnection; +import javax.microedition.lcdui.Image; + +/** + * + * @author aNNiMON + */ +public class AudioScrobbler { + + private Image avatarBitmap; + private String challenge; + private String clientId; + private String clientVersion; + private boolean connected = false; + private String handshakeUrl; + private String md5Response; + private String passwordMD5; + private String submitUrl; + private String user; + private static final String DEFAULT_HOST = "";//"post.audioscrobbler.com"; + + /* + * private void SubmitTrack() + * { + * if (this.LastFM[2] == string.Empty) + * { + * this.LastFM[2] = Audioscrobbler.GetPasswordMD5(this.LastFM[1]); + * } + * if (this.audioscrobbler == null) + * { + * this.audioscrobbler = new Audioscrobbler("opa", "0.1", this.LastFM[0], this.LastFM[2]); + * this.audioscrobbler.ConnectionFailed += new EventHandler(audioscrobbler_ConnectionFailed); + * this.audioscrobbler.Submitted += new EventHandler(this.audioscrobbler_Submitted); + * this.audioscrobbler.ConnectionEstablished += new EventHandler(audioscrobbler_ConnectionEstablished); + * } + * this.audioscrobbler.Connect(); + * } + * + * ((Audioscrobbler)sender).Submit(frmMain.CurrentTrackInfo[1], frmMain.CurrentTrackInfo[3], frmMain.CurrentTrackInfo[2], + * "1", frmMain.CurrentTrackLength / 1000); + */ + + //"opa", "0.1", this.LastFM[0], this.LastFM[2] + public AudioScrobbler(String clientId, String clientVersion, String user, String passwordMD5) { + this.clientId = clientId; + this.clientVersion = clientVersion; + this.user = user; + this.passwordMD5 = passwordMD5; + this.handshakeUrl = "http://post.audioscrobbler.com/?hs=true&p=1.1&c=" + this.clientId + "&v=" + this.clientVersion + "&u=" + this.user; + } + + private void connectNow() { + try { + this.avatarBitmap = null; + + byte[] body = HTTPUtil.getUrl(this.handshakeUrl, DEFAULT_HOST); + Vector lines = ByteUtil.readLines(body); + + // check is OK + String str = (String) lines.elementAt(0); + if (str.equals("UPTODATE") || str.startsWith("UPDATE")) + { + this.challenge = (String) lines.elementAt(1); + this.submitUrl = (String) lines.elementAt(2); + String s = this.passwordMD5 + this.challenge; + this.md5Response = MD5.getHashString(s).replace('-', '\0').toLowerCase(); + this.connected = true; + //ConnectionEstablished(this, new EventArgs()); + } + } catch (Exception ex) { + //ConnectionFailed(this, new EventArgs()); + } + } + + public void connect() { + Thread thread = new Thread(new Runnable() { + + public void run() { + connectNow(); + } + }); + thread.start(); + } + + private void downloadAvatar() { + String str = MD5.getHashString(this.user).replace('-', '\0').toLowerCase(); + try { + byte[] img = HTTPUtil.getUrl("http://static.last.fm/avatar/" + str + ".jpg/", ""); + this.avatarBitmap = Image.createImage(img, 0, img.length); + } catch (Exception ex) { + } + } + + public static String GetPasswordMD5(String password) { + return MD5.getHashString(password).replace('-', '\0').toLowerCase(); + } + + public void Submit(String artist, String song, String album, String musicBrainzId, int length) { + if (this.connected) { + final Submittor submittor = new Submittor(this.submitUrl, this.user, this.md5Response, artist, song, album, musicBrainzId, length, 3); + + Thread thread = new Thread(new Runnable() { + + public void run() { + submittor.execute(); + } + }); + thread.start(); + } + } + + public Image AvatarBitmap() { + return this.avatarBitmap; + } + + private class Submittor { + + private String album; + private String artist; + private int length; + private String musicBrainzId; + private String response; + private int retry; + private String song; + private String url; + private String user; + + public Submittor(String url, String user, String response, String artist, String song, String album, String musicBrainzId, int length, int retry) { + this.url = url; + this.user = user; + this.response = response; + this.artist = (retry == 0) ? HTTPUtil.encodeParam(artist) : artist; + this.song = (retry == 0) ? HTTPUtil.encodeParam(song) : song; + this.album = (retry == 0) ? HTTPUtil.encodeParam(album) : album; + this.musicBrainzId = musicBrainzId; + this.length = length; + this.retry = retry; + } + + private String getTime() { + StringBuffer sb = new StringBuffer(); + Calendar cal = Calendar.getInstance(); + int tmp; + //Год 2009-06-15 20:45:30Z + tmp = cal.get(Calendar.YEAR); + if (tmp <= 9) { + sb.append('0'); + } + sb.append(tmp); + sb.append('-'); + //Месяц + tmp = cal.get(Calendar.MONTH) + 1; + if (tmp <= 9) { + sb.append('0'); + } + sb.append(tmp); + sb.append('-'); + //День + tmp = cal.get(Calendar.DAY_OF_MONTH); + if (tmp <= 9) { + sb.append('0'); + } + sb.append(tmp); + sb.append(' '); + //Час + tmp = cal.get(Calendar.HOUR_OF_DAY); + if (tmp <= 9) { + sb.append('0'); + } + sb.append(tmp); + sb.append(':'); + //Минута + tmp = cal.get(Calendar.MINUTE); + if (tmp <= 9) { + sb.append('0'); + } + sb.append(tmp); + sb.append(':'); + //Секунда + tmp = cal.get(Calendar.SECOND); + if (tmp <= 9) { + sb.append('0'); + } + sb.append(tmp); + return sb.toString(); + } + + public void execute() { + HttpConnection conn = null; + OutputStream os = null; + try { + StringBuffer sb = new StringBuffer(); + sb.append("u=").append(this.user); //User + sb.append("&s=").append(this.response); //Session + sb.append("&a[0]=").append(this.artist); //Artist + sb.append("&t[0]=").append(this.song); //Title + sb.append("&b[0]=").append(this.album); //Album + sb.append("&m[0]=").append(this.musicBrainzId); //MusicBrainzId + + sb.append("&l[0]=").append(this.length); //Length (Duration) + sb.append("&i[0]=").append(getTime()); //Current Time + + byte[] bytes = sb.toString().getBytes("UTF-8"); + + // set up HTTP connection + conn = (HttpConnection) Connector.open(this.url); + conn.setRequestMethod(HttpConnection.POST); + conn.setRequestProperty("User-Agent", "SEPlayerService"); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty("Content-Length", String.valueOf(bytes.length)); + // try opening output stream first + os = conn.openOutputStream(); + // try writing byte by byte + try { + os.write(bytes, 0, bytes.length); + } finally { + os.close(); + } + /*for (int i = 0; i < paramBytes.length; i++) { + os.write((int) paramBytes[i]); + }*/ + byte[] resp = HTTPUtil.readHttpResponse(conn); + Vector lines = ByteUtil.readLines(resp); + + try { + String str2 = (String) lines.elementAt(0); + int interval = 0; + String str3 = (String) lines.elementAt(1); + if ((str3 != null) && str3.startsWith("INTERVAL")) { + try { + interval = Integer.parseInt(str3.substring("INTERVAL ".length())); + } catch (Exception ex) { + } + } + if (str2.startsWith("FAILED")) { + this.retry(interval); + } else if (str2.startsWith("BADAUTH")) { + throw new Exception(); + } + } finally { + conn.close(); + } + } catch (Exception ex) { + } + } + + private void retry(int interval) { + if (this.retry <= 3) { + this.retry++; + try { + Thread.sleep((int) ((interval * this.retry) * 0x3e8)); + } catch (InterruptedException ex) { + } + final AudioScrobbler.Submittor submittor = new AudioScrobbler.Submittor(this.url, this.user, this.response, this.artist, this.song, this.album, this.musicBrainzId, this.length, this.retry); + + Thread thread = new Thread(new Runnable() { + + public void run() { + submittor.execute(); + } + }); + thread.start(); + } + } + } +} diff --git a/src/mobscrob/scrobbler/ByteUtil.java b/src/mobscrob/scrobbler/ByteUtil.java new file mode 100644 index 0000000..cc5d563 --- /dev/null +++ b/src/mobscrob/scrobbler/ByteUtil.java @@ -0,0 +1,79 @@ +/** + * ByteUtil.java + * @date 30 Sep 2008 + * + * This program is distributed under the terms of the GNU General Public + * License + * Copyright 2008 NJ Pearman + * + * This file is part of MobScrob. + * + * MobScrob is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MobScrob is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MobScrob. If not, see . + */ +package mobscrob.scrobbler; + +import java.util.Vector; + +/** + * + */ +/** + * @author Neill + * + */ +public class ByteUtil { + + /** + * Utility class so private constructor + */ + private ByteUtil() { + } + + /** + * Returns a Vector of Strings representing the lines present in the byte + * array, separated by '\n' return feed. + * + * @param bytes + * @return + */ + public static Vector readLines(byte[] bytes) { + //final String methodName = "1"; + Vector lines = new Vector(); + if (bytes == null || bytes.length == 0) { + return lines; + } + StringBuffer line = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + if (bytes[i] == '\n') { + lines.addElement(line.toString()); + line = new StringBuffer(); + } else { + // add to current line + line.append((char) bytes[i]); + } + } + + return lines; + } + + public static void replaceSpaceWithPlus(byte[] bytes) { + if (bytes != null) { + for (int i = 0; i < bytes.length; i++) { + if (bytes[i] == ' ') { + bytes[i] = '+'; + } + } + } + } +} diff --git a/src/mobscrob/scrobbler/HTTPUtil.java b/src/mobscrob/scrobbler/HTTPUtil.java new file mode 100644 index 0000000..dc6cf52 --- /dev/null +++ b/src/mobscrob/scrobbler/HTTPUtil.java @@ -0,0 +1,192 @@ +/** + * HTTPUtil.java + * + * This program is distributed under the terms of the GNU General Public + * License + * Copyright 2008 NJ Pearman + * + * This file is part of MobScrob. + * + * MobScrob is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MobScrob is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MobScrob. If not, see . + */ +package mobscrob.scrobbler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.Enumeration; +import java.util.Vector; + +import javax.microedition.io.Connector; +import javax.microedition.io.HttpConnection; + + +/** + * @author Neill + * + */ +public class HTTPUtil { + + private static final String ENC_UTF8 = "UTF-8"; + + public static final String HEADER_HOST = "Host"; + + private HTTPUtil() {} + + /** + * Encodes a parameter, also ensuring that it is UTF-8 + * + * @param s + * @return + * @throws UnsupportedEncodingException + */ + public static String encodeParam(String s) { + if (s == null) { + return s; + } + + // encode as UTF-8 + String utf8Str; + try { + utf8Str = new String(s.getBytes(), ENC_UTF8); + } catch (UnsupportedEncodingException ex) { + utf8Str = s; + } + + StringBuffer sb = new StringBuffer(utf8Str.length() * 3); + char[] chars = utf8Str.toCharArray(); + int next; + + // encode the chars in the UTF-8 String + for (int i = 0; i < chars.length; i++) { + next = chars[i]; + + if ((next >= 0x30 && next <= 0x39) || // 0-9 + (next >= 0x41 && next <= 0x5A) || // A-Z + (next >= 0x61 && next <= 0x7A)) { // a-z + sb.append((char) next); + } else if ((next == 0xA0)) { // ' ' (whitespace) + sb.append('+'); + } else { // encode all other chars + sb.append("%"); + if (next <= 0xf) + sb.append("0"); + sb.append(Integer.toHexString(next)); + } + } + return sb.toString(); + } + + /** + * Attempts to open a URL using the GET method over HTTP and read the + * response into a byte array. Any IOExceptions are simply thrown out of + * this method to be caught elsewhere. + * + * @param url + * @return + * @throws IOException + */ + public static byte[] getUrl(String url, String headerHostname) throws IOException { + HttpConnection conn = null; + try { + conn = (HttpConnection) Connector.open(url); + + // set the compulsory HTTP/1.1 Host: header, as GET + conn.setRequestMethod(HttpConnection.GET); + //if(!headerHostname.equals("")) + // conn.setRequestProperty(HEADER_HOST, headerHostname); + + byte[] body = readHttpResponse(conn); + return body; + } finally { + closeHttpConnection(conn); + } + } + + /** + * Reads the response from the specified HTTP connection into a byte array. + * + * @param conn + * @return + * @throws IOException + */ + public static byte[] readHttpResponse(HttpConnection conn) throws IOException { + final String methodName = "6"; + int rc = conn.getResponseCode(); + if (rc != HttpConnection.HTTP_OK) { + String msg = "HTTP response code not OK: " + rc; + throw new IOException(msg); + } + + String connHeader = conn.getHeaderField("Connection"); + + // connect + int len = (int) conn.getLength(); + + InputStream is = null; + + try { + is = conn.openInputStream(); + + // read response + if (len > -1) { + byte[] body = new byte[len]; + int actual = 0; + int bytesread = 0; + + while ((bytesread != len) && (actual != -1)) { + actual = is.read(body, bytesread, len - bytesread); + bytesread += actual; + } + // do something + return body; + } else { + // read byte by byte...? + + Vector bytes = new Vector(); + Byte byteObj; + int next; + while ((next = is.read()) > -1) { + byteObj = new Byte((byte) next); + bytes.addElement(byteObj); + } + + byte[] body = new byte[bytes.size()]; + Enumeration e = bytes.elements(); + int i = 0; + while (e.hasMoreElements()) { + byteObj = (Byte) e.nextElement(); + body[i++] = byteObj.byteValue(); + } + + return body; + } + } finally { + if (is != null) { + try { + is.close(); + } catch (Exception e) { + } + } + } + } + + public static void closeHttpConnection(HttpConnection conn) { + final String methodName = "7"; + if (conn != null) { + try { conn.close(); } + catch (Exception e) { } //log.error(methodName, "Unable to close HTTP connecton: " + e.getMessage(), e); } + } + } +} diff --git a/src/mobscrob/scrobbler/MD5.java b/src/mobscrob/scrobbler/MD5.java new file mode 100644 index 0000000..398f80c --- /dev/null +++ b/src/mobscrob/scrobbler/MD5.java @@ -0,0 +1,648 @@ +/** + * MD5.java + * @author NJ Pearman + * @date 7 Oct 2008 + * + * This program is distributed under the terms of the GNU General Public + * License + * Copyright 2008 NJ Pearman + * + * This file is part of MobScrob. + * + * MobScrob is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MobScrob is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MobScrob. If not, see . + */ +package mobscrob.scrobbler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; + +/** + * @author Neill + * + */ +public class MD5 { + + /** + * Class constructor + * + * @since ostermillerutils 1.00.00 + */ + public MD5() { + reset(); + } + + /** + * Gets this hash sum as an array of 16 bytes. + * + * @return Array of 16 bytes, the hash of all updated bytes. + * + * @since ostermillerutils 1.00.00 + */ + public byte[] getHash() { + if (!finalState.valid) { + finalState.copy(workingState); + long bitCount = finalState.bitCount; + // Compute the number of left over bits + int leftOver = (int) (((bitCount >>> 3)) & 0x3f); + // Compute the amount of padding to add based on number of left over bits. + int padlen = (leftOver < 56) ? (56 - leftOver) : (120 - leftOver); + // add the padding + update(finalState, padding, 0, padlen); + // add the length (computed before padding was added) + update(finalState, encode(bitCount), 0, 8); + finalState.valid = true; + } + // make a copy of the hash before returning it. + return encode(finalState.state, 16); + } + + /** + * Returns 32-character hex representation of this hash. + * + * @return String representation of this object's hash. + * + * @since ostermillerutils 1.00.00 + */ + public String getHashString() { + return toHex(this.getHash()); + } + + /** + * Gets the MD5 hash of the given byte array. + * + * @param b byte array for which an MD5 hash is desired. + * @return Array of 16 bytes, the hash of all updated bytes. + * + * @since ostermillerutils 1.00.00 + */ + public static byte[] getHash(byte[] b) { + MD5 md5 = new MD5(); + md5.update(b); + return md5.getHash(); + } + + /** + * Gets the MD5 hash of the given byte array. + * + * @param b byte array for which an MD5 hash is desired. + * @return 32-character hex representation the data's MD5 hash. + * + * @since ostermillerutils 1.00.00 + */ + public static String getHashString(byte[] b) { + MD5 md5 = new MD5(); + md5.update(b); + return md5.getHashString(); + } + + /** + * Gets the MD5 hash the data on the given InputStream. + * + * @param in byte array for which an MD5 hash is desired. + * @return Array of 16 bytes, the hash of all updated bytes. + * @throws IOException if an I/O error occurs. + * + * @since ostermillerutils 1.00.00 + */ + public static byte[] getHash(InputStream in) throws IOException { + MD5 md5 = new MD5(); + byte[] buffer = new byte[1024]; + int read; + while ((read = in.read(buffer)) != -1) { + md5.update(buffer, read); + } + return md5.getHash(); + } + + /** + * Gets the MD5 hash the data on the given InputStream. + * + * @param in byte array for which an MD5 hash is desired. + * @return 32-character hex representation the data's MD5 hash. + * @throws IOException if an I/O error occurs. + * + * @since ostermillerutils 1.00.00 + */ + public static String getHashString(InputStream in) throws IOException { + MD5 md5 = new MD5(); + byte[] buffer = new byte[1024]; + int read; + while ((read = in.read(buffer)) != -1) { + md5.update(buffer, read); + } + return md5.getHashString(); + } + + /** + * Gets the MD5 hash of the given String. + * The string is converted to bytes using the current + * platform's default character encoding. + * + * @param s String for which an MD5 hash is desired. + * @return Array of 16 bytes, the hash of all updated bytes. + * + * @since ostermillerutils 1.00.00 + */ + public static byte[] getHash(String s) { + MD5 md5 = new MD5(); + md5.update(s); + return md5.getHash(); + } + + /** + * Gets the MD5 hash of the given String. + * The string is converted to bytes using the current + * platform's default character encoding. + * + * @param s String for which an MD5 hash is desired. + * @return 32-character hex representation the data's MD5 hash. + * + * @since ostermillerutils 1.00.00 + */ + public static String getHashString(String s) { + MD5 md5 = new MD5(); + md5.update(s); + return md5.getHashString(); + } + + /** + * Gets the MD5 hash of the given String. + * + * @param s String for which an MD5 hash is desired. + * @param enc The name of a supported character encoding. + * @return Array of 16 bytes, the hash of all updated bytes. + * @throws UnsupportedEncodingException If the named encoding is not supported. + * + * @since ostermillerutils 1.00.00 + */ + public static byte[] getHash(String s, String enc) throws UnsupportedEncodingException { + MD5 md5 = new MD5(); + md5.update(s, enc); + return md5.getHash(); + } + + /** + * Gets the MD5 hash of the given String. + * + * @param s String for which an MD5 hash is desired. + * @param enc The name of a supported character encoding. + * @return 32-character hex representation the data's MD5 hash. + * @throws UnsupportedEncodingException If the named encoding is not supported. + * + * @since ostermillerutils 1.00.00 + */ + public static String getHashString(String s, String enc) throws UnsupportedEncodingException { + MD5 md5 = new MD5(); + md5.update(s, enc); + return md5.getHashString(); + } + + /** + * Reset the MD5 sum to its initial state. + * + * @since ostermillerutils 1.00.00 + */ + public void reset() { + workingState.reset(); + finalState.valid = false; + } + + /** + * Returns 32-character hex representation of this hash. + * + * @return String representation of this object's hash. + * + * @since ostermillerutils 1.00.00 + */ + public String toString() { + return getHashString(); + } + + /** + * Update this hash with the given data. + *

+ * A state may be passed into this method so that we can add padding + * and finalize a md5 hash without limiting our ability to update + * more data later. + *

+ * If length bytes are not available to be hashed, as many bytes as + * possible will be hashed. + * + * @param state Which state is updated. + * @param buffer Array of bytes to be hashed. + * @param offset Offset to buffer array. + * @param length number of bytes to hash. + * + * @since ostermillerutils 1.00.00 + */ + private void update(MD5State state, byte buffer[], int offset, int length) { + + finalState.valid = false; + + // if length goes beyond the end of the buffer, cut it short. + if ((length + offset) > buffer.length) { + length = buffer.length - offset; + } + + // compute number of bytes mod 64 + // this is what we have sitting in a buffer + // that have not been hashed yet + int index = (int) (state.bitCount >>> 3) & 0x3f; + + // add the length to the count (translate bytes to bits) + state.bitCount += length << 3; + + int partlen = 64 - index; + + int i = 0; + if (length >= partlen) { + System.arraycopy(buffer, offset, state.buffer, index, partlen); + transform(state, decode(state.buffer, 64, 0)); + for (i = partlen; (i + 63) < length; i += 64) { + transform(state, decode(buffer, 64, i)); + } + index = 0; + } + + // buffer remaining input + if (i < length) { + for (int start = i; i < length; i++) { + state.buffer[index + i - start] = buffer[i + offset]; + } + } + } + + /** + * Update this hash with the given data. + *

+ * If length bytes are not available to be hashed, as many bytes as + * possible will be hashed. + * + * @param buffer Array of bytes to be hashed. + * @param offset Offset to buffer array. + * @param length number of bytes to hash. + * + * @since ostermillerutils 1.00.00 + */ + public void update(byte buffer[], int offset, int length) { + update(workingState, buffer, offset, length); + } + + /** + * Update this hash with the given data. + *

+ * If length bytes are not available to be hashed, as many bytes as + * possible will be hashed. + * + * @param buffer Array of bytes to be hashed. + * @param length number of bytes to hash. + * + * @since ostermillerutils 1.00.00 + */ + public void update(byte buffer[], int length) { + update(buffer, 0, length); + } + + /** + * Update this hash with the given data. + * + * @param buffer Array of bytes to be hashed. + * + * @since ostermillerutils 1.00.00 + */ + public void update(byte buffer[]) { + update(buffer, 0, buffer.length); + } + + /** + * Updates this hash with a single byte. + * + * @param b byte to be hashed. + * + * @since ostermillerutils 1.00.00 + */ + public void update(byte b) { + byte buffer[] = new byte[1]; + buffer[0] = b; + update(buffer, 1); + } + + /** + * Update this hash with a String. + * The string is converted to bytes using the current + * platform's default character encoding. + * + * @param s String to be hashed. + * + * @since ostermillerutils 1.00.00 + */ + public void update(String s) { + update(s.getBytes()); + } + + /** + * Update this hash with a String. + * + * @param s String to be hashed. + * @param enc The name of a supported character encoding. + * @throws UnsupportedEncodingException If the named encoding is not supported. + * + * @since ostermillerutils 1.00.00 + */ + public void update(String s, String enc) throws UnsupportedEncodingException { + update(s.getBytes(enc)); + } + /** + * The current state from which the hash sum + * can be computed or updated. + * + * @since ostermillerutils 1.00.00 + */ + private MD5State workingState = new MD5State(); + /** + * Cached copy of the final MD5 hash sum. This is created when + * the hash is requested and it is invalidated when the hash + * is updated. + * + * @since ostermillerutils 1.00.00 + */ + private MD5State finalState = new MD5State(); + /** + * Temporary buffer cached here for performance reasons. + * + * @since ostermillerutils 1.00.00 + */ + private int[] decodeBuffer = new int[16]; + /** + * 64 bytes of padding that can be added if the length + * is not divisible by 64. + * + * @since ostermillerutils 1.00.00 + */ + private static final byte padding[] = { + (byte) 0x80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,}; + + /** + * Contains internal state of the MD5 class. + * Passes MD5 test suite as defined in RFC1321. + * + * @since ostermillerutils 1.00.00 + */ + private class MD5State { + + /** + * True if this state is valid. + * + * @since ostermillerutils 1.00.00 + */ + private boolean valid = true; + + /** + * Reset to initial state. + * + * @since ostermillerutils 1.00.00 + */ + private void reset() { + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + + bitCount = 0; + } + /** + * 128-byte state + * + * @since ostermillerutils 1.00.00 + */ + private int state[] = new int[4]; + /** + * 64-bit count of the number of bits that have been hashed. + * + * @since ostermillerutils 1.00.00 + */ + private long bitCount; + /** + * 64-byte buffer (512 bits) for storing to-be-hashed characters + * + * @since ostermillerutils 1.00.00 + */ + private byte buffer[] = new byte[64]; + + private MD5State() { + reset(); + } + + /** + * Set this state to be exactly the same as some other. + * + * @param from state to copy from. + * + * @since ostermillerutils 1.00.00 + */ + private void copy(MD5State from) { + System.arraycopy(from.buffer, 0, this.buffer, 0, this.buffer.length); + System.arraycopy(from.state, 0, this.state, 0, this.state.length); + this.valid = from.valid; + this.bitCount = from.bitCount; + } + } + + /** + * Turns array of bytes into string representing each byte as + * a two digit unsigned hex number. + * + * @param hash Array of bytes to convert to hex-string + * @return Generated hex string + * + * @since ostermillerutils 1.00.00 + */ + private static String toHex(byte hash[]) { + StringBuffer buf = new StringBuffer(hash.length * 2); + for (int i = 0; i < hash.length; i++) { + int intVal = hash[i] & 0xff; + if (intVal < 0x10) { + // append a zero before a one digit hex + // number to make it two digits. + buf.append("0"); + } + buf.append(Integer.toHexString(intVal)); + } + return buf.toString(); + } + + private static int FF(int a, int b, int c, int d, int x, int s, int ac) { + a += ((b & c) | (~b & d)); + a += x; + a += ac; + //return rotateLeft(a, s) + b; + a = (a << s) | (a >>> (32 - s)); + return a + b; + } + + private static int GG(int a, int b, int c, int d, int x, int s, int ac) { + a += ((b & d) | (c & ~d)); + a += x; + a += ac; + //return rotateLeft(a, s) + b; + a = (a << s) | (a >>> (32 - s)); + return a + b; + } + + private static int HH(int a, int b, int c, int d, int x, int s, int ac) { + a += (b ^ c ^ d); + a += x; + a += ac; + //return rotateLeft(a, s) + b; + a = (a << s) | (a >>> (32 - s)); + return a + b; + } + + private static int II(int a, int b, int c, int d, int x, int s, int ac) { + a += (c ^ (b | ~d)); + a += x; + a += ac; + //return rotateLeft(a, s) + b; + a = (a << s) | (a >>> (32 - s)); + return a + b; + } + + private static byte[] encode(long l) { + byte[] out = new byte[8]; + out[0] = (byte) (l & 0xff); + out[1] = (byte) ((l >>> 8) & 0xff); + out[2] = (byte) ((l >>> 16) & 0xff); + out[3] = (byte) ((l >>> 24) & 0xff); + out[4] = (byte) ((l >>> 32) & 0xff); + out[5] = (byte) ((l >>> 40) & 0xff); + out[6] = (byte) ((l >>> 48) & 0xff); + out[7] = (byte) ((l >>> 56) & 0xff); + return out; + } + + private static byte[] encode(int input[], int len) { + byte[] out = new byte[len]; + int i, j; + for (i = j = 0; j < len; i++, j += 4) { + out[j] = (byte) (input[i] & 0xff); + out[j + 1] = (byte) ((input[i] >>> 8) & 0xff); + out[j + 2] = (byte) ((input[i] >>> 16) & 0xff); + out[j + 3] = (byte) ((input[i] >>> 24) & 0xff); + } + return out; + } + + private int[] decode(byte buffer[], int len, int offset) { + int i, j; + for (i = j = 0; j < len; i++, j += 4) { + decodeBuffer[i] = ((buffer[j + offset] & 0xff)) + | (((buffer[j + 1 + offset] & 0xff)) << 8) + | (((buffer[j + 2 + offset] & 0xff)) << 16) + | (((buffer[j + 3 + offset] & 0xff)) << 24); + } + return decodeBuffer; + } + + private static void transform(MD5State state, int[] x) { + int a = state.state[0]; + int b = state.state[1]; + int c = state.state[2]; + int d = state.state[3]; + + /* Round 1 */ + a = FF(a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */ + d = FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */ + c = FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */ + b = FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */ + a = FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */ + d = FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */ + c = FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */ + b = FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */ + a = FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */ + d = FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */ + c = FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */ + b = FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */ + a = FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */ + d = FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */ + c = FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */ + b = FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */ + + /* Round 2 */ + a = GG(a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */ + d = GG(d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */ + c = GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */ + b = GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */ + a = GG(a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */ + d = GG(d, a, b, c, x[10], 9, 0x02441453); /* 22 */ + c = GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */ + b = GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */ + a = GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */ + d = GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */ + c = GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */ + b = GG(b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */ + a = GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */ + d = GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */ + c = GG(c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */ + b = GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + a = HH(a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */ + d = HH(d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */ + c = HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */ + b = HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */ + a = HH(a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */ + d = HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */ + c = HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */ + b = HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */ + a = HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */ + d = HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */ + c = HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */ + b = HH(b, c, d, a, x[ 6], 23, 0x04881d05); /* 44 */ + a = HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */ + d = HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */ + c = HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */ + b = HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + a = II(a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */ + d = II(d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */ + c = II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */ + b = II(b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */ + a = II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */ + d = II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */ + c = II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */ + b = II(b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */ + a = II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */ + d = II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */ + c = II(c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */ + b = II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */ + a = II(a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */ + d = II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */ + c = II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */ + b = II(b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */ + + state.state[0] += a; + state.state[1] += b; + state.state[2] += c; + state.state[3] += d; + } +} diff --git a/src/newfile b/src/newfile index f227890..2212995 100644 --- a/src/newfile +++ b/src/newfile @@ -1,2 +1,2 @@ -aNNiMON, Ну Вот юин эсприта, основной плагмэйкер... 2542902 Вот LocID -//SE сфотошопить + aNNiMOON \ No newline at end of file +визуализация смены громкости +Быстрая перемотка \ No newline at end of file diff --git a/src/res/album.png b/src/res/album.png new file mode 100644 index 0000000000000000000000000000000000000000..3442b7cdba1363f71eafcbe3c99e61841d1c59d7 GIT binary patch literal 751 zcmVY<0Ihae&fAC#WMh@yx>2zrnrD0=Y0r=lc8A_!B8hE(8- zyLWeg?`BS>)2-#^+#kDx&Fl5v-4*FJmy_1_xZ{{h#S0(qk8^(Kdw##)`JGc&x5qa+ zI;yFqZoeO#wV;7z*&__Y9LN6@A;wU>7Ctby-j?{n*Y*4 z8qILHvzE_(#)1Wq1?yk~6u}>`Lgos&tifWjbddD7MMc6io6YUmZ4iz>K)z~mj#8k) zL~KS7gvT^0UFBqubJLj1`G7dkNQ(5I$Ye5;1lR%?X`idkq*10|`uGtjF*7U&Q)@o9S%|nM`M7Y3TzTe$txcR8=L; z-LYu+dL$gW#`F9WMOIkM1=5Oa3WtKv#8k2awQZ^hkq{yDzDg)h(%BMb4#z`9 zmWMHC4Se$%er43&rN!i32p!uJ(vZeOpY+zGCiuMN)DX?nDUXMwK2j?E9dWzI2VnO_ z=I1)8kap`D9CkV#_b}gVxA#beZS3m90kmRo}#G>OH#r4;@ z?8+nb-DS31Xl-p%>XC1Y)oQ)D%N2=$FQ_FEX=fM~wK3N3_$ts#+l-Lg#$0^YTyVC3 zc}X-ZOX9~+@O!U|cXXlz=gUVC$7 zQaxypWw{RT9^n3}kO#r7S}-_x^zU#IOlewZNMX!NA8?!{90dq9Z*6Ukl*?s5I0i@b zOg7phAE#MWtE$?S%VrlLkO8-xOd)41DT>-HimTP1X7?(lC`wPMSX_p{1$f|GTwj%z zA=U#iXQjfiiZR8T)DwRokODWHR8rTc8Ds6#Q-?iU6(mV+46dyWpQO_pPmd1;;v|#a zAR8vz=(J~UP>V7H1FIFbV{++F6H<_Q>bMBf|TI5}7v=iHxGG5I8ptfSyC) zaCnrx91)MXZ*O`?FLW>i0e?S&7|4Qq@Wi?2HZ|b)571#YXJ-|2L#!zp-TjS#B+tgW z?r0Eu(cN+Qw$LrHE3*;~zY>Yq3<6HU<2zzxJJS>KIpt-lf~^>O(WdM1c?z(UXfBn+ z7MLt|P>*dVNmnHn`#X++eUJksaLp-k+kQNDFhNy(l-ctDwzoI?^0~{|V%}J}${W5S z2hS?m4C8W^d@z8Yw#Vc3XwdJ5?k4E<`Fwq5$VPkQV?7#nf&zD>`}e~_4c`;K{j+qs Z{sV(;XUf0D?Ee4&002ovPDHLkV1jR}1?K<& literal 0 HcmV?d00001 diff --git a/src/res/exit.png b/src/res/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2f8dc954fac98cb14d040cea4721073ec6633d GIT binary patch literal 548 zcmV+<0^9wGP)kZE?%V0LEwKN z;VF^u;z861F{oT6tf<`b2c&H8FMbwg#~E|Cffvj?&okfW`}~>-1paa5^ZA3ghzoWf z_}_~lF}%eb&X*IwGCGH&2;vGB#qL9Bz!_BT706ybfqqQm7Q#qk30d7+o9CFqT^#cZ zScjKb$4?A+1Wcg{!;W@Ot;`+lFdpJJKH&jsRF_n+LcpMg{21TlX3_9@XvGSCAY++1 z>Qc@O9py(bgq#+w#hINAVM{|k?#jL>Ls#8djO*P#9I(PTJ}SFw9&?+(dx^X1Y{l>4 z4<^uPg&mqZOFQNfFoG_Lc+}f;ebKaBwt^e#;T2B$?0^d6Q`d}nt@u?d=+PXEp|*^J z(BcS~b`JTS^;Sl}HfNWF-n9$VXapN-Xs4!I8$T*Z zeT7D~kU1T{D!-oV)$?+G=gR4X*o05wg92@7tMqyXa|I6TLux%QDBDeC{uQ(8^ioN` m1O>MLNE+8Q{B|_$73eQ39YC&)&6?8y0000Nkl8kdB8cAZCu3Qfk%#%6rY}2;kKLa!)?Huv%P(_3svPX_?Xel_+SWauGF~vG`k;F1 z)H%xzl;s1djCFfvNXD`>ORn-aRPs_&cD@G>l~v6vot@>ql^N^W%($Qayr@rZfTrAzgBu(@%_U2 z=x#>u9*g@onAbza+tHoS2ajA`{jHca7XDrpXuch@{3c)=Da&viHp;u6k|!Yl=2Nd1 z*Ii{9;GL)T-H-z(puBFM^;Q4!!<(j&A$OH^=k9y^{{C0?=!Z?8E2}T2%aH%0?}j&1 zz3PST`FF!ll+|DV3UcW3H&BF!hFmHO+nuOwGyRK5E1j1ZBmuC$h=)lx_=jMy)Fy*} zfWa?VFd_U{o>#1x5PmFGWlab_lvia<2tSmnvL=Kd>QI$6A^cFP%9;>^YsQ4|!w^1WLik|_f2gbp;g2Ewt+FPB{}jSsDQiObdl3FsSrfv4 z3gNGmH6i>x2;VDfLijHrykSE4;e0aqhZua&WAH#c2%n=KgGan$@XCRY!H0wJIqEU^ zh!8#pJ_a8S!sn>R;3Go#9QYV~I0&Dk9)phv;d9_)@ZlhQj(Q9}B81Pt5|Y3J@gRH# z){q1qhzH>hlof-(1MwjIwX(txcpx5xzfe{r0uRK4@Yl);L*RjU5dK10kqA5x55k|7 z6^y_G@gTebe?t;@#QTRKGSVrClq89yNEby(qSHmWv$nXmOmrtnr?XzTJ4tVst<)~$ zEbgSclU~Z+TD*uX?p~av7cX?W)4g0wQruPRT1|1UOW0>4+az@aT`u3()mq5Sj=EM! z)sSj@BqWd^L4giYE|8)?8YRlSwhAPiMu0RDE>O@GRRtrh z2-=#u4X)AT+MYbxL#o``MX5!o4s?iMfz(<_lOTc)N^G4WhdbmDss#{D1Sz)8AVF6% zOOQl2ZN+M+2vvUw87Z|8C7DSi0Ej?>8Nj;rvJ+*=AXyR!Ga#C!7Sc%hx}3_uTpCFFUm(T9yH?fvnAGh6Jbp36_zHBv?WMB&$oPf$s#k!5rz- z)>Ib_lhB@MW(K$V70L`JDgh3t^_M{j5{#J2n#!8Wn#!8Wn#!8Wn#y`WS^ogQsMr{G SvT(lu0000j zTD25MDNZe`xkQ)Ryyl$S-RF3r$W=B9o0F>$*z|wq`F~{7=x%;TEyRFgl2QhI`VD z)bxmQb7r7Fe{O_SDh?D+WmD9WdY-oE)w4oVYUB6eC|Q@=2|PQj;p^joZTL`L3};`- zYbp#@N)wg6JP>57-Ar9+Ja%YCFnERZVM_a-r@&s`tFvJ)x69&jgv>T0**z@12D*Xq zFI~N(U7VxJc2SIqR5twuy-=IDaw=LEve-@NjlBMZub#2~)BqUDVso+#zi(s>eMif; zFM&0-8`_Z*j^kxuuvL)U!_wj(w-bY0_z{t z_x{xSqlsSV#hSwhJ+&loG)nk-99X)Bq>}TG5|_a_9IeV?Gf~xTg?o5g(x@TgM8btr zrIAjf(mB{#0eh55*TY|!)8#<4S^wF@G71c?#2^t5jmciOKyRFo z@$$#v_qh$7cj7srL~=D1LnRKEUCda1<}p@U4q$>DLZ0s61~|s@Q{VD|?YD774=;aF z$)f9JQQnyiBsr}+9HS3 zE^d@PK)3`P45mt}L=*HF2lkYK-I=y#6%Pze_MhL-aZfm=S9voabVGf2n{Q+ZJh#l^ zi$N{&XUOJYkq$=(sY5R-)e3KYZ!}%n=o{(h@3MD{g|6Y{YU!<;7~Hz)-12$chWJBW zGBiBiX|)&HM|}F~eMbhQ`Bs~m931a^5qf$t2feSwhh%jE3_KM%CDMEKl6tjEAH)8))VK~W582CRA z#{Fhd;ao3aLT*&#uGHYQb3U2jCj$evr39^j`7clJFIT77`!d}0_5c6?07*qoM6N<$ Ef`;b6Jpcdz literal 0 HcmV?d00001 diff --git a/src/res/sb.png b/src/res/sb.png new file mode 100644 index 0000000000000000000000000000000000000000..195c71e230dc2215004432b4f2e82ac772f71ff1 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrI!3HGv^*w(Nq_jO<978H@CI9&K`Ez~S`TzI+ zrO)`O7R~Q+qp?FkAdo}d>48ug&-VQLzxWvf{>$3Wo97=7)W+cH>gTe~DWM4f^F<;% literal 0 HcmV?d00001 diff --git a/src/res/sbl.png b/src/res/sbl.png new file mode 100644 index 0000000000000000000000000000000000000000..8e50f2b5035f916ee323f30d479d13821a8ffac5 GIT binary patch literal 231 zcmVMb#A hPhCH<>Gthg{{iLCk7`lSUp)W-002ovPDHLkV1fquZ|nd7 literal 0 HcmV?d00001 diff --git a/src/res/star.png b/src/res/star.png new file mode 100644 index 0000000000000000000000000000000000000000..4269fd3a48b1093d531036a4696d417c03f73dc5 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^!XP#W8<6zw2~`JD4W2HJAr-fhIp$?3NLU@U;BPrA z{Zmp>gK_@8`ih_b|Noz_Fvs$K^z_6F3@Ou7&wMPC4AI-oUmW?%CqFSJ>By_4i%##W z{qaej>(a97>HsY_>FG=T4sJ1QbuqlPLnl>8Oj^Ki;3h$9z*!3XE jW18Nf<$62s&lY5`+$-i`!7h0i=oSV~S3j3^P6>CyTN3?ygnE=eV-ApS-(&>ps`@i{<{6 hhC8{$Bs{BT+&j_7effo_MKE4ph zr86R>)c2gy_qyN~HlKZ^wSG{F85=8L53HM}IlKY?+H5&aMB5zz0000M5reF#}XqF_Zs*VJFKSX*TA3=vA(C~#)Z@1eG zY&|h7h@vPNI9o!9q)>z*RcV@r5sxPl>1cE`s_S|<9FCCfQK?i~-`Uyui1oP~C`uyG zL@sMBSy^k*G|VY29MPc$(THfTmECcq|rMK`^5mNQhq0VU>{uLAs(~6bJ>q_kI5l{5xi&Xz)V7PwnaeS?|1GsKSV|-j10A#%$=FeEYN0J3kF||B@+*sd#z6OY$-WV z1n(sW;{{FA=E3?D6O-VKfS5@Yjh~yJTgha`7ofY(B(4p@!fR2prf$5Ootb%qNAnoE zbnk{xDZR_d`Ptc5>CE_R=q4F5_f%Z@p6~W}7LihYvbePL7VDRgI49}d7!WG4v}I9{ z6bDimV%4_oL(I)iW05tS&*yVk-y`-jJnBNrbK5mgq6)%ZIF4O~&gLW}XOP`;xx5FP z`t=KNoaR-ZQ7`M^>B-4Y5cD^AbzUeGK0SZ>EEtN6PLYpYukUYe6*pS#);6|{PS23l zJ}4jjny{=wax6s^(KD$XA0KZOziw~fyhNGnb=zM5u(1y$8FGaF2(s6CW?de3deeaM z_d?-wKnrOTP6M8xXl^uf!D6qcdUJgsCu=LmX8CM5l@ByO+? hV~5N4$S`n+@gIH%It*3efSUjS002ovPDHLkV1koxd3gW; literal 0 HcmV?d00001 diff --git a/src/res/zero.png b/src/res/zero.png new file mode 100644 index 0000000000000000000000000000000000000000..39bbcf2455e96b43726e2310dee42b23cd5e641f GIT binary patch literal 504 zcmV72|P_QV(Z{ES4)@4Vh^ezQr5WW1^w0;m?aeVqj7#oB^@*uILM<@3#0pg`lwF?jR zcUG@Tim|8{Vq{2~i3n3zxZ(?6WI1#;C``+i0mC$Q3iZPD`>${B3m4KdOmpXk_|4x3 zOs9u|=@JbuIS5RjAo|c0FunZn^obxb5Fbth@uGv1x+|9^#h8@?!!&U+FigJ^PN&4k z|M>O&f5`%1n8x%0!}JT4(&?}7AM@wXDopiqc-XS02l>p~-PgYKz_k8F`+#W=NH5+u zr5A)jd}JCV2UEA~!1Re=@%>YJ7wnnPS-v1K%D4a+rty8QLLa`8m-jK!DKJcn=ENv7 zM0VQqzyI