Commit feababba authored by mistermad's avatar mistermad

- Added deployment from the APK and basic files to test the functionality of LIG-Aikuma

- Verification of the validity of text files of the opening in eliciting mode
- Better working video and image files in eliciting mode
- Minor bug fix when importing a profile in respeking mode (not importing the "note" field)
parent 5f0d9e6e
Yes. |Of course. ## Oui. |Naturellement.
Thank you. ## Merci.
Excuse me. ## Excusez- moi.
Takeout, please. ## À emporter, svp.
Can I have something to eat? ## Est-ce que je peux avoir quelque chose à manger ?
What kind of drinks do you have? ## Quel genre de boissons as-tu ?
Excuse me. ## Excusez- moi.
Takeout, please. ## À emporter, svp.
Can I have something to eat? ## Est-ce que je peux avoir quelque chose à manger ?
What kind of drinks do you have? ## Quel genre de boissons as-tu ?
Are you eating here or taking out? ## Est-ce que tu manges ici ou sors ?
Eating here. ## Manger ici.
Taking out. ## Sortie.
I'll have a cheeseburger, a small French fry and a medium coke, please. ## J'aurai un cheeseburger, un petit French.fry et un coke moyen, svp.
One sandwich and one orange juice, please. ## Un sandwich et un jus d'orange, svp.
I'll have this and this. ## J'aurai ceci et ceci.
Do you have ketchup? ## Prends-tu le ketchup ?
I ordered a French fry. ## J'ai commandé un French.fry.
Is this the large size? ## Est-ce que c'est la grande taille ?
I'd like to have another cup. ## Je voudrais avoir une autre tasse.
Can you tell me where the nearest cafeteria is? ## Peus-tu me dire où le cafétéria le plus proche est ?
How would you like your eggs? ## Comment tu aiment vos oeufs ?
Scrambled eggs with bacon, please. ## Oeufs brouillés avec le lard, svp.
Soft-boiled eggs, please. ## oeufs Doux-bouillis, svp.
Some more coffee? ## Encore plus de café ?
Yes, please. ## Oui, svp.
No, thank you. ## Non, merci.
Next please. ## Veuillez après.
Two hot dogs and one coke, please. ## Deux hot-dogs et un coke, svp.
With mustard and ketchup? ## Avec de la moutarde et le ketchup ?
Just ketchup, please. ## Ketchup juste, svp.
Both, please. ## Tous les deux, svp.
Easy on the mustard, please. ## Facile sur la moutarde, svp.
With mustard, ketchup, or relish? ## Avec de la moutarde, le ketchup, ou le goût ?
No, thanks, I like it plain. ## Non, merci, je l'aime plat.
With mustard, onions, hold the ketchup, please. ## Avec de la moutarde, les oignons, tiennent le ketchup, svp.
What do you want on it? ## Que veus-tu là-dessus ?
Do you want large or small? ## Veus-tu grand ou petit ?
A large one, please. ## Grand , svp.
A hamburger and a milk shake, please. ## Un hamburger et un lait de poule , svp.
Do you want tomato and cheese on your hamburger? ## Veus-tu la tomate et le fromage sur votre hamburger ?
Just tomato, please. ## Tomate juste, svp.
Eat-in or take-out? ## Manger-dans ou à emporter ?
Take-out, please. ## À emporter, svp.
I'll eat here. ## Je mangerai ici.
Here or to go? ## Ici ou pour aller ?
To go. ## Pour aller.
Anything else? ## Toute autre chose ?
No, thanks. ## Non, merci.
Do you want to warm it up? ## Veus-tu le chauffer ?
Yes, please. ## Oui, svp.
How do you use this vending machine? ## Comment utilises-tu ce distributeur automatique automatique ?
I put money in but nothing came out. ## J'ai mis l'argent dans mais rien n'a sorti.
Good morning. |How are you, sir? ## Bonjour. |Comment vais tu, monsieur ?
Fine, thank you. ## Très bien, merci.
Here's a menu, sir. ## Voici une carte, monsieur.
Thank you. ## Merci.
I will have American breakfast. ## Je prendrai le petit déjeuner américain.
What kind of juice would you like to have? ## Quel genre de jus aimes-tu avoir ?
Do you have pineapple juice? ## Prends-tu le jus d'ananas ?
Sorry, we don't have, today. ## Désolés, nous n'avons pas, aujourd'hui.
All right. |Then give me grapefruit juice, please. ## Bien. |Donnez- alors moi le jus de pamplemousse, svp.
Yes, and? ## Oui, et ?
Toast, cheese omelet with buttered toast, two fried eggs, over easy with ham and coffee, please. ## Le pain grillé, omelette de fromage avec du pain grillé beurré, deux a fait frire des oeufs, excédent facile avec du jambon et café, svp.
Shall I bring coffee now? ## Est-ce que je dois apporter le café maintenant ?
Yes, please. ## Oui, svp.
Here is a menu, sir. ## Voici une carte, monsieur.
Thank you. |I'm in a hurry. |What can you serve quickly? ## Merci. |Je suis pressé. |Ce qui peut tu servir rapidement ?
Let me see. |Yes, today's special lunch would be served quickly. ## Laissez- moi voir. |Oui, le déjeuner spécial d'aujourd'hui serait servi rapidement.
What is the today's special? ## Quel est le spécial d'aujourd'hui ?
A bowl of cream soup, fried prawn with lemon, butter, parsley potatoes, green salad, rolls, and coffee or tea. ## Un bol de potage crème, de crevette rose frite avec le citron, de beurre, de pommes de terre persillées , de salade verte, de roulements, et de café ou de thé.
Okay, I'll take it. ## Ok, je le prendrai.
Yes, sir. ## Oui, monsieur.
No, thank you. |And check, please. ## Non, merci. |Et contrôle, svp.
Certainly, sir. ## Certainement, monsieur.
Where should I pay? ## Où devrais-je payer ?
Please pay at the cashier over there. ## Svp salaire au caissier là-bas.
I see. |Thank you very much. ## Je vois. |Merci beaucoup.
One coffee and one hamburger, please. ## Un café et un hamburger, svp.
Yes, please. |What kinds of ice cream do you have? ## Oui, svp. |Quels genres de crême glacée tu ont ?
Vanilla, chocolate and strawberry. ## Vanille, chocolat et fraise.
May I help you? ## Est-ce que je peux t'aider ?
Give me coffee and apple pie, please. ## Donnez- moi le pâté en croûte de café et de pomme, svp.
Black or white? ## Noir ou blanc ?
Black, please. ## Noir, svp.
Mustard? ## Moutarde ?
No, ketchup, please. ## Non, ketchup, svp.
How do you like it? ## Comment tu l'aiment ?
Wonderful. ## Merveilleux.
One hamburger and one orange shake, please. ## Un hamburger et une secousse orange, svp.
Right. |Here you are. ## Droite. |Ici tu es.
Oh, this is America. ## Ah, ceci est l'Amérique.
You like America? |Very good. ## Tu aimes l'Amérique ? |Très bon.
What's New Orleans nectar? ## Quel est nectar de la Nouvelle-Orléans ?
Oh, it's an ice cream soda. ## Ah, c'est une soude de crême glacée.
Please give me that one. |What do you call that? ## Veuillez me donner celui-là. |Ce qui tu appellent cela ?
That's a banana split. ## C'est un banana split.
Do you have banana ice cream? ## As-tu la crême glacée de banane ?
Sure. |You want one? ## Sûr. |Tu veus un ?
Yes, please. |How much is it? ## Oui, svp. |Combien coûte lui ?
package org.getalp.ligaikuma.lig_aikuma;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import org.getalp.ligaikuma.lig_aikuma.lig_aikuma.BuildConfig;
import org.getalp.ligaikuma.lig_aikuma.lig_aikuma.R;
import org.getalp.ligaikuma.lig_aikuma.model.Language;
import org.getalp.ligaikuma.lig_aikuma.model.RecordingLig;
import org.getalp.ligaikuma.lig_aikuma.ui.CheckMode;
import org.getalp.ligaikuma.lig_aikuma.ui.CheckTranscription;
import org.getalp.ligaikuma.lig_aikuma.ui.CheckWordVariant;
import org.getalp.ligaikuma.lig_aikuma.ui.ElicitationMode;
import org.getalp.ligaikuma.lig_aikuma.ui.RecordElicitation;
import org.getalp.ligaikuma.lig_aikuma.ui.RecordingMetadataLig;
import org.getalp.ligaikuma.lig_aikuma.ui.RespeakingSelection;
import org.getalp.ligaikuma.lig_aikuma.ui.ShareFileActivity;
import org.getalp.ligaikuma.lig_aikuma.ui.ThumbRespeakActivityLig;
import org.getalp.ligaikuma.lig_aikuma.ui.sensors.LocationDetector;
import org.getalp.ligaikuma.lig_aikuma.util.AikumaSettings;
import org.getalp.ligaikuma.lig_aikuma.util.FileIO;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
......@@ -37,16 +12,39 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.semantive.waveformandroid.waveform.MediaPlayerFactory;
import org.getalp.ligaikuma.lig_aikuma.lig_aikuma.BuildConfig;
import org.getalp.ligaikuma.lig_aikuma.lig_aikuma.R;
import org.getalp.ligaikuma.lig_aikuma.model.Language;
import org.getalp.ligaikuma.lig_aikuma.model.RecordingLig;
import org.getalp.ligaikuma.lig_aikuma.ui.CheckMode;
import org.getalp.ligaikuma.lig_aikuma.ui.CheckTranscription;
import org.getalp.ligaikuma.lig_aikuma.ui.CheckWordVariant;
import org.getalp.ligaikuma.lig_aikuma.ui.ElicitationMode;
import org.getalp.ligaikuma.lig_aikuma.ui.RecordElicitation;
import org.getalp.ligaikuma.lig_aikuma.ui.RecordingMetadataLig;
import org.getalp.ligaikuma.lig_aikuma.ui.RespeakingSelection;
import org.getalp.ligaikuma.lig_aikuma.ui.ShareFileActivity;
import org.getalp.ligaikuma.lig_aikuma.ui.ThumbRespeakActivityLig;
import org.getalp.ligaikuma.lig_aikuma.ui.sensors.LocationDetector;
import org.getalp.ligaikuma.lig_aikuma.util.AikumaSettings;
import org.getalp.ligaikuma.lig_aikuma.util.FileIO;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
public class ModeSelection extends Activity implements OnClickListener{
private static final String TAG = "ModeSelection";
......@@ -69,17 +67,12 @@ public class ModeSelection extends Activity implements OnClickListener{
if(BuildConfig.DEBUG)Log.i(TAG, AikumaSettings.getCurrentUserId());
}
// DEBUG
if(BuildConfig.DEBUG) {
Map<String, ?> mapPrefs = settings.getAll();
for(String key : mapPrefs.keySet())
Log.i(TAG, "DEBUG - Shared Preferences - " + key + " -> " + mapPrefs.get(key));
}
// hides the action bar instead of removing it
// getActionBar().hide();
Aikuma.loadLanguages(this.getApplicationContext());
findViewById(R.id.button_mode_record).setOnClickListener(this);
......@@ -94,6 +87,13 @@ public class ModeSelection extends Activity implements OnClickListener{
// check the existing session and show popup to propose retrieving it
prefsUserSession = getSharedPreferences("userSession", MODE_PRIVATE);
ed = prefsUserSession.edit();
File f = new File(FileIO.getAppRootPath()+"/example");
if(!f.exists())
{
f.mkdir();
FileIO.copyFilesFromAssets(this);
}
}
@Override
......
......@@ -66,23 +66,15 @@ public class TranscriptPlayer extends MarkedPlayer
setNotificationMarkerPosition(segment);
}
// Update the UI such that the transcript reflects the current sample.
// Never use
/*private void updateTranscriptUi(long sample) {
Segment segment = transcript.getSegmentOfSample(sample);
updateTranscriptUi(segment);
}*/
// Update the UI such that the transcript reflects the current segment.
private void updateTranscriptUi(Segment segment) {
TextView transcriptView = (TextView) activity.findViewById(R.id.transcriptView);
TextView transcriptView2 = (TextView) activity.findViewById(R.id.transcriptView2);
if (segment != null) {
transcriptView.setText(transcript.getTranscriptPair(segment).transcript);
transcriptView2.setText(transcript.getTranscriptPair(segment).translation);
((TextView) activity.findViewById(R.id.transcriptView)).setText(transcript.getTranscriptPair(segment).transcript);
((TextView) activity.findViewById(R.id.transcriptView2)).setText(transcript.getTranscriptPair(segment).translation);
}
else
transcriptView.setText("");
((TextView) activity.findViewById(R.id.transcriptView)).setText("");
}
@Override
......@@ -96,15 +88,4 @@ public class TranscriptPlayer extends MarkedPlayer
//private static Segment segment;
private TempTranscript transcript;
private Activity activity;
/*
/**
* Listener to adjust the transcript view when a transcript marker gets reached.
private class TranscriptMarkerReachedListener
extends MarkedPlayer.OnMarkerReachedListener {
public void onMarkerReached(MarkedPlayer p) {
transcriptView.setText("different");
}
}
*/
}
......@@ -18,7 +18,6 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.UUID;
import static org.getalp.ligaikuma.lig_aikuma.model.RecordingLig.MAP_EXT;
......@@ -175,22 +174,19 @@ public class Mapper {
*/
public void remap(int[] index)
{
Log.d(TAG, "Start remap: "+Arrays.toString(index));
Log.d(TAG, "Destination: "+new File(FileIO.getNoSyncPath(),"tmp_no_speak"+MAP_EXT).toString());
if(index.length==0) return;
String bufferWrite="";
Arrays.sort(index);
try {
// Read original map file and remap it on buffer
String[] v = FileIO.read(mappingFile).split("\n");
for(int i=0,j=0;i<v.length;i++)
if(i==index[j])
{
bufferWrite+=v[i]+"\n";
for(int i=0,j=0;i<v.length&&j<index.length;i++) {
if (i == index[j]) {
bufferWrite += v[i] + "\n";
j++;
}
// Write buffer on new map file
Log.d(TAG, "Buffer:\n"+bufferWrite);
FileIO.write(new File(FileIO.getNoSyncPath(),"tmp_no_speak"+MAP_EXT), bufferWrite);
}
FileIO.write(new File(FileIO.getNoSyncPath(),"tmp_no_speech"+MAP_EXT), bufferWrite);
} catch (IOException ignored) {}
}
}
......@@ -218,6 +218,10 @@ public class ThumbRespeaker {
public int[] getRemap() {return _remapIndex;}
public void setDestRecFullPath(String p){_dest_rec_full_path=p;}
public String getDestRecFullPath(){return _dest_rec_full_path;}
/** Player to play the original with. */
private SimplePlayer player;
......@@ -239,6 +243,8 @@ public class ThumbRespeaker {
/** The amount to rewind the original in msec
* after each respeaking-segment. */
private int rewindAmount;
private String _dest_rec_full_path;
private static ThumbRespeaker ref;
}
......@@ -114,7 +114,7 @@ public class ThresholdSpeechAnalyzer extends Analyzer {
* to speech in this Analyzer?
* @param recognizer A silence/audio recognizer.
*/
public ThresholdSpeechAnalyzer(int silenceTriggerAmount, int speechTriggerAmount, Recognizer recognizer) {
public ThresholdSpeechAnalyzer(int silenceTriggerAmount, int speechTriggerAmount, Recognizer recognizer) {
this.silenceTriggerAmount = silenceTriggerAmount;
this.speechTriggerAmount = speechTriggerAmount;
......@@ -188,8 +188,7 @@ public class ThresholdSpeechAnalyzer extends Analyzer {
// Add the copied current buffer onto the end.
//
for(int i = 0; i < buffer.length; i++)
afterBuffer[i + offset] = copiedBuffer[i];
System.arraycopy(copiedBuffer, 0, afterBuffer, offset, buffer.length);
}
//TODO Duplicate method. See addToAfterBuffer.
......@@ -211,8 +210,7 @@ public class ThresholdSpeechAnalyzer extends Analyzer {
// Add the copied current buffer onto the end.
//
for(int i = 0; i < buffer.length; i++)
onsetBuffer[i + offset] = copiedBuffer[i];
System.arraycopy(copiedBuffer, 0, onsetBuffer, offset, buffer.length);
}
/** Clear the before speech buffer. */
......@@ -265,12 +263,10 @@ public class ThresholdSpeechAnalyzer extends Analyzer {
// Clear onset buffer.
clearOnsetBuffer();
} else { // Still in silence mode.
// Remember n "silent" buffers to add before speech, always.
//
if(onsetBuffer.length < (buffer.length * ONSET_BUFFERS)) addToOnsetBuffer(buffer);
else shiftOnsetBufferWith(buffer);
}
} else if(onsetBuffer.length < (buffer.length * ONSET_BUFFERS))
addToOnsetBuffer(buffer);
else
shiftOnsetBufferWith(buffer);
}
}
......
......@@ -65,8 +65,7 @@ public class Server extends NanoHTTPD {
@Override
public Response run(IHTTPSession session) {
Map<String,String> headers = session.getHeaders();
int offset = 0;
int len = 0;
int offset = 0, len = 0;
String v = headers.get("range");
if (v != null) {
if(BuildConfig.DEBUG)android.util.Log.d("aa", v);
......@@ -75,8 +74,7 @@ public class Server extends NanoHTTPD {
if (m.matches()) {
offset = Integer.parseInt(m.group(1));
if (!m.group(2).trim().equals("")) {
int i = Integer.parseInt(m.group(2));
len = i - offset + 1;
len = Integer.parseInt(m.group(2)) - offset + 1;
}
}
if(BuildConfig.DEBUG)android.util.Log.d("aa", ".." + offset + ".." + len);
......@@ -85,40 +83,28 @@ public class Server extends NanoHTTPD {
}
}).add(new Proc() {
// serve recordings by uuid
@Override
public Response run(IHTTPSession session) {
@Override public Response run(IHTTPSession session) {
return serveMapFile(session.getUri());
}
}).add(new Proc() {
@Override
public Response run(IHTTPSession session) {
}}).add(new Proc() {
@Override public Response run(IHTTPSession session) {
return serveShapeFile(session.getUri());
}
}).add(new Proc() {
}}).add(new Proc() {
// serve recordings by uuid
@Override
public Response run(IHTTPSession session) {
@Override public Response run(IHTTPSession session) {
return serveSpeakerImage(session.getUri());
}
}).add(new Proc() {
}}).add(new Proc() {
// serve recordings by uuid
@Override
public Response run(IHTTPSession session) {
@Override public Response run(IHTTPSession session) {
return serveSpeakerSmallImage(session.getUri());
}
}).add(new Proc() {
}}).add(new Proc() {
// create, save and load transcripts
@Override
public Response run(IHTTPSession session) {
return serveTranscript(session);
}
@Override public Response run(IHTTPSession session) {
return serveTranscript(session);}
}).add(new Proc() {
// serve static assets
@Override
public Response run(IHTTPSession session) {
@Override public Response run(IHTTPSession session) {
return serveAsset(session.getUri());
}
});
}});
}
/**
......@@ -170,10 +156,9 @@ public class Server extends NanoHTTPD {
* Destroy the Server singleton object.
*/
public static void destroyServer() {
if (server_ != null) {
server_.stop();
server_ = null;
}
if(server_ == null) return;
server_.stop();
server_ = null;
}
/**
......@@ -196,9 +181,8 @@ public class Server extends NanoHTTPD {
InetAddress addr = addrs.nextElement();
if (!addr.isLoopbackAddress()) {
String ip = addr.getHostAddress();
if (InetAddressUtils.isIPv4Address(ip)) {
if (InetAddressUtils.isIPv4Address(ip))
ips.put(ff.getName(), ip);
}
}
}
}
......@@ -257,10 +241,10 @@ public class Server extends NanoHTTPD {
String a[] = path.split("/");
if (a.length == 2 && a[1].equals("index.json")) {
JSONObject originals = new JSONObject();
JSONObject commentaries = new JSONObject();
JSONObject speakers = new JSONObject();
JSONObject transcripts = new JSONObject();
JSONObject originals = new JSONObject(),
commentaries = new JSONObject(),
speakers = new JSONObject(),
transcripts = new JSONObject();
for (Recording r: Recording.readAll()) {
if (r.isOriginal())
originals.put(r.getId().toString(), r.encode());
......@@ -294,48 +278,39 @@ public class Server extends NanoHTTPD {
try {
File f = Recording.read(a[2], a[3], a[4]).getFile();
if (f == null) {
return mkNotFoundResponse(path);
}
if(f == null) return mkNotFoundResponse(path);
RandomAccessFile rf = new RandomAccessFile(f, "r");
int n = (int) rf.length();
if (len == 0) {
len = n - offset;
}
if (n < offset + len || offset < 0) {
if(len == 0) len = n - offset;
if(n < offset + len || offset < 0) {
rf.close();
return new Response(Status.RANGE_NOT_SATISFIABLE, "text/plain", "invalid range");
}
if (len > 2 * 1024 * 1024) {
if(len > 2 * 1024 * 1024)
len = 2 * 1024 * 1024;
}
byte[] buffer = new byte[2 * 1024 * 1024];
rf.read(buffer, offset, len);
rf.close();
InputStream is = new ByteArrayInputStream(buffer, 0, len);
Response r = new Response(Status.PARTIAL_CONTENT, "audio/wave", is);
Response r = new Response(Status.PARTIAL_CONTENT, "audio/wave", new ByteArrayInputStream(buffer, 0, len));
r.addHeader("content-range", "bytes " + offset + "-" + (offset+len-1) + "/" + len);
return r;
}
catch (IOException e) {
return mkNotFoundResponse(path);
}
}
private Response serveMapFile(String path) {
// GET /recording/versionName/owner_id/filename/mapfile
String[] a = path.split("/");
if (a.length != 6 || !a[1].equals("recording") || !a[5].equals("mapfile"))
if(a.length != 6 || !a[1].equals("recording") || !a[5].equals("mapfile"))
return null;
String group_id = Recording.getGroupIdFromId(a[4]);
try {
File mapfile = new File(Recording.getRecordingsPath(
FileIO.getOwnerPath(a[2], a[3])), group_id + "/" + a[4] + MAP_EXT);
InputStream is = new FileInputStream(mapfile);
return new Response(Status.OK, "text/plain", is);
return new Response(Status.OK, "text/plain", new FileInputStream(new File(Recording.getRecordingsPath(
FileIO.getOwnerPath(a[2], a[3])), group_id + "/" + a[4] + MAP_EXT)));
}
catch (FileNotFoundException e) {
return mkNotFoundResponse(path);
......@@ -345,14 +320,12 @@ public class Server extends NanoHTTPD {
private Response serveShapeFile(String path) {
// GET /recording/versionName/owner_id/filename/shapefile
String[] a = path.split("/");
if (a.length != 6 || !a[1].equals("recording") || !a[5].equals("shapefile"))
if(a.length != 6 || !a[1].equals("recording") || !a[5].equals("shapefile"))
return null;
try {
File shapefile = new File(Recording.getRecordingsPath(
FileIO.getOwnerPath(a[2], a[3])), a[4] + ".shape");
InputStream is = new FileInputStream(shapefile);
return new Response(Status.OK, "application/octet-stream", is);
return new Response(Status.OK, "application/octet-stream", new FileInputStream(new File(Recording.getRecordingsPath(
FileIO.getOwnerPath(a[2], a[3])), a[4] + ".shape")));
}
catch (FileNotFoundException e) {
return mkNotFoundResponse(path);
......@@ -366,13 +339,9 @@ public class Server extends NanoHTTPD {
return null;
try {
InputStream is = new FileInputStream(Speaker.read(a[2], a[3], a[4]).getImageFile());
return new Response(Status.OK, "image/jpeg", is);
return new Response(Status.OK, "image/jpeg", new FileInputStream(Speaker.read(a[2], a[3], a[4]).getImageFile()));
}
catch (IOException e) {
return mkNotFoundResponse(path);
}
catch (IllegalArgumentException e) {
catch (IOException | IllegalArgumentException e) {
return mkNotFoundResponse(path);
}
}
......@@ -387,10 +356,7 @@ public class Server extends NanoHTTPD {
InputStream is = new FileInputStream(Speaker.read(a[2], a[3], a[4]).getSmallImageFile());
return new Response(Status.OK, "image/jpeg", is);
}
catch (IOException e) {