Karasiq / nanoboard

Scala nanoboard implementation
Apache License 2.0
20 stars 1 forks source link

Potrable nanoboard #5

Open username1565 opened 5 years ago

username1565 commented 5 years ago

Есть несколько вопросов.

  1. Можете ли вы сделать Portable nanoboard в виде exe или jar-файла, как эта: nanoboard-restore.zip
  2. Можете ли вы сделать список ссылок на контейнеры, как downloaded.txt, который там есть, чтобы можно было выгрузить бекап - каким-нибудь wget.
  3. Сохраняются ли у вас PNG-картинки? Если да, то в какую папку?
Karasiq commented 5 years ago
  1. Могу
  2. Можно достать из базы SQL-запросом, но в этом нет особого смысла т.к. посты и так сохранены там, а в ПНГ в лучшем случае 1/8 полезных данных
  3. Не сохраняются, они обрабатываются однократно в памяти
Karasiq commented 5 years ago

https://github.com/Karasiq/nanoboard/releases/download/v1.3.2/nanoboard-portable-1.3.2.zip

username1565 commented 5 years ago
  1. Благодарю. Портаблик только на x64-й винде работает. Выгрузился файл каптчи, и всё нормально запустилось на windows 8.1, по bat-файлу.

  2. Да, я вижу там ссылки на PNG: "Настройки" - "Принятые контейнеры", но там не весь список, он урезан, и надо его листать. Можно было бы, этот список и обработать, каким-нибудь JavaScript'ом с регулярным выражением, но лучше было бы-таки, из базы их вытащить, и в файл сохранить, прописав это - в коде.

И да, вот сами нанопосты, можно ли их тоже высунуть из этой базы, и насовать в другие PNG-шки? Просто они, эти посты, недоступны к выбору, когда создаёшь PNG-контейнер. Сделать бы кнопку что-ли, чтоб на выбор их совать и распространять... Например, отвечаешь в тред - в PNG-шку пхается весь тред, или первый пост, и цепочка постов, к которым цепляешься. P.S.: Вопрос выше - отпадает. Нашёл кнопку "В очередь" под каждым нанопостом. =)

  1. Ну в клиенте 3.0 я тоже не вижу никакой папки с картинками... Она как занимала 200 мегабайт, так примерно и занимает, после прогрузки борды. Но там есть файл downloaded.txt, со ссылками на картинки, и я выгрузил эти картинки, при помощи aria2 и wget, запустив их с параметром пропуска повторяющихся файлов.

    Ещё бы сделать комментарии в настройках, там где список тредов, ну, чтобы строки, начинающиеся с символа # - пропускались... Тогда можно будет просто, со старой наноборды скопипастить настройки и сохранить, их, без редактирования. Ну, и... Наоборот. А то у вас поле красное становится, и надо искать во всём списке, где там пробел закрался или ещё чё... Поле краснеет, если есть символы #, \n, : (в случае если в URL указан PORT), и ещё если тред с GET-запросом и есть символ -, после доменного имени и имени файла страницы. Например, вот этот огрызок кода, из настроек старой наноборды:

    
    #My OWN thread

https://myboard.onion:4249/index.php?search-posts=true&last=50


содержит аж 5 ошибок, и попробуй найти их.

Ну и...
Кнопки, вроде "Collect PNG" я не вижу, борда как была пустой,
без всяких разделов, так и осталась пустой, после запуска.
В портаблике - не прописаны дефолтные треды.
И так - аж пока не додумаешься засунуть треды в настройки,
и только потом происходит автоматическая загрузка, на фоне, по-тихому.
Управлять процессом, и приостановить его (если мало памяти в системе) - нельзя,
приходится закрывать софтину.
Надо бы добавить кнопку, и если настройки пусты, или хосты тредов не отвечают,
чтобы всплыло сообщение о том, что делать дальше.
А то, поставил такой, смотришь не работает... И снёс софтину нафиг.
___
И ещё... Сделать бы отображение постов, в виде дерева, как в клиенте 3.0.
Ну, чтоб не кликать под сообщением, для просмотра каждого ответа.
username1565 commented 5 years ago

@Karasiq, посты с вашей борды не видно в третьем клиенте. Можете подгрузить тестовые контейнеры - отсюда: http://dobrochan.com/mad/res/75979.xhtml

UPD: Достаточно было подобавлять все посты ветки в очередь, обнулить случайные посты, и добавить все посты из очереди - в контейнер. После этого он нормально парсится в клиенте 3.0, и посты видно.


