Karasiq / nanoboard

Scala nanoboard implementation

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Potrable nanoboard

username1565 opened this issue · comments

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

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

@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.

В общем, вроде-как, порешал я эту фигню с файлами. nanoboard/nanoboard#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.

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

@Karasiq,
Вот такая, примерно фигня - в портабельной версии:
#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-файлом или исполняемым файлом.

В категорию "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
(или просто вывести предупреждение).