Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

250
LINES

< > BotCompany Repo | #1004590 // Image Server [LIVE at botcompany.de/images]

JavaX source code (desktop) [tags: butter use-pretranspiled] - run with: x30.jar - homepage

Download Jar. Libraryless. Click here for Pure Java version (28096L/180K).

1  
!7
2  
3  
static int id = 1100000;
4  
5  
concept ImageMeta {
6  
  int imageID;
7  
  bool pornFlag; // TODO: set
8  
  S name;
9  
  S md5; // md5 of RGBImage
10  
  S format = "png";
11  
  
12  
  *() {}
13  
  *(int *imageID, S *name) { _doneLoading(); change(); }
14  
  
15  
  void _doneLoading() {
16  
    //print("_doneLoading " + imageID);
17  
    metaMap.put(imageID, this);
18  
  }
19  
  
20  
  S mimeType() {
21  
    ret "image/" + or2(format, "png");
22  
  }
23  
}
24  
25  
static Map<Int, ImageMeta> metaMap = synchroMap();
26  
27  
p {
28  
  load("id");
29  
  db();
30  
  indexConceptFieldIC(ImageMeta, 'name);
31  
  indexConceptField(ImageMeta, 'imageID);
32  
  for (ImageMeta meta)
33  
    setMD5(meta);
34  
}
35  
36  
svoid setMD5(ImageMeta meta) {
37  
  if (nempty(meta.md5)) ret;
38  
  S md5 = "error";
39  
  pcall {
40  
    md5 = md5OfRGBImage(new RGBImage(loadPNG(imageFile(meta.imageID))));
41  
  }
42  
  cset(meta, +md5);
43  
}
44  
45  
static File imagesDir() {
46  
  ret prepareProgramDir("images");
47  
}
48  
49  
synchronized html {
50  
  print("image server uri: " + uri + ", https: " + subBot_isHttps());
51  
  uri = dropPrefix("/", uri);
52  
  new Matches m;
53  
  
54  
  if (eq(uri, "setp0rn")) {
55  
    setPornFlag(parseInt(params.get("id")), true);
56  
    ret "OK";
57  
  }
58  
59  
  if (eq(uri, "unp0rn")) {
60  
    setPornFlag(parseInt(params.get("id")), false);
61  
    ret "OK";
62  
  }
63  
64  
  bool p0rnOK = false;
65  
  
66  
  // TODO: should use uri2?
67  
  if (uri.endsWith("p") && isInteger(dropLast(uri))) {
68  
    p0rnOK = true;
69  
    uri = dropLast(uri);
70  
  }
71  
  
72  
  S uri2 = dropAfterSlash(uri);
73  
  
74  
  if (eq(uri, "random-id")) ret random(list(ImageMeta)).imageID;
75  
  if (eq(uri, "highest-id")) ret id-1;
76  
  
77  
  if (uri.startsWith("title/")) {
78  
    int id = parseFirstInt(uri);
79  
    ImageMeta meta = findConcept(ImageMeta, imageID := id);
80  
    ret meta == null ? "" : meta.name;
81  
  }
82  
  
83  
  if (isInteger(uri2)) {
84  
    // serve image
85  
    
86  
    int id = parseInt(uri2);
87  
    File file = imageFile(id);
88  
    ImageMeta meta = findConcept(ImageMeta, imageID := id);
89  
    if (meta == null)
90  
      ret subBot_serve404("Not found");
91  
    if (!p0rnOK && isPornFlag(id))
92  
      ret subBot_serve404("n0 p0rn");
93  
    ret call(getMainBot(), "serveFile_maxCache", imageFile(meta.imageID), meta.mimeType());
94  
  }
95  
  
96  
  if (uri.startsWith("md5/")) {
97  
    uri = dropPrefix("md5/", uri);
98  
    bool jpg = uri.startsWith("jpg/");
99  
    if (jpg) uri = dropPrefix("jpg/", uri);
100  
    ImageMeta meta = findConcept(ImageMeta, md5 := uri);
101  
    if (meta == null)
102  
      ret "Not found";
103  
    if (jpg && neq(meta.format, "jpeg"))
104  
      ret call(getMainBot(), "serveByteArray_maxCache", toJPEG(imageFile(meta.imageID)), "image/jpeg");
105  
    ret call(getMainBot(), "serveFile_maxCache", imageFile(meta.imageID), meta.mimeType());
106  
  }
107  
  
108  
  if (uri.startsWith("checkmd5/")) {
109  
    uri = dropPrefix("checkmd5/", uri);
110  
    ImageMeta meta = findConcept(ImageMeta, md5 := uri);
111  
    ret meta == null ? "Not found" : str(meta.imageID);
112  
  }
113  
  
114  
  if (eq(uri, "upload") || swic(uri, "upload/")) {
115  
    print("upload called.");
116  
    pnlStruct(params);
117  
    S name = params.get("name");
118  
    
119  
    SS files = getUploadFiles();
120  
    print("got files: " + l(files));
121  
    int id;
122  
    S data = params.get("data");
123  
    if (data != null) {
124  
      print("got data: " + l(data));
125  
      id = newImageID();
126  
      saveBinaryFile(imageFile(id), hexToBytes(data));
127  
    } else {
128  
      String tmpfile = files.get("thefile");
129  
      String originalName = params.get("thefile");
130  
      name = or2(name, originalName);
131  
      assertNotNull(tmpfile);
132  
      File tmp = new File(tmpfile);
133  
      long l = tmp.length();
134  
      if (l == 0) ret "Empty file, exiting";
135  
      id = newImageID();
136  
      copyFile(tmp, imageFile(id));
137  
    }
138  
    ImageMeta meta = cregister ImageMeta(id, unnull(name));
139  
    byte[] bytes = loadBeginningOfBinaryFile(imageFile(id), 16);
140  
    cset(meta, format := isJPEG(bytes) ? "jpeg" /* correct for mime type! */ : isPNG(bytes) ? "png" : null);
141  
    setMD5(meta);
142  
    S imageID = fsI(meta.imageID);
143  
    ret htitle(imageID)
144  
      + p(ahref(myLink_nonRaw("/"), "Home.") + " " + ahref(myLink_nonRaw("/uploadform"), "Upload more."))
145  
      + "OK (ID=" + imageID + "):<br>" + himg(imageLink(id))
146  
      + uploadForm();
147  
  }
148  
  
149  
  if (eq(uri, "uploadform"))
150  
    ret htitle("Upload")
151  
      + hmobilefix()
152  
      + uploadForm();
153  
      
154  
  if (eqic(uri, "bot/list")) {
155  
    bool withName = not0_gen(params.get('withName));
156  
    bool withDate = not0_gen(params.get('withDate));
157  
    Cl<S> names = subBot_paramsAsMultiMap().get('name);
158  
    
159  
    Cl<ImageMeta> l;
160  
    if (empty(names)) l = list(ImageMeta);
161  
    else l = (Set) concatListsAsSet(map(names, name -> conceptsWhereIC(ImageMeta, +name)));
162  
    
163  
    ret subBot_serveJSON(map(sortedByFieldDesc created(objectsWhere(l, pornFlag := false)), im -> {
164  
      new LinkedHashMap<S, O> map;
165  
      map.put(id := fsI(im.imageID));
166  
      if (withName) map.put(name := im.name);
167  
      if (withDate) map.put(uploaded := im.created);
168  
      map.put(md5 := im.md5);
169  
      ret map;
170  
    } ));
171  
  }
172  
173  
  if (eq(uri, "")) {
174  
    // list images
175  
    
176  
    L<Int> ids = collect imageID(conceptsWhere(ImageMeta, pornFlag := false));
177  
    sortListDesc(ids);
178  
    ret htitle("Image Server")
179  
      + p(ahref(pageLink("/uploadform"), "Upload."))
180  
      + p(n(ids, "N0n-p0rn image") + ":") + ul(map(ids, func(Int id) -> S {
181  
      ImageMeta meta = metaMap.get(id);
182  
      S title = or2(getString(meta, "name"), "Untitled");
183  
      S linkText = "#" + id + " - " + htmlencode(title);
184  
      S s = ahref(snippetImageURL(id), linkText);
185  
      if (meta != null)
186  
        s += " [md5: " + ahref(rawLink("md5/" + meta.md5), meta.md5) + "]";
187  
      ret s;
188  
    }));
189  
  }
190  
191  
  if (!webAuthed(params)) null;
192  
  
193  
  if (eq(uri, "setPornFlags")) {
194  
    for (ImageMeta meta)
195  
      if (isPornFlag(meta.imageID))
196  
        cset(meta, pornFlag := true);
197  
    ret "Yo";
198  
  }
199  
  
200  
  if (startsWith(uri, "delete/", m)) {
201  
    S s = m.rest();
202  
    ImageMeta meta = isMD5(s)
203  
      ? findConcept(ImageMeta, md5 := s)
204  
      : findConcept(ImageMeta, imageID := parseInt(s));
205  
    if (meta == null) ret "Not found";
206  
    deleteFile(imageFile(meta));
207  
    removeConcept(meta);
208  
    ret "Deleted!";
209  
  }
210  
  
211  
  null;
212  
}
213  
214  
static synchronized int newImageID() {
215  
  while (imageFile(id).exists())
216  
    ++id;
217  
  int i = id++;
218  
  save("id");
219  
  ret i;
220  
}
221  
222  
static File imageFile(ImageMeta meta) {
223  
  ret meta == null ? null : imageFile(meta.imageID);
224  
}
225  
226  
static File imageFile(int id) {
227  
  ret new File(imagesDir(), id + ".png");
228  
}
229  
230  
static void setPornFlag(int id, bool flag) {
231  
  saveTextFile(new File(imagesDir(), id + ".p0rn"), flag ? "t" : null);
232  
}
233  
234  
static bool isPornFlag(int id) {
235  
  ret eq("t", readTextFile(new File(imagesDir(), id + ".p0rn")));
236  
}
237  
238  
sS uploadForm() {
239  
  ret huploadform(
240  
      "Image file: " + hfileupload("accept", "image/png,image/jpeg,image/gif") + " "
241  
    + "<br>"
242  
    + "Optional name: " + hinputfield("name")
243  
    + hsubmit(),
244  
    "action", rawLink("upload"));
245  
}
246  
247  
sS imageLink(long id) {
248  
  //ret rawLink(str(id));
249  
  ret "https://botcompany.de/images/" + id;
250  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 19 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, nbgitpuheiab, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, sawdedvomwva, tslmcundralx, tvejysmllsmz, tzxuzeklshpk, vouqrxazstgt, xrpafgyirdlv

No comments. add comment

Snippet ID: #1004590
Snippet name: Image Server [LIVE at botcompany.de/images]
Eternal ID of this version: #1004590/62
Text MD5: 41925e01ee84e67d203ed37289494185
Transpilation MD5: 13107000cc64d1dfee79245a0a89a960
Author: stefan
Category: javax / networking
Type: JavaX source code (desktop)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-04-29 04:56:04
Source code size: 7055 bytes / 250 lines
Pitched / IR pitched: No / No
Views / Downloads: 1291 / 18802
Version history: 61 change(s)
Referenced in: [show references]