И да, несмотря на то, что посты с третьего клиента - у вас успешно грузятся, файлы старого xmg-формата - плохо отображаются... В общем, смотрите какая фигня:

Сообщение было написано в клиенте 3.0, и прогружено в вашей portable-наноборде.

  1. Не отображающаяся картинка, в сообщении, на вашей борде: message

  2. Исходный текст: message_as_text Видно только тег xmg, и base64. Если голый base64 скопировать, и сунуть сюда: https://username1565.github.io/brainwallet.github.io/#converter а затем - выбрать base и жмакнуть "download as binary", то на выходе, после закачки - получаем бинарник того же zip'a (но с другим расширением, txt). После переименования его в zip - открывается zip.

  3. А вот сам закачивающийся файл и ссылка на него, внизу окна, в клиенте 3.0: client-3 0 Имя файла - file.zip (by default), а внутри ссылки, by default, "data:application/zip;base64,и_сам_бейс_бинарника".

  4. Очевидно наличие атрибута download в этой "ссылке на закачку": attribute_download UPD: (об этом - в коде ниже).

Исходя из всего вышеописанного, для обратной совместимости с клиентом 3.0 просьба сделать у вас - интерпретирование bb-кода xmg не как картинки, а как zip-файла. UPD: (Смотрите код ниже.)

Ну и, конечно же, имя файла, и его расширение, можно было бы засунуть и после тега xmg, до знака =, через какую-нибудь запятую, точку с запятой, или другой разделитель, если имя файла и расширение - указаны. Как-то так: [xmg,pdf=бейс-бинарника], [xmg,image/svg+xml=бейс-бинарника], [xmg;My_archive.rar;application/octet-stream=бейс-бинарника].

UPD: (Сделав это так, чтобы сохранить обратную совместимость со старым xmg-форматом в клиенте 3.0.)

Если же имя файла не указано, но указано расширение (или mime-тип файла), то имя файла можно было бы сгенерировать и рандомно. Но лучше брать его из $('input[type=file]').files[0].name, при выборе файла для loading'a.

Для генерации файла, кстати, вот вам одна строчка на Javascript, которая генерирует рандомную строку любой длины, с одним лишь вызовом функции Math.random():

var len = 20;/*<--String Length ...*/for(var s = "", rem = 100000000, n = Math.random()*10*rem; s.length < len;){rem=10*rem%n; s+= (rem%10!==0)?rem.toString(36).replace(".", "").substr(0, len-s.length):"";}//document.write("<br>", 's.length: ', s.length, 's: ', s);

Можете вставить её в консоль браузера и пошатать параметр len, ну и на JAVA-байткод в jar-файлах перекрутить потом.


Также, можно сделать третий клиент совместимым с вашим форматом нанопостов, чтобы они грузились... Поскольку ни один контейнер, сгенерированный на вашей наноборде - не парсится клиентом 3.0, и посты внутри него - не отображаются... Исходный код третьего клиента - я перезалил сюда: https://github.com/username1565/nanoboard/ Но что надо бы подправить там, пока что - понятия не имею...


P.S.: Я вижу, что вставка bb-кода, при выборе файла, в клиенте 3.0, происходит на JavaScript, в файле nanoboard-restore\scripts\img2base64.js

//строка 75:
$('#result').text('[xmg='+res.substring(res.indexOf(',')+1)+']');
//строка 121:
$('#result').text('[xmg='+dataURL.substring(dataURL.indexOf(',')+1)+']');
//('[xmg='+(подстрока из dataURL с позиции следующей после позиции найденной запятой)+']');

К тому же и интерпретация BB-кода с тегом xmg - c выводом, в виде download-ссылки, тоже осуществляется через JavaScript, но уже в другом скрипте: nanoboard-restore\scripts\nanoclient.js

//строка 111:         
      if (img.src.startsWith('data:image/jpeg;base64,UEsDB')) {//if PK at first - then zip                      //saving backward compatibility with old zipJPEGs
        $(img).replaceWith($('<a download=file'+(i+1)+'.zip href='+img.src.replace('image/jpeg','application/zip')+'>[file'+(i+1)+'.zip]</a>'));
      }

Вот так как-то надо обрабатывать этот bb-код [xmg] и у вас - для обратной совместимости.

