mirror of https://github.com/acanas/swad-core.git
Version18.76
This commit is contained in:
parent
a12f4ed5ce
commit
4e93b5ef19
14
sql/swad.sql
14
sql/swad.sql
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
162
swad_database.c
162
swad_database.c
|
@ -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,"
|
||||
|
|
323
swad_media.c
323
swad_media.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 *****/
|
||||
|
|
114
swad_text.c
114
swad_text.c
|
@ -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é";
|
||||
#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ã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ítulo/atribuiçã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ée";
|
||||
#elif L==6 // gn
|
||||
"Ta'ãnga nahániri juhupapyre";
|
||||
#elif L==7 // it
|
||||
"Immagine non trovata";
|
||||
#elif L==8 // pl
|
||||
"Obraz nie znaleziono";
|
||||
#elif L==9 // pt
|
||||
"Imagem nã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 être traité avec succès.";
|
||||
#elif L==6 // gn
|
||||
"El archivo no ha podido procesarse correctamente."; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"Il file non può essere elaborato con successo.";
|
||||
#elif L==8 // pl
|
||||
"Plik nie mógł zostać pomyślnie przetworzony.";
|
||||
#elif L==9 // pt
|
||||
"O arquivo não pô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 être traitée avec succès.";
|
||||
#elif L==6 // gn
|
||||
"La imagen no ha podido procesarse correctamente."; // Okoteve traducción
|
||||
#elif L==7 // it
|
||||
"L'immagine non può essere elaborata con successo.";
|
||||
#elif L==8 // pl
|
||||
"Obraz nie mógł zostać pomyślnie przetworzony.";
|
||||
#elif L==9 // pt
|
||||
"A imagem não pô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ón <strong>%s</strong> ya existe."; // Necessita traduccio
|
||||
|
@ -46464,33 +46464,33 @@ const char *Txt_The_session_has_expired =
|
|||
"A sessã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àxim permès (%s).";
|
||||
#elif L==2 // de
|
||||
"Die Größe der <em>GIF</em>-Datei"
|
||||
"Die Größe der Datei"
|
||||
" überschreitet den zulässigen Hö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ño del archivo <em>GIF</em>"
|
||||
"El tamaño del archivo"
|
||||
" excede el máximo permitido (%s).";
|
||||
#elif L==5 // fr
|
||||
"La taille du fichier <em>GIF</em>"
|
||||
"La taille du fichier"
|
||||
" dépasse le maximum autorisé (%s).";
|
||||
#elif L==6 // gn
|
||||
"El tamaño del archivo <em>GIF</em>"
|
||||
"El tamaño del archivo"
|
||||
" excede el má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áximo permitido (%s).";
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue