Version18.76

This commit is contained in:
Antonio Cañas Vargas 2019-03-13 23:04:00 +01:00
parent a12f4ed5ce
commit 4e93b5ef19
6 changed files with 415 additions and 215 deletions

View File

@ -560,7 +560,7 @@ CREATE TABLE IF NOT EXISTS forum_post (
Subject TEXT NOT NULL,
Content LONGTEXT NOT NULL,
MediaName VARCHAR(43) NOT NULL DEFAULT '',
MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',
MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',
MediaTitle VARCHAR(2047) NOT NULL DEFAULT '',
MediaURL VARCHAR(255) NOT NULL DEFAULT '',
UNIQUE INDEX(PstCod),
@ -809,7 +809,7 @@ CREATE TABLE IF NOT EXISTS msg_content (
Subject TEXT NOT NULL,
Content LONGTEXT NOT NULL,
MediaName VARCHAR(43) NOT NULL DEFAULT '',
MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',
MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',
MediaTitle VARCHAR(2047) NOT NULL DEFAULT '',
MediaURL VARCHAR(255) NOT NULL DEFAULT '',
UNIQUE INDEX(MsgCod),
@ -822,7 +822,7 @@ CREATE TABLE IF NOT EXISTS msg_content_deleted (
Subject TEXT NOT NULL,
Content LONGTEXT NOT NULL,
MediaName VARCHAR(43) NOT NULL DEFAULT '',
MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',
MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',
MediaTitle VARCHAR(2047) NOT NULL DEFAULT '',
MediaURL VARCHAR(255) NOT NULL DEFAULT '',
UNIQUE INDEX(MsgCod),
@ -1026,7 +1026,7 @@ CREATE TABLE IF NOT EXISTS social_comments (
PubCod BIGINT NOT NULL,
Content LONGTEXT NOT NULL,
MediaName VARCHAR(43) NOT NULL DEFAULT '',
MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',
MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',
MediaTitle VARCHAR(2047) NOT NULL DEFAULT '',
MediaURL VARCHAR(255) NOT NULL DEFAULT '',
UNIQUE INDEX(PubCod),
@ -1075,7 +1075,7 @@ CREATE TABLE IF NOT EXISTS social_posts (
PstCod INT NOT NULL AUTO_INCREMENT,
Content LONGTEXT NOT NULL,
MediaName VARCHAR(43) NOT NULL DEFAULT '',
MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',
MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',
MediaTitle VARCHAR(2047) NOT NULL DEFAULT '',
MediaURL VARCHAR(255) NOT NULL DEFAULT '',
UNIQUE INDEX(PstCod),
@ -1204,7 +1204,7 @@ CREATE TABLE IF NOT EXISTS tst_answers (
Answer TEXT NOT NULL,
Feedback TEXT NOT NULL,
MediaName VARCHAR(43) NOT NULL DEFAULT '',
MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',
MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',
MediaTitle VARCHAR(2047) NOT NULL DEFAULT '',
MediaURL VARCHAR(255) NOT NULL DEFAULT '',
Correct ENUM('N','Y') NOT NULL,
@ -1265,7 +1265,7 @@ CREATE TABLE IF NOT EXISTS tst_questions (
Stem TEXT NOT NULL,
Feedback TEXT NOT NULL,
MediaName VARCHAR(43) NOT NULL DEFAULT '',
MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',
MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',
MediaTitle VARCHAR(2047) NOT NULL DEFAULT '',
MediaURL VARCHAR(255) NOT NULL DEFAULT '',
NumHits INT NOT NULL DEFAULT 0,

View File

@ -452,10 +452,20 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 18.75.1 (2019-03-13)"
#define Log_PLATFORM_VERSION "SWAD 18.76 (2019-03-13)"
#define CSS_FILE "swad18.68.3.css"
#define JS_FILE "swad18.75.js"
/*
Version 18.76: Mar 13, 2019 Video allowed as multimedia. (239814 lines)
7 changes necessary in database:
ALTER TABLE forum_post CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none';
ALTER TABLE msg_content CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none';
ALTER TABLE msg_content_deleted CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none';
ALTER TABLE social_comments CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none';
ALTER TABLE social_posts CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none';
ALTER TABLE tst_answers CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none';
ALTER TABLE tst_questions CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none';
Version 18.75.1: Mar 13, 2019 Timeline note is not shown apart on top of timeline when commenting. (239630 lines)
Version 18.75: Mar 13, 2019 Timeline refresh rate start with 2 s and is increased 1 s on each refresh. (239633 lines)
Version 18.74.4: Mar 13, 2019 Fixed bug in JavaScript related to timeline. (239628 lines)

View File

@ -1207,23 +1207,23 @@ mysql> DESCRIBE forum_disabled_post;
/***** Table forum_post *****/
/*
mysql> DESCRIBE forum_post;
+------------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+----------------+
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
| ThrCod | int(11) | NO | MUL | NULL | |
| UsrCod | int(11) | NO | MUL | NULL | |
| CreatTime | datetime | NO | MUL | NULL | |
| ModifTime | datetime | NO | MUL | NULL | |
| NumNotif | int(11) | NO | | 0 | |
| Subject | text | NO | | NULL | |
| Content | longtext | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+--------------------------+------+-----+---------+----------------+
12 rows in set (0.01 sec)
+------------+---------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------------------------------+------+-----+---------+----------------+
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
| ThrCod | int(11) | NO | MUL | NULL | |
| UsrCod | int(11) | NO | MUL | NULL | |
| CreatTime | datetime | NO | MUL | NULL | |
| ModifTime | datetime | NO | MUL | NULL | |
| NumNotif | int(11) | NO | | 0 | |
| Subject | text | NO | | NULL | |
| Content | longtext | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+---------------------------------------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS forum_post ("
"PstCod INT NOT NULL AUTO_INCREMENT,"
@ -1235,7 +1235,7 @@ mysql> DESCRIBE forum_post;
"Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT
"Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',"
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PstCod),"
@ -1733,17 +1733,17 @@ mysql> DESCRIBE msg_banned;
/***** Table msg_content *****/
/*
mysql> DESCRIBE msg_content;
+------------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+----------------+
| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
| Subject | text | NO | MUL | NULL | |
| Content | longtext | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+--------------------------+------+-----+---------+----------------+
+------------+---------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------------------------------+------+-----+---------+----------------+
| MsgCod | int(11) | NO | PRI | NULL | auto_increment |
| Subject | text | NO | MUL | NULL | |
| Content | longtext | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+---------------------------------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content ("
@ -1751,7 +1751,7 @@ mysql> DESCRIBE msg_content;
"Subject TEXT NOT NULL,"
"Content LONGTEXT NOT NULL,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',"
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(MsgCod),"
@ -1760,17 +1760,17 @@ mysql> DESCRIBE msg_content;
/***** Table msg_content_deleted *****/
/*
mysql> DESCRIBE msg_content_deleted;
+------------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+-------+
| MsgCod | int(11) | NO | PRI | NULL | |
| Subject | text | NO | MUL | NULL | |
| Content | longtext | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+--------------------------+------+-----+---------+-------+
+------------+---------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------------------------------+------+-----+---------+-------+
| MsgCod | int(11) | NO | PRI | NULL | |
| Subject | text | NO | MUL | NULL | |
| Content | longtext | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+---------------------------------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content_deleted ("
@ -1778,7 +1778,7 @@ mysql> DESCRIBE msg_content_deleted;
"Subject TEXT NOT NULL,"
"Content LONGTEXT NOT NULL,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',"
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(MsgCod),"
@ -2176,23 +2176,23 @@ mysql> DESCRIBE sessions;
/***** Table social_comments *****/
/*
mysql> DESCRIBE social_comments;
+------------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+-------+
| PubCod | bigint(20) | NO | PRI | NULL | |
| Content | longtext | NO | MUL | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+--------------------------+------+-----+---------+-------+
+------------+---------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------------------------------+------+-----+---------+-------+
| PubCod | bigint(20) | NO | PRI | NULL | |
| Content | longtext | NO | MUL | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+---------------------------------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_comments ("
"PubCod BIGINT NOT NULL,"
"Content LONGTEXT NOT NULL,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',"
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PubCod),"
@ -2274,23 +2274,23 @@ mysql> DESCRIBE social_notes_fav;
/***** Table social_posts *****/
/*
mysql> DESCRIBE social_posts;
+------------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+----------------+
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
| Content | longtext | NO | MUL | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+--------------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
+------------+---------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------------------------------+------+-----+---------+----------------+
| PstCod | int(11) | NO | PRI | NULL | auto_increment |
| Content | longtext | NO | MUL | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
+------------+---------------------------------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_posts ("
"PubCod INT NOT NULL AUTO_INCREMENT,"
"Content LONGTEXT NOT NULL,"
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',"
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"UNIQUE INDEX(PubCod),"
@ -2547,19 +2547,19 @@ mysql> DESCRIBE timetable_tut;
/***** Table tst_answers *****/
/*
mysql> DESCRIBE tst_answers;
+------------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+-------+
| QstCod | int(11) | NO | MUL | NULL | |
| AnsInd | tinyint(4) | NO | | NULL | |
| Answer | text | NO | | NULL | |
| Feedback | text | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
| Correct | enum('N','Y') | NO | | NULL | |
+------------+--------------------------+------+-----+---------+-------+
+------------+---------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------------------------------+------+-----+---------+-------+
| QstCod | int(11) | NO | MUL | NULL | |
| AnsInd | tinyint(4) | NO | | NULL | |
| Answer | text | NO | | NULL | |
| Feedback | text | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
| Correct | enum('N','Y') | NO | | NULL | |
+------------+---------------------------------------------+------+-----+---------+-------+
9 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers ("
@ -2568,7 +2568,7 @@ mysql> DESCRIBE tst_answers;
"Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
"Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',"
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"Correct ENUM('N','Y') NOT NULL,"
@ -2685,7 +2685,7 @@ mysql> DESCRIBE tst_questions;
| Stem | text | NO | | NULL | |
| Feedback | text | NO | | NULL | |
| MediaName | varchar(43) | NO | | | |
| MediaType | enum('none','jpg','gif') | NO | | none | |
| MediaType | enum('none','jpg','gif','mp4','webm','ogg') | NO | | none | |
| MediaTitle | varchar(2047) | NO | | | |
| MediaURL | varchar(255) | NO | | | |
| NumHits | int(11) | NO | | 0 | |
@ -2703,7 +2703,7 @@ mysql> DESCRIBE tst_questions;
"Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME
"MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none',"
"MediaType ENUM('none','jpg','gif','mp4','webm','ogg') NOT NULL DEFAULT 'none',"
"MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE
"MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW
"NumHits INT NOT NULL DEFAULT 0,"

View File

@ -54,9 +54,23 @@ const char *Med_StringsTypeDB[Med_NUM_TYPES] =
"none", // Med_NONE
"jpg", // Med_JPG
"gif", // Med_GIF
"mp4", // Med_MP4
"webm", // Med_WEBM
"ogg", // Med_OGG
};
const char *Med_Extensions[Med_NUM_TYPES] =
{
"", // Med_NONE
"jpg", // Med_JPG
"gif", // Med_GIF
"mp4", // Med_MP4
"webm", // Med_WEBM
"ogg", // Med_OGG
};
#define Med_MAX_SIZE_GIF (5UL * 1024UL * 1024UL) // 5 MiB
#define Med_MAX_SIZE_MP4 (5UL * 1024UL * 1024UL) // 5 MiB
/*****************************************************************************/
/****************************** Internal types *******************************/
@ -89,6 +103,9 @@ static void Med_ProcessJPG (struct Media *Media,
static void Med_ProcessGIF (struct Media *Media,
const char PathMedPrivTmp[PATH_MAX + 1],
const char PathFileOrg[PATH_MAX + 1]);
static void Med_ProcessVideo (struct Media *Media,
const char PathMedPrivTmp[PATH_MAX + 1],
const char PathFileOrg[PATH_MAX + 1]);
static int Med_ResizeImage (struct Media *Media,
const char PathFileOriginal[PATH_MAX + 1],
@ -107,8 +124,12 @@ static void Med_ShowJPG (struct Media *Media,
static void Med_ShowGIF (struct Media *Media,
const char PathMedPriv[PATH_MAX + 1],
const char *ClassMedia);
static void Med_ShowVideo (struct Media *Media,
const char PathMedPriv[PATH_MAX + 1],
const char *ClassMedia);
static Med_Type_t Med_GetTypeFromExtension (const char *Extension);
static Med_Type_t Med_GetTypeFromExtAndMIME (const char *Extension,
const char *MIMEType);
/*****************************************************************************/
/********************* Reset media (image/video) fields **********************/
@ -263,7 +284,8 @@ void Med_PutMediaUploader (int NumMediaInForm,const char *ClassMediaTitURL)
"<img src=\"%s/camera.svg\""
" alt=\"%s\" title=\"%s (%s)\""
" class=\"MED_UPL_ICO\" />"
"<input type=\"file\" name=\"%s\" accept=\"image/*\""
"<input type=\"file\" name=\"%s\""
" accept=\"image/,video/\""
" class=\"MED_UPL_FIL\""
" onchange=\"mediaUploadOnSelectFile (this,'%s');\" />"
"<span id=\"%s_fil\" class=\"MED_UPL_NAM\" />"
@ -455,7 +477,6 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
char PathMedPriv[PATH_MAX + 1];
char PathMedPrivTmp[PATH_MAX + 1];
char PathFileOrg[PATH_MAX + 1]; // Full name of original uploaded file
bool WrongType = false;
/***** Set media file status *****/
Media->Status = Med_FILE_NONE;
@ -479,19 +500,10 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
return;
/* Check extension */
Media->Type = Med_GetTypeFromExtension (PtrExtension);
Media->Type = Med_GetTypeFromExtAndMIME (PtrExtension,MIMEType);
if (Media->Type == Med_NONE)
return;
/* Check if the file type is image/ or application/octet-stream */
if (strncmp (MIMEType,"image/",strlen ("image/")))
if (strcmp (MIMEType,"application/octet-stream"))
if (strcmp (MIMEType,"application/octetstream"))
if (strcmp (MIMEType,"application/octet"))
WrongType = true;
if (WrongType)
return;
/***** Assign a unique name for the media *****/
Cry_CreateUniqueNameEncrypted (Media->Name);
@ -522,7 +534,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
{
Media->Status = Med_FILE_RECEIVED;
/***** Detect if amnimated gif *****/
/***** Detect if animated GIF *****/
if (Media->Type == Med_GIF)
if (!Med_DetectIfAnimated (Media,PathMedPrivTmp,PathFileOrg))
Media->Type = Med_JPG;
@ -536,6 +548,11 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media,
case Med_GIF:
Med_ProcessGIF (Media,PathMedPrivTmp,PathFileOrg);
break;
case Med_MP4:
case Med_WEBM:
case Med_OGG:
Med_ProcessVideo (Media,PathMedPrivTmp,PathFileOrg);
break;
default:
break;
}
@ -599,14 +616,14 @@ static void Med_ProcessJPG (struct Media *Media,
const char PathMedPrivTmp[PATH_MAX + 1],
const char PathFileOrg[PATH_MAX + 1])
{
extern const char *Txt_The_image_could_not_be_processed_successfully;
extern const char *Txt_The_file_could_not_be_processed_successfully;
char PathFileJPGTmp[PATH_MAX + 1]; // Full name of temporary processed file
/***** Convert original media to temporary JPG processed file
by calling to program that makes the conversion *****/
snprintf (PathFileJPGTmp,sizeof (PathFileJPGTmp),
"%s/%s.jpg",
PathMedPrivTmp,Media->Name);
"%s/%s.%s",
PathMedPrivTmp,Media->Name,Med_Extensions[Med_JPG]);
if (Med_ResizeImage (Media,PathFileOrg,PathFileJPGTmp) == 0) // On success ==> 0 is returned
/* Success */
Media->Status = Med_FILE_PROCESSED;
@ -617,7 +634,7 @@ static void Med_ProcessJPG (struct Media *Media,
unlink (PathFileJPGTmp);
/* Show error alert */
Ale_ShowAlert (Ale_ERROR,Txt_The_image_could_not_be_processed_successfully);
Ale_ShowAlert (Ale_ERROR,Txt_The_file_could_not_be_processed_successfully);
}
}
@ -629,8 +646,8 @@ static void Med_ProcessGIF (struct Media *Media,
const char PathMedPrivTmp[PATH_MAX + 1],
const char PathFileOrg[PATH_MAX + 1])
{
extern const char *Txt_The_image_could_not_be_processed_successfully;
extern const char *Txt_The_size_of_the_GIF_file_exceeds_the_maximum_allowed_X;
extern const char *Txt_The_file_could_not_be_processed_successfully;
extern const char *Txt_The_size_of_the_file_exceeds_the_maximum_allowed_X;
struct stat FileStatus;
char PathFilePNGTmp[PATH_MAX + 1]; // Full name of temporary processed file
char PathFileGIFTmp[PATH_MAX + 1]; // Full name of temporary processed file
@ -653,8 +670,8 @@ static void Med_ProcessGIF (struct Media *Media,
/* Success */
/***** Move original GIF file to temporary GIF file *****/
snprintf (PathFileGIFTmp,sizeof (PathFileGIFTmp),
"%s/%s.gif",
PathMedPrivTmp,Media->Name);
"%s/%s.%s",
PathMedPrivTmp,Media->Name,Med_Extensions[Med_GIF]);
if (rename (PathFileOrg,PathFileGIFTmp)) // Fail
{
/* Remove temporary PNG file */
@ -662,7 +679,7 @@ static void Med_ProcessGIF (struct Media *Media,
unlink (PathFilePNGTmp);
/* Show error alert */
Ale_ShowAlert (Ale_ERROR,Txt_The_image_could_not_be_processed_successfully);
Ale_ShowAlert (Ale_ERROR,Txt_The_file_could_not_be_processed_successfully);
}
else // Success
Media->Status = Med_FILE_PROCESSED;
@ -674,24 +691,68 @@ static void Med_ProcessGIF (struct Media *Media,
unlink (PathFilePNGTmp);
/* Show error alert */
Ale_ShowAlert (Ale_ERROR,Txt_The_image_could_not_be_processed_successfully);
Ale_ShowAlert (Ale_ERROR,Txt_The_file_could_not_be_processed_successfully);
}
}
else // Size exceeded
{
/* Show warning alert */
Fil_WriteFileSizeBrief ((double) Med_MAX_SIZE_GIF,FileSizeStr);
Ale_ShowAlert (Ale_WARNING,Txt_The_size_of_the_GIF_file_exceeds_the_maximum_allowed_X,
Ale_ShowAlert (Ale_WARNING,Txt_The_size_of_the_file_exceeds_the_maximum_allowed_X,
FileSizeStr);
}
}
else // Error getting file data
/* Show error alert */
Ale_ShowAlert (Ale_ERROR,Txt_The_image_could_not_be_processed_successfully);
Ale_ShowAlert (Ale_ERROR,Txt_The_file_could_not_be_processed_successfully);
}
/*****************************************************************************/
/************ Process original media generating processed media **************/
/*********** Process original MP4 video generating processed MP4 *************/
/*****************************************************************************/
static void Med_ProcessVideo (struct Media *Media,
const char PathMedPrivTmp[PATH_MAX + 1],
const char PathFileOrg[PATH_MAX + 1])
{
extern const char *Txt_The_file_could_not_be_processed_successfully;
extern const char *Txt_The_size_of_the_file_exceeds_the_maximum_allowed_X;
struct stat FileStatus;
char PathFileTmp[PATH_MAX + 1]; // Full name of temporary processed file
char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
/***** Check size of media file *****/
if (lstat (PathFileOrg,&FileStatus) == 0) // On success ==> 0 is returned
{
/* Success */
if (FileStatus.st_size <= (__off_t) Med_MAX_SIZE_MP4)
{
/* File size correct */
/***** Move original video file to temporary MP4 file *****/
snprintf (PathFileTmp,sizeof (PathFileTmp),
"%s/%s.%s",
PathMedPrivTmp,Media->Name,Med_Extensions[Media->Type]);
if (rename (PathFileOrg,PathFileTmp)) // Fail
/* Show error alert */
Ale_ShowAlert (Ale_ERROR,Txt_The_file_could_not_be_processed_successfully);
else // Success
Media->Status = Med_FILE_PROCESSED;
}
else // Size exceeded
{
/* Show warning alert */
Fil_WriteFileSizeBrief ((double) Med_MAX_SIZE_MP4,FileSizeStr);
Ale_ShowAlert (Ale_WARNING,Txt_The_size_of_the_file_exceeds_the_maximum_allowed_X,
FileSizeStr);
}
}
else // Error getting file data
/* Show error alert */
Ale_ShowAlert (Ale_ERROR,Txt_The_file_could_not_be_processed_successfully);
}
/*****************************************************************************/
/****************************** Resize image *********************************/
/*****************************************************************************/
// Return 0 on success
// Return != 0 on error
@ -771,15 +832,26 @@ void Med_MoveMediaToDefinitiveDir (struct Media *Media)
{
case Med_JPG:
/* Move JPG */
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,"jpg"))
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
Med_Extensions[Med_JPG]))
return; // Fail
break;
case Med_GIF:
/* Move PNG */
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,"png"))
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
"png"))
return; // Fail
/* Move GIF */
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,"gif"))
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
Med_Extensions[Med_GIF]))
return; // Fail
break;
case Med_MP4:
case Med_WEBM:
case Med_OGG:
/* Move MP4 or WEBM or OGG */
if (!Med_MoveTmpFileToDefDir (Media,PathMedPrivTmp,PathMedPriv,
Med_Extensions[Media->Type]))
return; // Fail
break;
default:
@ -874,6 +946,11 @@ void Med_ShowMedia (struct Media *Media,
case Med_GIF:
Med_ShowGIF (Media,PathMedPriv,ClassMedia);
break;
case Med_MP4:
case Med_WEBM:
case Med_OGG:
Med_ShowVideo (Media,PathMedPriv,ClassMedia);
break;
default:
break;
}
@ -894,26 +971,26 @@ static void Med_ShowJPG (struct Media *Media,
const char PathMedPriv[PATH_MAX + 1],
const char *ClassMedia)
{
extern const char *Txt_Image_not_found;
char FileNameImgPriv[NAME_MAX + 1];
extern const char *Txt_File_not_found;
char FileNameMediaPriv[NAME_MAX + 1];
char FullPathMediaPriv[PATH_MAX + 1];
char URLTmp[PATH_MAX + 1];
char URL_JPG[PATH_MAX + 1];
/***** Build private path to JPG *****/
snprintf (FileNameImgPriv,sizeof (FileNameImgPriv),
"%s.jpg",
Media->Name);
snprintf (FileNameMediaPriv,sizeof (FileNameMediaPriv),
"%s.%s",
Media->Name,Med_Extensions[Med_JPG]);
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s",
PathMedPriv,FileNameImgPriv);
PathMedPriv,FileNameMediaPriv);
/***** Check if private media file exists *****/
if (Fil_CheckIfPathExists (FullPathMediaPriv))
{
/***** Create symbolic link from temporary public directory to private file
in order to gain access to it for showing/downloading *****/
Brw_CreateTmpPublicLinkToPrivateFile (FullPathMediaPriv,FileNameImgPriv);
Brw_CreateTmpPublicLinkToPrivateFile (FullPathMediaPriv,FileNameMediaPriv);
/***** Build temporary public URL *****/
snprintf (URLTmp,sizeof (URLTmp),
@ -924,7 +1001,7 @@ static void Med_ShowJPG (struct Media *Media,
/***** Create URL pointing to symbolic link *****/
snprintf (URL_JPG,sizeof (URL_JPG),
"%s/%s",
URLTmp,FileNameImgPriv);
URLTmp,FileNameMediaPriv);
/***** Show media *****/
fprintf (Gbl.F.Out,"<img src=\"%s\" class=\"%s\" alt=\"\"",URL_JPG,ClassMedia);
@ -934,7 +1011,7 @@ static void Med_ShowJPG (struct Media *Media,
fprintf (Gbl.F.Out," lazyload=\"on\" />"); // Lazy load of the media
}
else
fprintf (Gbl.F.Out,"%s",Txt_Image_not_found);
fprintf (Gbl.F.Out,"%s",Txt_File_not_found);
}
/*****************************************************************************/
@ -945,27 +1022,27 @@ static void Med_ShowGIF (struct Media *Media,
const char PathMedPriv[PATH_MAX + 1],
const char *ClassMedia)
{
extern const char *Txt_Image_not_found;
char FileNameImgPriv[NAME_MAX + 1];
extern const char *Txt_File_not_found;
char FileNameMediaPriv[NAME_MAX + 1];
char FullPathMediaPriv[PATH_MAX + 1];
char URLTmp[PATH_MAX + 1];
char URL_GIF[PATH_MAX + 1];
char URL_PNG[PATH_MAX + 1];
/***** Build private path to animated GIF image *****/
snprintf (FileNameImgPriv,sizeof (FileNameImgPriv),
"%s.gif",
Media->Name);
snprintf (FileNameMediaPriv,sizeof (FileNameMediaPriv),
"%s.%s",
Media->Name,Med_Extensions[Med_GIF]);
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s",
PathMedPriv,FileNameImgPriv);
PathMedPriv,FileNameMediaPriv);
/***** Check if private media file exists *****/
if (Fil_CheckIfPathExists (FullPathMediaPriv))
{
/***** Create symbolic link from temporary public directory to private file
in order to gain access to it for showing/downloading *****/
Brw_CreateTmpPublicLinkToPrivateFile (FullPathMediaPriv,FileNameImgPriv);
Brw_CreateTmpPublicLinkToPrivateFile (FullPathMediaPriv,FileNameMediaPriv);
/***** Build temporary public URL *****/
snprintf (URLTmp,sizeof (URLTmp),
@ -976,27 +1053,27 @@ static void Med_ShowGIF (struct Media *Media,
/***** Create URL pointing to symbolic link *****/
snprintf (URL_GIF,sizeof (URL_GIF),
"%s/%s",
URLTmp,FileNameImgPriv);
URLTmp,FileNameMediaPriv);
/***** Build private path to static PNG image *****/
snprintf (FileNameImgPriv,sizeof (FileNameImgPriv),
snprintf (FileNameMediaPriv,sizeof (FileNameMediaPriv),
"%s.png",
Media->Name);
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s",
PathMedPriv,FileNameImgPriv);
PathMedPriv,FileNameMediaPriv);
/***** Check if private media file exists *****/
if (Fil_CheckIfPathExists (FullPathMediaPriv))
{
/***** Create symbolic link from temporary public directory to private file
in order to gain access to it for showing/downloading *****/
Brw_CreateTmpPublicLinkToPrivateFile (FullPathMediaPriv,FileNameImgPriv);
Brw_CreateTmpPublicLinkToPrivateFile (FullPathMediaPriv,FileNameMediaPriv);
/***** Create URL pointing to symbolic link *****/
snprintf (URL_PNG,sizeof (URL_PNG),
"%s/%s",
URLTmp,FileNameImgPriv);
URLTmp,FileNameMediaPriv);
/***** Show static PNG and animated GIF *****/
fprintf (Gbl.F.Out,"<div class=\"MED_PLAY\""
@ -1023,10 +1100,73 @@ static void Med_ShowGIF (struct Media *Media,
fprintf (Gbl.F.Out,"</div>");
}
else
fprintf (Gbl.F.Out,"%s",Txt_Image_not_found);
fprintf (Gbl.F.Out,"%s",Txt_File_not_found);
}
else
fprintf (Gbl.F.Out,"%s",Txt_Image_not_found);
fprintf (Gbl.F.Out,"%s",Txt_File_not_found);
}
/*****************************************************************************/
/************************** Show a user uploaded MP4 *************************/
/*****************************************************************************/
static void Med_ShowVideo (struct Media *Media,
const char PathMedPriv[PATH_MAX + 1],
const char *ClassMedia)
{
extern const char *Txt_File_not_found;
char FileNameMediaPriv[NAME_MAX + 1];
char FullPathMediaPriv[PATH_MAX + 1];
char URLTmp[PATH_MAX + 1];
char URL_Video[PATH_MAX + 1];
/***** Build private path to video *****/
snprintf (FileNameMediaPriv,sizeof (FileNameMediaPriv),
"%s.%s",
Media->Name,Med_Extensions[Media->Type]);
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s",
PathMedPriv,FileNameMediaPriv);
/***** Check if private media file exists *****/
if (Fil_CheckIfPathExists (FullPathMediaPriv))
{
/***** Create symbolic link from temporary public directory to private file
in order to gain access to it for showing/downloading *****/
Brw_CreateTmpPublicLinkToPrivateFile (FullPathMediaPriv,FileNameMediaPriv);
/***** Build temporary public URL *****/
snprintf (URLTmp,sizeof (URLTmp),
"%s/%s/%s",
Cfg_URL_SWAD_PUBLIC,Cfg_FOLDER_FILE_BROWSER_TMP,
Gbl.FileBrowser.TmpPubDir);
/***** Create URL pointing to symbolic link *****/
snprintf (URL_Video,sizeof (URL_Video),
"%s/%s",
URLTmp,FileNameMediaPriv);
/***** Show media *****/
/*
<video width="400" controls>
<source src="mov_bbb.mp4" type="video/mp4">
<source src="mov_bbb.ogg" type="video/ogg">
Your browser does not support HTML5 video.
</video>
*/
fprintf (Gbl.F.Out,"<video controls=\"controls\" class=\"%s\"",ClassMedia);
if (Media->Title)
if (Media->Title[0])
fprintf (Gbl.F.Out," title=\"%s\"",Media->Title);
fprintf (Gbl.F.Out," lazyload=\"on\">"); // Lazy load of the media
fprintf (Gbl.F.Out,"<source src=\"%s\" type=\"video/mp4\">"
"Your browser does not support HTML5 video."
"</video>",
URL_Video);
}
else
fprintf (Gbl.F.Out,"%s",Txt_File_not_found);
}
/*****************************************************************************/
@ -1074,24 +1214,34 @@ void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type)
case Med_JPG:
/***** Remove private JPG file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.jpg",
PathMedPriv,Name);
"%s/%s.%s",
PathMedPriv,Name,Med_Extensions[Med_JPG]);
unlink (FullPathMediaPriv);
break;
case Med_GIF:
/***** Remove private GIF file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.gif",
PathMedPriv,Name);
"%s/%s.%s",
PathMedPriv,Name,Med_Extensions[Med_GIF]);
unlink (FullPathMediaPriv);
/***** Remove private PNG file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s//%s.png",
"%s/%s.png",
PathMedPriv,Name);
unlink (FullPathMediaPriv);
break;
case Med_MP4:
case Med_WEBM:
case Med_OGG:
/***** Remove private video file *****/
snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv),
"%s/%s.%s",
PathMedPriv,Name,Med_Extensions[Type]);
unlink (FullPathMediaPriv);
break;
case Med_NONE:
Lay_ShowErrorAndExit ("Wrong media type.");
@ -1123,19 +1273,56 @@ Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
/************************ Get media type from extension **********************/
/*****************************************************************************/
static Med_Type_t Med_GetTypeFromExtension (const char *Extension)
static Med_Type_t Med_GetTypeFromExtAndMIME (const char *Extension,
const char *MIMEType)
{
/***** Extensions allowed to convert to JPG *****/
if (!strcasecmp (Extension,"jpg"))
return Med_JPG;
if (!strcasecmp (Extension,"jpeg"))
return Med_JPG;
if (!strcasecmp (Extension,"png"))
return Med_JPG;
/***** Extensions and MIME types allowed to convert to JPG *****/
if (!strcasecmp (Extension,"jpg" ) ||
!strcasecmp (Extension,"jpeg") ||
!strcasecmp (Extension,"png" ) ||
!strcasecmp (Extension,"tif" ) ||
!strcasecmp (Extension,"tiff"))
if (!strcmp (MIMEType,"image/jpeg" ) ||
!strcmp (MIMEType,"image/pjpeg" ) ||
!strcmp (MIMEType,"image/png" ) ||
!strcmp (MIMEType,"image/x-png" ) ||
!strcmp (MIMEType,"image/tiff" ) ||
!strcmp (MIMEType,"application/octet-stream") ||
!strcmp (MIMEType,"application/octetstream" ) ||
!strcmp (MIMEType,"application/octet" ))
return Med_JPG;
/***** Extensions allowed to convert to GIF *****/
/***** Extensions and MIME types allowed to convert to GIF *****/
if (!strcasecmp (Extension,"gif"))
return Med_GIF;
if (!strcmp (MIMEType,"image/gif" ) ||
!strcmp (MIMEType,"application/octet-stream") ||
!strcmp (MIMEType,"application/octetstream" ) ||
!strcmp (MIMEType,"application/octet" ))
return Med_GIF;
/***** Extensions and MIME types allowed to convert to MP4 *****/
if (!strcasecmp (Extension,"mp4"))
if (!strcmp (MIMEType,"video/mp4" ) ||
!strcmp (MIMEType,"application/octet-stream") ||
!strcmp (MIMEType,"application/octetstream" ) ||
!strcmp (MIMEType,"application/octet" ))
return Med_MP4;
/***** Extensions and MIME types allowed to convert to WEBM *****/
if (!strcasecmp (Extension,"webm"))
if (!strcmp (MIMEType,"video/webm" ) ||
!strcmp (MIMEType,"application/octet-stream") ||
!strcmp (MIMEType,"application/octetstream" ) ||
!strcmp (MIMEType,"application/octet" ))
return Med_WEBM;
/***** Extensions and MIME types allowed to convert to OGG *****/
if (!strcasecmp (Extension,"ogg"))
if (!strcmp (MIMEType,"video/ogg" ) ||
!strcmp (MIMEType,"application/octet-stream") ||
!strcmp (MIMEType,"application/octetstream" ) ||
!strcmp (MIMEType,"application/octet" ))
return Med_OGG;
return Med_NONE;
}