Я также вижу xmg, у вас уже есть - вот здесь: https://raw.githubusercontent.com/Karasiq/nanoboard/master/frontend/src/main/scala/com/karasiq/nanoboard/frontend/components/post/PostRenderer.scala но я не понимаю что оно, это xmg - вообще там делает. Ведь у вас, при вставке файла - вообще совсем по-другому всё происходит, без xmg: [file name="filename.ext" type="mime-type"]base64[/file] так что я не уверен, что код из вышеуказанного файла - вообще задействован, при вставке...

Ну и конечно же, в скриптах клиента 3.0 - можно было бы прописать и bb-код [file], как и у вас, но как именно это сделать, чтобы и xmg работало - я не очень врубаюсь... В функции function updateImage(loader) есть переменная

  var file = _loader.files[0];

Оттуда, как и с любого объекта "new File()", можно вытащить file.name (_loader.files[0].name) и file.type (_loader.files[0].type)... Ну, а дальше - уже думайте сами...


Чтобы через [file], как и у вас - можно было бы сделать это, как-то вот так вот:

//строка 76 в файле img2base64.js:
          $('#result').text('[file name="'+file.name+'" type="'+file.type+'"]'+res.substring(res.indexOf(',')+1)+'[/file]');

и в nanoclient.js ещё, где download к ссылке цепляется - имя файла занести, и mime-type в dataURL... Но это всё имело бы смысл, для корректного отображения файлов с вашей наноборды, при условии, если бы посты с вашей наноборды хотя-бы отображались в клиенте 3.0. А они - так и вовсе не отображаются там!

И да, если делать там, в клиенте 3.0, [file] вместо [xmg], то подчеркну, что надо бы cделать это, обратно совместимым и со старым [xmg]...


Поясню, почему я зациклился именно на stable версии клиента 3.0? Да потому что клиент 3.1, на наноборде который, он на XP не запустится, он требует .NET Framework v4.5.2, а 4.5 Framework - несовместима с Windows XP и более ранними версиями Windows.

Но при этом, 32-битная версия client 3.0 успешно запускается и на XP и на любой 64-битной системе, с любым фреймворком, выше 4.0.

username1565 commented 5 years ago

В общем, вроде-как, порешал я эту фигню с файлами. https://github.com/nanoboard/nanoboard/issues/6 Вам остаётся поддержать кодом на скале - zip-файлы у старичка [xmg], как тут:

//строка 111:         
      if (img.src.startsWith('data:image/jpeg;base64,UEsDB')) {//if PK at first - then zip                      //saving backward compatibility with old zipJPEGs
        $(img).replaceWith($('<a download=file'+(i+1)+'.zip href='+img.src.replace('image/jpeg','application/zip')+'>[file'+(i+1)+'.zip]</a>'));
      }

Просто проверив начальные байты бейса. Конвертировать base64 в bin - можно здесь: https://username1565.github.io/brainwallet.github.io/#converter Base64 -> bin (download as binary) Base64 -> text (исходный текст файла) Bin -> base64 (Just loading file) Можно добавить ещё пару форматов, интерпретируя первые байты бейса. Пример, код на JavaScript:

//first bytes of base64 contains signatures for different file types
if(str.substring(0, 4)==='/9j/') // "яШя"   check JPEG signature in first bytes of file
{
    str = 'data:image/jpeg;base64,'+str; //set jpeg
}else if(str.substring(0, 4)==='R0lG'){ //gif
    str = 'data:image/gif;base64,'+str;
}else if(
    str.substring(0, 8)==='PD94bWwg' // "<xml" beginning from xml-tag   
||  str.substring(0, 8)==='PHN2Zwog' // or "<svg" beginninb from svg-tag
){
    str = 'data:image/svg+xml;base64,'+str; //set svg+xml
}else{   //or
    str = 'data:image/png;base64,'+str; //by default set PNG
}

Ну и, надо бы, нам, как-нибудь, совместными усилиями - сделать так, чтоб посты с вашей борды грузились в клиенте 3.0, и наоборот ещё - всё надо перетестить и поисправлять или вообще переписать, а то, порой у вас в консоли - ошибки лезут, когда грузишь контейнеры, сгенерированные в клиенте 3.0.

И да, что за фрактальная музыка, у вас там, такая? ))

username1565 commented 5 years ago

@Karasiq, Вот такая, примерно фигня - в портабельной версии: https://github.com/Karasiq/nanoboard/issues/3

Консоль - тут: https://pastebin.com/farvg4Xv Лезут ошибки, последние сообщения прогружаются не все.


UPD: достаточно было разблокировать nanoboard.bat в фаерволе (Comodo firewall), и всё зработало. Ошибки по прежнему иногда лезут, при попытке распарсить некоторые контейнеры, но вся борда прогружена и все разделы работают, кроме категории test.