View File

@ -88,12 +88,15 @@ typedef enum
Med_NAME_STORED_IN_DB,
} Med_FileStatus_t;
#define Med_NUM_TYPES 3
#define Med_NUM_TYPES 6
typedef enum
{
Med_NONE,
Med_JPG,
Med_GIF,
Med_MP4,
Med_WEBM,
Med_OGG,
} Med_Type_t;
/***** Struct used to get images/videos from forms *****/

View File

@ -11584,7 +11584,7 @@ const char *Txt_Figures =
const char *Txt_File =
#if L==1 // ca
"Fitxer";
"Arxiu";
#elif L==2 // de
"Datei";
#elif L==3 // en
@ -11605,7 +11605,7 @@ const char *Txt_File =
const char *Txt_file =
#if L==1 // ca
"fitxer";
"arxiu";
#elif L==2 // de
"Datei";
#elif L==3 // en
@ -11626,7 +11626,7 @@ const char *Txt_file =
const char *Txt_X_file = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Fitxer %s";
"Arxiu %s";
#elif L==2 // de
"%s-Datei";
#elif L==3 // en
@ -11645,6 +11645,27 @@ const char *Txt_X_file = // Warning: it is very important to include %s in the f
"Arquivo %s";
#endif
const char *Txt_File_not_found =
#if L==1 // ca
"Arxiu no trobat";
#elif L==2 // de
"Datei nicht gefunden";
#elif L==3 // en
"File not found";
#elif L==4 // es
"Archivo no encontrado";
#elif L==5 // fr
"Fichier non trouv&eacute;";
#elif L==6 // gn
"Archivo no encontrado"; // Okoteve traducción
#elif L==7 // it
"File non trovato";
#elif L==8 // pl
"Nie znaleziono pliku";
#elif L==9 // pt
"Arquivo n&atilde;o encontrado";
#endif
const char *Txt_FILE_uncompressed =
#if L==1 // ca
"sense comprimir";
@ -11668,7 +11689,7 @@ const char *Txt_FILE_uncompressed =
const char *Txt_Filename =
#if L==1 // ca
"Nom del fitxer";
"Nom del arxiu";
#elif L==2 // de
"Dateiname";
#elif L==3 // en
@ -11689,7 +11710,7 @@ const char *Txt_Filename =
const char *Txt_file_folder =
#if L==1 // ca
"fitxer/carpeta";
"arxiu/carpeta";
#elif L==2 // de
"Datei/Verzeichnis";
#elif L==3 // en
@ -15357,27 +15378,6 @@ const char *Txt_Image_title_attribution =
"T&iacute;tulo/atribui&ccedil;&atilde;o da imagem";
#endif
const char *Txt_Image_not_found =
#if L==1 // ca
"Imatge no trobat";
#elif L==2 // de
"Abbild nicht gefunden";
#elif L==3 // en
"Image not found";
#elif L==4 // es
"Imagen no encontrada";
#elif L==5 // fr
"Image non trouv&eacute;e";
#elif L==6 // gn
"Ta'&atilde;nga nah&aacute;niri juhupapyre";
#elif L==7 // it
"Immagine non trovata";
#elif L==8 // pl
"Obraz nie znaleziono";
#elif L==9 // pt
"Imagem n&atilde;o encontrada";
#endif
const char *Txt_Import_questions =
#if L==1 // ca
"Importa preguntes";
@ -43899,6 +43899,27 @@ const char *Txt_The_event_has_been_modified =
"O evento foi modificado.";
#endif
const char *Txt_The_file_could_not_be_processed_successfully =
#if L==1 // ca
"El fitxer no s'ha pogut processar correctament.";
#elif L==2 // de
"Die Datei konnte nicht erfolgreich verarbeitet werden.";
#elif L==3 // en
"The file could not be processed successfully.";
#elif L==4 // es
"El archivo no ha podido procesarse correctamente.";
#elif L==5 // fr
"Le fichier n'a pas pu &ecirc;tre trait&eacute; avec succ&egrave;s.";
#elif L==6 // gn
"El archivo no ha podido procesarse correctamente."; // Okoteve traducción
#elif L==7 // it
"Il file non pu&ograve; essere elaborato con successo.";
#elif L==8 // pl
"Plik nie m&oacute;g&lstrok; zosta&cacute; pomy&sacute;lnie przetworzony.";
#elif L==9 // pt
"O arquivo n&atilde;o p&ocirc;de ser processado com sucesso.";
#endif
const char *Txt_The_file_X_has_been_placed_inside_the_folder_Y = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"El archivo <strong>%s</strong> se ha almacenado"
@ -44523,27 +44544,6 @@ const char *Txt_The_ID_X_matches_one_of_the_existing = // Warning: it is very im
" corresponde a um dos existentes.";
#endif
const char *Txt_The_image_could_not_be_processed_successfully =
#if L==1 // ca
"La imatge no s'ha pogut processar correctament.";
#elif L==2 // de
"Das Bild konnte nicht erfolgreich verarbeitet werden.";
#elif L==3 // en
"The image could not be processed successfully.";
#elif L==4 // es
"La imagen no ha podido procesarse correctamente.";
#elif L==5 // fr
"L'image n'a pas pu &ecirc;tre trait&eacute;e avec succ&egrave;s.";
#elif L==6 // gn
"La imagen no ha podido procesarse correctamente."; // Okoteve traducción
#elif L==7 // it
"L'immagine non pu&ograve; essere elaborata con successo.";
#elif L==8 // pl
"Obraz nie m&oacute;g&lstrok; zosta&cacute; pomy&sacute;lnie przetworzony.";
#elif L==9 // pt
"A imagem n&atilde;o p&ocirc;de ser processada com sucesso.";
#endif
const char *Txt_The_institution_X_already_exists = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La instituci&oacute;n <strong>%s</strong> ya existe."; // Necessita traduccio
@ -46464,33 +46464,33 @@ const char *Txt_The_session_has_expired =
"A sess&atilde;o expirou.";
#endif
const char *Txt_The_size_of_the_GIF_file_exceeds_the_maximum_allowed_X = // Warning: it is very important to include %s in the following sentences
const char *Txt_The_size_of_the_file_exceeds_the_maximum_allowed_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"La mida del fitxer <em>GIF</em>"
"La mida del fitxer"
" supera el m&agrave;xim perm&egrave;s (%s).";
#elif L==2 // de
"Die Gr&ouml;&szlig;e der <em>GIF</em>-Datei"
"Die Gr&ouml;&szlig;e der Datei"
" &uuml;berschreitet den zul&auml;ssigen H&ouml;chstwert (%s).";
#elif L==3 // en
"The size of the <em>GIF</em> file"
"The size of the file"
" exceeds the maximum allowed (%s).";
#elif L==4 // es
"El tama&ntilde;o del archivo <em>GIF</em>"
"El tama&ntilde;o del archivo"
" excede el m&aacute;ximo permitido (%s).";
#elif L==5 // fr
"La taille du fichier <em>GIF</em>"
"La taille du fichier"
" d&eacute;passe le maximum autoris&eacute; (%s).";
#elif L==6 // gn
"El tama&ntilde;o del archivo <em>GIF</em>"
"El tama&ntilde;o del archivo"
" excede el m&aacute;ximo permitido (%s)."; // Okoteve traducción
#elif L==7 // it
"La dimensione del file <em>GIF</em>"
"La dimensione del file"
" supera il massimo consentito (%s).";
#elif L==8 // pl
"Rozmiar pliku <em>GIF</em>"
"Rozmiar pliku"
" przekracza maksymalne dozwolone (%s).";
#elif L==9 // pt
"O tamanho do arquivo <em>GIF</em>"
"O tamanho do arquivo"
" excede o m&aacute;ximo permitido (%s).";
#endif