В категорию "test" зайти нельзя. Наверняка, потому что в одном из постов есть код:

//строка 75 в файле nanoboard-restore\scripts\img2base64.js:
//          $('#result').text('[xmg='+res.substring(res.indexOf(',')+1)+']');
//заменена на
          $('#result').text('[file name="'+file.name+'" type="'+file.type+'"]'+res.substring(res.indexOf(',')+1)+'[/file]');

и в нём какие-то спецсимволы, либо [xmg-тег без бейса...

А также, возможно всё глючит нафиг - из-за конструкции [file]BLAH-BLAH[/file] без бейса внутри, или из-за строки '[file name="filename.extension" type="mime-type"]BASE64-CONTENT[/file]', либо из-за файлов с bb-кодом file, как в вышеуказанной строке, но только - без одинарных кавычек. Всё это надо бы исправить...

Ещё, хотелось бы удалить все контейнеры и прогрузить их по новой, но я не пойму куда сохраняются результаты о прогрузке контейнеров. Удалил всё из папки portable nanoboard и деинсталлировал nanoboard 1.3.2. Снова распаковал nanoboard portable v1.3.2, запустил, и вижу что настройки сохранены, и сообщения старые тоже на борде есть.

Также, хотелось бы задать папку для настроек в портабельной версии, при запуске её, например, параметром -data-dir="data", чтобы всё сохранялось в папку "data", рядом с bat-файлом или исполняемым файлом.

username1565 commented 5 years ago

В категорию "test" зайти нельзя. Наверняка, потому что в одном из постов [xmg-тег без бейса [file]BLAH-BLAH[/file] без бейса

Да, где-то тут вот и надо пофиксить... В клиенте 3.0 такие посты грузятся нормально.

В консоли браузера (клавиша F12), при клике на категорию test, я вижу следующее:

0dd95fa0-a4f8-4117-bdf9-6fba998771b3.js:1821 scala.scalajs.js.JavaScriptException:
InvalidCharacterError: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
...
Ну и дальше там ещё...

Следующие три поста содержат ошибки, стопорящие наноборду в портабельном клиенте карасика:

946d50e33c413a93d7c963424e0846d9

// $('#result').text('[xmg='+res.substring(res.indexOf(',')+1)+']');

  • throw-error функции atob : [xmg=не_base64] $('#result').text('[file name="'+file.name+'" type="'+file.type+'"]'+res.substring(res.indexOf(',')+1)+'[/file]');
  • throw-error функции atob: [file]не_base64[/file]

c19a06c128f78e5946014883bc018dd9

'[file name="filename.extension" type="mime-type"]BASE64-CONTENT[/file]'

  • throw-error функции atob: [file]не_base64[/file]

4dcf53a58e839e8fddce6959222ed675

В предыдущем посте, был код с тегом [file]BLAH-BLAH[/file].

  • throw-error функции atob: [file]не_base64[/file]

И ещё, помимо [xmg=НЕ_БЕЙС64], у тега [img=НЕ_БЕЙС64] - тоже throw error'ом стопорит весь скрипт, если его вводить руками, этот НЕ_БЕЙС64. Превью искажается, в консоли браузера - видно throw exception.


После throw Error, выполнение скрипта - стопорится... Поэтому, вот вам функция на JavaScript, для проверки строки, без throw error:

//check is base64 without throw error
function isBase64(str) {//return true, or false
    if(str==='' || str.trim()===''){return false;}//if string is empty or not contains base64 characters
    try {
        return btoa(atob(str)) == str; //true if base64
    } catch (err) {
        return false;
    }
}

А дальше уже, если true, то можно продолжить - декодинг бейса, функцией atob. Можете пришпандорить эту функцию, в js-скрипты, причём везде, где используется бейс, с условием:

if(isBase64(str)){
//код
}else{
console.log('str is not base64-encoded. str = ', str);
}
//and continue script...

bb-код file - я протестил отдельно, в категории Test2. Всё работает. Не работают разве что посты, запощенные из-под nanoboard-portable-1.3.2, а именно - посты с большими и недожатыми JPEG'ами, они просто не парсятся в клиенте 3.0 из контейнера, и какая-то ошибка длины массива там, в консоли вылазит. Но это уже не ваша трабла, и надо править где-то - код клиента 3.0. Ну, или, ограничить длину бейса для совместимости с 3.0 (или просто вывести предупреждение).