이윤영

Add two menu

......@@ -4,8 +4,10 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<compositeConfiguration>
<compositeBuild compositeDefinitionSource="SCRIPT" />
</compositeConfiguration>
<option name="delegatedBuild" value="false" />
<option name="testRunner" value="PLATFORM" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
......@@ -15,6 +17,7 @@
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
<option name="testRunner" value="PLATFORM" />
</GradleProjectSettings>
</option>
</component>
......
......@@ -36,6 +36,7 @@ public class DBHelper {
db.execSQL(Databases.CreateDB_AppUsage_WEEK._CREATE_AppUsage_WEEK);
db.execSQL(Databases.CreateDB_AppUsage_DAY._CREATE_AppUsage_DAY);
db.execSQL(Databases.CreateDB_PhoneInfo._CREATE_PhoneInfo);
db.execSQL(Databases.CreateDB_Document._CREATE_Document);
db.execSQL(CallLogDataBase.CreateDB._CREATE0);
db.execSQL(ContactDataBase.CreateDB._CREATE0);
......@@ -57,6 +58,7 @@ public class DBHelper {
db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_WEEK.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_DAY.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_PhoneInfo.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_Document.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + CallLogDataBase.CreateDB._TABLENAME0);
db.execSQL("DROP TABLE IF EXISTS " + ContactDataBase.CreateDB._TABLENAME0);
......@@ -81,7 +83,7 @@ public class DBHelper {
}
public long insertPColumn(String title, int id, String date_added, String display_name
, String mime_type, String path, String latitude, String longitude){
, String mime_type, String path, String latitude, String longitude, String size){
ContentValues values = new ContentValues();
values.put(PhotoDataBase.CreateDB.TITLE, title);
values.put(PhotoDataBase.CreateDB.ID, id);
......@@ -91,12 +93,13 @@ public class DBHelper {
values.put(PhotoDataBase.CreateDB.PATH, path);
values.put(PhotoDataBase.CreateDB.LATITUDE, latitude);
values.put(PhotoDataBase.CreateDB.LONGITUDE, longitude);
values.put(PhotoDataBase.CreateDB.SIZE, size);
return mDB.insert(PhotoDataBase.CreateDB._TABLENAME0, null, values);
}
public long insertVColumn(String title, String date_added, String display_name, String mime_type
, String path, String latitude, String longitude, String album, String artist, String bookmark
,String category, String description, String language, String resolution, String tags){
,String category, String description, String language, String resolution, String tags, String size){
ContentValues values = new ContentValues();
values.put(VideoDataBase.CreateDB.TITLE, title);
values.put(VideoDataBase.CreateDB.DATE_ADDED, date_added);
......@@ -113,6 +116,7 @@ public class DBHelper {
values.put(VideoDataBase.CreateDB.LANGUAGE, language);
values.put(VideoDataBase.CreateDB.RESOLUTION, resolution);
values.put(VideoDataBase.CreateDB.TAGS, tags);
values.put(VideoDataBase.CreateDB.SIZE, size);
return mDB.insert(VideoDataBase.CreateDB._TABLENAME0, null, values);
}
......@@ -167,9 +171,9 @@ public class DBHelper {
values.put(Databases.CreateDB_App.CELLULARUSAGE, cellularbytes);
db.insert(Databases.CreateDB_App.TABLE_NAME, null, values);
Log.d("LogTest","addAppUsage");
//Log.d("LogTest","addAppUsage");
Log.d("LogTest", String.valueOf(cellularbytes));
//Log.d("LogTest", String.valueOf(cellularbytes));
}
public void addAccountInfo(String accountname, String accounttype) {
SQLiteDatabase db = mDBHelper.getWritableDatabase();
......@@ -177,7 +181,21 @@ public class DBHelper {
values.put(Databases.CreateDB_AccountInfo.ACCOUNTNAME, accountname);
values.put(Databases.CreateDB_AccountInfo.ACCOUNTTYPE, accounttype);
db.insert(Databases.CreateDB_AccountInfo.TABLE_NAME, null, values);
Log.d("LogTest","addAccountInfo");
//Log.d("LogTest","addAccountInfo");
}
public void addDocumentInfo(String name, String title, long date_added, long date_modified, String mime_type, String path, String size) {
SQLiteDatabase db = mDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(Databases.CreateDB_Document.NAME, name);
values.put(Databases.CreateDB_Document.TITLE, title);
values.put(Databases.CreateDB_Document.DATE_ADDED, date_added);
values.put(Databases.CreateDB_Document.DATE_MODIFIED, date_modified);
values.put(Databases.CreateDB_Document.MIME_TYPE, mime_type);
values.put(Databases.CreateDB_Document.PATH, path);
values.put(Databases.CreateDB_Document.SIZE, size);
db.insert(Databases.CreateDB_Document.TABLE_NAME, null, values);
//Log.d("LogTest","addAccountInfo");
}
public void addAppUsage_YEAR(String packageName, long firsttimestamp, long lasttimestamp,
......@@ -190,7 +208,7 @@ public class DBHelper {
values.put(Databases.CreateDB_AppUsage_YEAR.LASTTIMEUSED, lasttimeused);
values.put(Databases.CreateDB_AppUsage_YEAR.TOTALTIMEFOREGROUND, totaltimeforeground);
db.insert(Databases.CreateDB_AppUsage_YEAR.TABLE_NAME, null, values);
Log.d("LogTest","addAppUsageYear");
//Log.d("LogTest","addAppUsageYear");
}
public void addAppUsage_MONTH(String packageName, long firsttimestamp, long lasttimestamp,
......@@ -203,7 +221,7 @@ public class DBHelper {
values.put(Databases.CreateDB_AppUsage_MONTH.LASTTIMEUSED, lasttimeused);
values.put(Databases.CreateDB_AppUsage_MONTH.TOTALTIMEFOREGROUND, totaltimeforeground);
db.insert(Databases.CreateDB_AppUsage_MONTH.TABLE_NAME, null, values);
Log.d("LogTest","addAppUsageMonth");
//Log.d("LogTest","addAppUsageMonth");
}
public void addAppUsage_WEEK(String packageName, long firsttimestamp, long lasttimestamp,
......@@ -216,7 +234,7 @@ public class DBHelper {
values.put(Databases.CreateDB_AppUsage_WEEK.LASTTIMEUSED, lasttimeused);
values.put(Databases.CreateDB_AppUsage_WEEK.TOTALTIMEFOREGROUND, totaltimeforeground);
db.insert(Databases.CreateDB_AppUsage_WEEK.TABLE_NAME, null, values);
Log.d("LogTest","addAppUsageWeek");
//Log.d("LogTest","addAppUsageWeek");
}
public void addAppUsage_DAY(String packageName, long firsttimestamp, long lasttimestamp,
......
......@@ -8,6 +8,24 @@ import java.lang.reflect.Field;
public final class Databases {
private Databases() {}
public static final class CreateDB_Document implements BaseColumns {
public static final String TABLE_NAME = "DocumentInfo";
public static final String NAME = "name";
public static final String TITLE = "title";
public static final String DATE_ADDED = "date_added";
public static final String DATE_MODIFIED = "date_modified";
public static final String MIME_TYPE = "mime_type";
public static final String PATH = "path";
public static final String SIZE = "size";
public static final String _CREATE_Document = "create table if not exists "+TABLE_NAME+"("
+NAME+" text not null primary key, "
+TITLE+" text not null , "
+MIME_TYPE+" text not null , "
+DATE_ADDED+" timestamp not null , "
+DATE_MODIFIED+" timestamp not null , "
+PATH+" text not null , "
+SIZE+" text not null);";
}
public static final class CreateDB_App implements BaseColumns {
public static final String TABLE_NAME = "AppInfo";
......
......@@ -25,6 +25,7 @@ import android.net.Uri;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.CalendarContract;
import android.provider.CallLog;
......@@ -34,10 +35,13 @@ import android.provider.Telephony;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.net.InetAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import androidx.core.content.ContextCompat;
......@@ -64,11 +68,13 @@ public class LoadingActivity extends Activity {
setContentView(R.layout.activity_loading);
try {
socket = IO.socket("http://172.30.1.40:3000/");
socket = IO.socket("http://192.168.0.8:3000/");
socket.connect();
Log.i("SOCKET", "Connected");
}catch(Exception e){
e.printStackTrace();
Log.i("SOCKET", "Not Connected");
}
startLoading();
......@@ -84,54 +90,108 @@ public class LoadingActivity extends Activity {
getPhoto();
alert("alert","photo");
Log.i("MYLOG", "DB HY Part:1/13");
Log.i("MYLOG", "DB HY Part:1/14");
getVideo();
alert("alert","video");
Log.i("MYLOG", "DB HY Part:2/13");
Log.i("MYLOG", "DB HY Part:2/14");
getAudio();
alert("alert","audio");
Log.i("MYLOG", "DB HY Part:3/13");
Log.i("MYLOG", "DB HY Part:3/14");
getCalendarInfo();
alert("alert","calendar");
Log.i("MYLOG", "DB HY Part:4/13");
Log.i("MYLOG", "DB HY Part:4/14");
getNetworkInfo();
alert("alert","network");
Log.i("MYLOG", "DB HY Part:5/13");
Log.i("MYLOG", "DB HY Part:5/14");
getCallLog();
alert("alert","calllog");
Log.i("MYLOG", "DB YM Part:6/13");
Log.i("MYLOG", "DB YM Part:6/14");
getContact();
alert("alert","contact");
Log.i("MYLOG", "DB YM Part:7/13");
Log.i("MYLOG", "DB YM Part:7/14");
getSMSMessage();
alert("alert","sms");
Log.i("MYLOG", "DB YM Part:8/13");
Log.i("MYLOG", "DB YM Part:8/14");
getWIFI();
alert("alert","wifi");
Log.i("MYLOG", "DB YM Part:9/13");
Log.i("MYLOG", "DB YM Part:9/14");
getPhoneInfo();
alert("alert","phoneinfo");
Log.i("MYLOG", "DB YY Part:10/13");
Log.i("MYLOG", "DB YY Part:10/14");
getAccountInfo();
alert("alert","accountinfo");
Log.i("MYLOG", "DB YY Part:11/13");
Log.i("MYLOG", "DB YY Part:11/14");
getAppInfo();
alert("alert","appinfo");
Log.i("MYLOG", "DB YY Part:12/13");
Log.i("MYLOG", "DB YY Part:12/14");
getUsageStats();
alert("alert","usagestats");
Log.i("MYLOG", "DB YY Part:13/13");
Log.i("MYLOG", "DB YY Part:13/14");
getDocument();
Log.i("MYLOG", "DB YY Part:14/14");
dbHelper.close();
finish();
alert("end", "end");
}
}, 2000);
}
public void getDocument() {
String[] projection = {
MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.MIME_TYPE,
MediaStore.Files.FileColumns.DATE_ADDED,
MediaStore.Files.FileColumns.DATE_MODIFIED,
MediaStore.Files.FileColumns.DISPLAY_NAME,
MediaStore.Files.FileColumns.TITLE,
MediaStore.Files.FileColumns.SIZE,
MediaStore.Files.FileColumns.DATA
};
String mimeType = "application/pdf";
String whereClause = MediaStore.Files.FileColumns.MIME_TYPE + " IN ('" + mimeType + "')"
+ " OR " + MediaStore.Files.FileColumns.MIME_TYPE + " LIKE 'application/vnd%'";
String orderBy = MediaStore.Files.FileColumns.SIZE + " DESC";
Cursor cursor = getContentResolver().query(MediaStore.Files.getContentUri("external"),
projection,
whereClause,
null,
orderBy);
int idCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID);
int mimeCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE);
int addedCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_ADDED);
int modifiedCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED);
int nameCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DISPLAY_NAME);
int titleCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.TITLE);
int sizeCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE);
int dataCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
if (cursor.moveToFirst()) {
do {
//Uri fileUri = Uri.withAppendedPath(MediaStore.Files.getContentUri("external"), cursor.getString(idCol));
String mime = cursor.getString(mimeCol);
long dateAdded = cursor.getLong(addedCol);
long dateModified = cursor.getLong(modifiedCol);
String name = cursor.getString(nameCol);
String title = cursor.getString(titleCol);
long size = cursor.getLong(sizeCol);
String path = cursor.getString(dataCol);
Log.i("documents", mime + ", " + dateAdded + ", " + dateModified + ", " + name + ", " + title + ", " + size + ", " + path);
dbHelper.addDocumentInfo(cursor.getString(nameCol), cursor.getString(titleCol), cursor.getLong(addedCol)
, cursor.getLong(modifiedCol), cursor.getString(mimeCol), cursor.getString(dataCol),String.valueOf(cursor.getLong(sizeCol)));
} while (cursor.moveToNext());
}
}
public void getPhoto() {
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
......@@ -159,9 +219,13 @@ public class LoadingActivity extends Activity {
photo.setLatitude(cursor.getString(6));
photo.setLongitude(cursor.getString(7));
File f = new File(cursor.getString(5));
long size = f.length();
dbHelper.insertPColumn(photo.getTitle(), photo.getId(), photo.getDate()
, photo.getDisplayName(), photo.getType(), photo.getPath()
, photo.getLatitude(), photo.getLongitude());
, photo.getLatitude(), photo.getLongitude(),String.valueOf(size));
}
}
......@@ -208,10 +272,13 @@ public class LoadingActivity extends Activity {
video.setMIME_type(cursor.getString(13));
video.setTitle(cursor.getString(14));
File f = new File(cursor.getString(9));
long size = f.length();
dbHelper.insertVColumn(video.getTitle(), video.getDate_added(), video.getDisplay_Name()
, video.getMIME_type(), video.getPath(), video.getLatitude(), video.getLongitude()
, video.getAlbum(), video.getArtist(), video.getBookmark(), video.getCategory()
, video.getDescription(), video.getLanguage(), video.getResolution(), video.getTags());
, video.getDescription(), video.getLanguage(), video.getResolution(), video.getTags(), String.valueOf(size));
}
}
......@@ -547,8 +614,8 @@ public class LoadingActivity extends Activity {
for (UsageStats usagestat : queryUsageStats) {
dbHelper.addAppUsage_WEEK(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground());
}
queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, System.currentTimeMillis());
queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0,
System.currentTimeMillis());
for (UsageStats usagestat : queryUsageStats) {
dbHelper.addAppUsage_DAY(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground());
}
......
......@@ -12,6 +12,7 @@ public final class PhotoDataBase {
public static final String PATH = "path";
public static final String LATITUDE = "latitude";
public static final String LONGITUDE = "longitude";
public static final String SIZE = "size";
public static final String _TABLENAME0 = "photo";
public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
+TITLE+" text not null primary key, "
......@@ -21,6 +22,7 @@ public final class PhotoDataBase {
+MIME_TYPE + " text not null,"
+PATH + " text not null,"
+LATITUDE + " text,"
+LONGITUDE + " text);";
+LONGITUDE + " text,"
+SIZE + " text);";
}
}
......
......@@ -19,6 +19,7 @@ public final class VideoDataBase {
public static final String DISPLAY_NAME = "display_name";
public static final String MIME_TYPE = "mime_type";
public static final String TITLE = "title";
public static final String SIZE = "size";
public static final String _TABLENAME0 = "video";
public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
+TITLE+" text not null primary key, "
......@@ -35,6 +36,7 @@ public final class VideoDataBase {
+DESCRIPTION + " text, "
+LANGUAGE +" text, "
+RESOLUTION + " text, "
+TAGS + " text);";
+TAGS + " text, "
+SIZE+" text);";
}
}
......
1
com.example.dataextraction
1
29
0
1
308201dd30820146020101300d06092a864886f70d010105050030373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b3009060355040613025553301e170d3138303930363130323134335a170d3438303832393130323134335a30373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b300906035504061302555330819f300d06092a864886f70d010101050003818d0030818902818100a6596a004a40dadfa9657fa99b49f80ae526fce07b27a97f61c2e43a53992b293743cf04277293e52c4ae6991f4d83cf43a8f94420da00836361a34cab6c82b99a8b4f54e4c29f425e05319884f1ef7fdedfd94fc315ff677b9c0e0c1bf438f200bd3ff70f610a0b5c735e4988850501e6386a54f306155e9c871c25b59de63d0203010001300d06092a864886f70d0101050500038181009967d07dc0402f932c6c7d6125165068feb0eb5d494ed3c74cba0bd09ad9c2a2f8faf12cf0341849dd622de0d23562f284fecca507e39f1f5983d6383b8cd2b0a1b9d007fcd0adf3fa51542639392e58b6438482ba0b543372cfc4363706bfbf7cc80120e28ad374893d9cd3b7a43a5fee221f7337d489c24b33f901f5e4477f
.menu-header{
line-height: 1;
}
.title-name {
font-family: 'Born Ready Slanted';
font-size: 40px;
}
.title-detail {
font-family: '나눔바른고딕';
font-size: 18px;
}
.title-back {
font-family: '나눔바른고딕';
font-size: 15px;
}
.nav-color{
background-color: #4e73df;
}
.font-nanum{
font-family: '나눔바른고딕';
}
#table {
font-family: "나눔바른고딕";
border-collapse: collapse;
width: 100%;
font-size: 10px;
}
#table td, #table th {
border: 1px solid #ddd;
padding: 8px;
}
#table tr:nth-child(even){background-color: #f2f2f2;}
#table tr:hover {background-color: #ddd;}
#table th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #9db5fc;
color: black;
}
\ No newline at end of file
......@@ -17,7 +17,7 @@
#div_con2{
background-color:beige;
width:29%;
height:600px;
height:825px;
float:left;
text-align : left;
}
......@@ -92,4 +92,18 @@ h4{
#btn_group button:hover{
color:white;
background-color: skyblue;
}
#btn_another button{
border: 1px hidden black;
background-color: skyblue;
color: white;
padding: 50px;
display: table;
margin-left: auto;
margin-right: auto;
margin-top: 10%;
}
#btn_another button:hover{
color:black;
background-color: rgba(0,0,0,0);
}
\ No newline at end of file
......
.menu-header{
line-height: 1;
}
.title-name {
font-family: 'Born Ready Slanted';
font-size: 40px;
}
.title-detail {
font-family: '나눔바른고딕';
font-size: 18px;
}
.title-back {
font-family: '나눔바른고딕';
font-size: 15px;
}
.nav-color{
background-color: #4e73df;
}
.font-nanum{
font-family: '나눔바른고딕';
}
.sort{
font-family: '나눔바른고딕';
font-size: 10px;
}
.filetype{
font-family: '나눔바른고딕';
font-size: 13px;
}
.media:hover {background-color: #ddd;}
.table {
font-family: "나눔바른고딕", Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
.table td, #table th {
border: 1px solid #ddd;
padding: 8px;
}
.table tr:nth-child(even){background-color: #f2f2f2;}
.table tr:hover {background-color: #ddd;}
.table th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #5782ff;
color: white;
}
\ No newline at end of file
......@@ -2,6 +2,12 @@ const { app, BrowserWindow, ipcMain, dialog } = require('electron')
const path = require('path')
const url = require('url')
const vision = require('@google-cloud/vision');
var exec = require('child_process').exec, child;
// Imports the Google Cloud Video Intelligence library + Node's fs library
const video = require('@google-cloud/video-intelligence').v1;
const fs = require('fs');
const util = require('util');
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
......@@ -119,7 +125,211 @@ ipcMain.on("device-name", (e, arg) => {
var content = {path : path, name : name, labels : labels}
label_result.push(content);
}
var video_label_result = new Array();
var video_detect_result = new Array();
ipcMain.on("video-analysis", async (e, arg) => {
console.log(arg + "from menu_media");
video_label_result = [];
video_detect_result = [];
await Promise.all(arg.map(async (value)=>{
// await copy_file(value);
// setTimeout(function() { }, 10000);
await get_content_detection(value);
// await get_videolabels(value);
}))
await Promise.all(arg.map(async (value)=>{
// await copy_file(value);
// setTimeout(function() { }, 10000);
//await get_content_detection(value);
await get_videolabels(value);
}))
var video_analysis_result = [video_label_result,video_detect_result];
console.log(video_analysis_result);
win.webContents.send("getvideodetail", video_analysis_result);
//win.webContents.send("getvideodetail", [temp_label,temp_detect]);
});
function checkandcopy(arg){
return new Promise(function(resolve, reject){
setTimeout(function(){
for(var i=0; i < arg.length; i++){
cmd_pull = exec('adb pull '+arg[i]);
}
resolve(true);
}, 1000)
})
}
async function copy_file(path){
return new Promise(function(resolve, reject){
setTimeout(function(){
cmd_pull = exec('adb pull '+path,function(error, stdout, stderr){
if(error){
console.log(error);
}
});
resolve(true);
}, 1000)
})
}
function send_labels_to_menu_media(event){
win.webContents.send("getvideodetail", 'response message');
}
async function get_videolabels(path){
var video_name = path.split('/');
video_name = video_name[video_name.length-1];
// Creates a client
const client = new video.VideoIntelligenceServiceClient();
var video_path = __dirname+'\\' + video_name;
var temp = video_path.split('\\');
var beforeslice = '';
for(var i = 0; i < temp.length; i++){
beforeslice += temp[i] + '/';
}
const vpath = beforeslice.slice(0,-1);
console.log(vpath);
// Reads a local video file and converts it to base64
const readFile = util.promisify(fs.readFile);
const file = await readFile(vpath);
const inputContent = file.toString('base64');
console.log("video convert");
// Constructs request
const request = {
inputContent: inputContent,
features: ['LABEL_DETECTION'],
};
// Detects labels in a video
const [operation] = await client.annotateVideo(request);
console.log('Waiting for operation to complete...');
const [operationResult] = await operation.promise();
// Gets annotations for video
const annotations = operationResult.annotationResults[0];
const labels = annotations.segmentLabelAnnotations;
console.log(labels);
var content = {video : video_name,labels : []}
labels.forEach(label => {
console.log(`Label ${label.entity.description} occurs at:`);
content['labels'].push(label.entity.description);
content[label.entity.description] = [];
label.segments.forEach(segment => {
const time = segment.segment;
if (time.startTimeOffset.seconds === undefined) {
time.startTimeOffset.seconds = 0;
}
if (time.startTimeOffset.nanos === undefined) {
time.startTimeOffset.nanos = 0;
}
if (time.endTimeOffset.seconds === undefined) {
time.endTimeOffset.seconds = 0;
}
if (time.endTimeOffset.nanos === undefined) {
time.endTimeOffset.nanos = 0;
}
console.log(
`\tStart: ${time.startTimeOffset.seconds}` +
`.${(time.startTimeOffset.nanos / 1e6).toFixed(0)}s`
);
console.log(
`\tEnd: ${time.endTimeOffset.seconds}.` +
`${(time.endTimeOffset.nanos / 1e6).toFixed(0)}s`
);
console.log(`\tConfidence: ${segment.confidence}`);
var temp = [time.startTimeOffset.seconds + '.' + (time.startTimeOffset.nanos / 1e6).toFixed(0),
time.endTimeOffset.seconds + '.' + (time.endTimeOffset.nanos / 1e6).toFixed(0),
segment.confidence];
content[label.entity.description].push(temp);
});
});
console.log(content);
video_label_result.push(content);
}
async function get_content_detection(path){
var video_name = path.split('/');
video_name = video_name[video_name.length-1];
// Creates a client
const client = new video.VideoIntelligenceServiceClient();
var video_path = __dirname+'\\' + video_name;
var temp = video_path.split('\\');
var beforeslice = '';
for(var i = 0; i < temp.length; i++){
beforeslice += temp[i] + '/';
}
const vpath = beforeslice.slice(0,-1);
console.log(vpath);
// Reads a local video file and converts it to base64
const readFile = util.promisify(fs.readFile);
const file = await readFile(vpath);
const inputContent = file.toString('base64');
console.log("video convert");
const request = {
inputContent: inputContent,
features: ['EXPLICIT_CONTENT_DETECTION'],
};
// Human-readable likelihoods
const likelihoods = [
'UNKNOWN',
'VERY_UNLIKELY',
'UNLIKELY',
'POSSIBLE',
'LIKELY',
'VERY_LIKELY',
];
// Detects unsafe content
const [opertaion] = await client.annotateVideo(request);
console.log('Waiting for operation to complete...');
const [operationResult] = await opertaion.promise();
// Gets unsafe content
const explicitContentResults =
operationResult.annotationResults[0].explicitAnnotation;
console.log('Explicit annotation results:');
var content = {video : video_name, likelihood : []}
explicitContentResults.frames.forEach(result => {
if (result.timeOffset === undefined) {
result.timeOffset = {};
}
if (result.timeOffset.seconds === undefined) {
result.timeOffset.seconds = 0;
}
if (result.timeOffset.nanos === undefined) {
result.timeOffset.nanos = 0;
}
console.log(
`\tTime: ${result.timeOffset.seconds}` +
`.${(result.timeOffset.nanos / 1e6).toFixed(0)}s`
);
console.log(
`\t\tPornography likelihood: ${likelihoods[result.pornographyLikelihood]}`
);
var temp = [result.timeOffset.seconds + '.' + (result.timeOffset.nanos / 1e6).toFixed(0),
likelihoods[result.pornographyLikelihood]];
content['likelihood'].push(temp);
});
console.log(content);
video_detect_result.push(content);
}
//detext unsafe image
let detect_result = new Array();
......@@ -202,4 +412,4 @@ ipcMain.on("device-name", (e, arg) => {
})
//이전에 사용한 photos 폴더 삭제
var rimraf = require("rimraf");
rimraf("./photos", function(){console.log("")});
\ No newline at end of file
rimraf("./photos", function(){console.log("")});
......
......@@ -34,6 +34,14 @@
"resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.1.tgz",
"integrity": "sha512-82EQzwrNauw1fkbUSr3f+50Bcq7g4h0XvLOk8C5e9ABkXYHei7ZPi9tiMMD7Vh3SfcdH97d1ibJ3KBWp2o1J+w=="
},
"@google-cloud/video-intelligence": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@google-cloud/video-intelligence/-/video-intelligence-3.0.0.tgz",
"integrity": "sha512-ZkKBdWwO7CTm/zUwkSumdstR/CfHFdbkXT/OaDR3v/0+5M5qS4IaFnRbtbHKvKvgKzJJHleQ0E80DkTZsjI57g==",
"requires": {
"google-gax": "^2.1.0"
}
},
"@google-cloud/vision": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-2.0.0.tgz",
......@@ -498,6 +506,11 @@
"integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==",
"dev": true
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
......@@ -554,6 +567,15 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"any-base": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
......@@ -851,6 +873,11 @@
"dev": true,
"optional": true
},
"bootstrap-icons": {
"version": "1.0.0-alpha4",
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.0.0-alpha4.tgz",
"integrity": "sha512-UcpSUPsvUiW7ueBQfXZSgknJv/rj060dglhWIRPjkLjUWa32jMWqsLXO8tXY2od4Ew6cuh0BJ3f8VOhQPVY4mA=="
},
"bplist-creator": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz",
......@@ -942,11 +969,36 @@
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
},
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"dependencies": {
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
}
}
},
"chart.js": {
"version": "2.9.3",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz",
......@@ -973,6 +1025,77 @@
"color-name": "^1.0.0"
}
},
"chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
},
"cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"dev": true,
"requires": {
"restore-cursor": "^2.0.0"
}
},
"cli-spinners": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz",
"integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==",
"dev": true
},
"cliui": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
"dev": true,
"requires": {
"string-width": "^3.1.0",
"strip-ansi": "^5.2.0",
"wrap-ansi": "^5.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
}
}
},
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
"integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
"dev": true
},
"clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
......@@ -993,19 +1116,18 @@
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"requires": {
"color-name": "1.1.3"
},
"dependencies": {
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
}
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
......@@ -1133,6 +1255,12 @@
"ms": "^2.1.1"
}
},
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
"decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
......@@ -1142,6 +1270,20 @@
"mimic-response": "^1.0.0"
}
},
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
},
"defaults": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
"integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
"dev": true,
"requires": {
"clone": "^1.0.2"
}
},
"defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
......@@ -1168,6 +1310,11 @@
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
},
"detect-libc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
},
"detect-node": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
......@@ -1230,6 +1377,34 @@
"extract-zip": "^1.0.3"
}
},
"electron-log": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.2.0.tgz",
"integrity": "sha512-Yy1X8iZEzoBA8pu5b7YU07dRHi1GPM9C5jLEOn87Uqtdc9rbe6KbvvQ/AAAtGvn4/GC3azRW/eeiSI4ZF+Hm2A=="
},
"electron-rebuild": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.11.0.tgz",
"integrity": "sha512-cn6AqZBQBVtaEyj5jZW1/LOezZZ22PA1HvhEP7asvYPJ8PDF4i4UFt9be4i9T7xJKiSiomXvY5Fd+dSq3FXZxA==",
"dev": true,
"requires": {
"colors": "^1.3.3",
"debug": "^4.1.1",
"detect-libc": "^1.0.3",
"fs-extra": "^8.1.0",
"node-abi": "^2.11.0",
"node-gyp": "^6.0.1",
"ora": "^3.4.0",
"spawn-rx": "^3.0.0",
"yargs": "^14.2.0"
}
},
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
......@@ -1400,6 +1575,15 @@
"resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
"integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw=="
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
"locate-path": "^3.0.0"
}
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
......@@ -1431,6 +1615,14 @@
"universalify": "^0.1.0"
}
},
"fs-minipass": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
"integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
"requires": {
"minipass": "^2.6.0"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
......@@ -1503,6 +1695,12 @@
"json-bigint": "^0.3.0"
}
},
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
......@@ -1598,9 +1796,9 @@
}
},
"google-gax": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.6.1.tgz",
"integrity": "sha512-AKQKfaaXCJhMrP4nniz/ei7j+uyqG7nNrGmQxDBIBtDMUbZUMnH0Kw8asts35vmciEV5UeIWfclVcAU+VaJptw==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.6.0.tgz",
"integrity": "sha512-ALyNwrDkFMd5x+egpHVjX4BrWLbnC1XWcpKI7xdkYw4vpZlU+Yh/JrOPA93+uxKFmBy2LB564cJk/o7Yfbkubg==",
"requires": {
"@grpc/grpc-js": "~1.0.0",
"@grpc/proto-loader": "^0.5.1",
......@@ -1709,6 +1907,12 @@
"resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
......@@ -1739,11 +1943,27 @@
"debug": "4"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"ieee754": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
},
"ignore-walk": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
"integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
"requires": {
"minimatch": "^3.0.4"
}
},
"indexof": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
......@@ -1766,9 +1986,7 @@
"ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true,
"optional": true
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
},
"is": {
"version": "3.3.0",
......@@ -1984,11 +2202,27 @@
"xtend": "^4.0.0"
}
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
"dev": true
},
"lodash.at": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz",
......@@ -2029,6 +2263,15 @@
"resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
"integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
},
"log-symbols": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
"dev": true,
"requires": {
"chalk": "^2.0.1"
}
},
"long": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
......@@ -2081,6 +2324,12 @@
"mime-db": "1.43.0"
}
},
"mimic-fn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
"dev": true
},
"mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
......@@ -2108,6 +2357,23 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"minipass": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
"integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
}
},
"minizlib": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
"integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
"requires": {
"minipass": "^2.9.0"
}
},
"mjpeg-server": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/mjpeg-server/-/mjpeg-server-0.3.0.tgz",
......@@ -2174,16 +2440,58 @@
"sqlstring": "2.3.1"
}
},
"nan": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
"integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw=="
},
"ncp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
"integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M="
},
"needle": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz",
"integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==",
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.4.4",
"sax": "^1.2.4"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"requires": {
"ms": "^2.1.1"
}
}
}
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"node-abi": {
"version": "2.18.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz",
"integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==",
"dev": true,
"requires": {
"semver": "^5.4.1"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
}
}
},
"node-adb": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/node-adb/-/node-adb-0.1.6.tgz",
......@@ -2199,6 +2507,92 @@
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz",
"integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ=="
},
"node-gyp": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz",
"integrity": "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==",
"dev": true,
"requires": {
"env-paths": "^2.2.0",
"glob": "^7.1.4",
"graceful-fs": "^4.2.2",
"mkdirp": "^0.5.1",
"nopt": "^4.0.1",
"npmlog": "^4.1.2",
"request": "^2.88.0",
"rimraf": "^2.6.3",
"semver": "^5.7.1",
"tar": "^4.4.12",
"which": "^1.3.1"
},
"dependencies": {
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
}
}
},
"node-pre-gyp": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
"integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
"requires": {
"detect-libc": "^1.0.2",
"mkdirp": "^0.5.1",
"needle": "^2.2.1",
"nopt": "^4.0.1",
"npm-packlist": "^1.1.6",
"npmlog": "^4.0.2",
"rc": "^1.2.7",
"rimraf": "^2.6.1",
"semver": "^5.3.0",
"tar": "^4"
},
"dependencies": {
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"requires": {
"glob": "^7.1.3"
}
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
}
},
"nopt": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
"integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
"requires": {
"abbrev": "1",
"osenv": "^0.1.4"
}
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
......@@ -2210,6 +2604,14 @@
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
"dev": true
},
"npm-bundled": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
"integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
"requires": {
"npm-normalize-package-bin": "^1.0.1"
}
},
"npm-conf": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
......@@ -2221,6 +2623,21 @@
"pify": "^3.0.0"
}
},
"npm-normalize-package-bin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
"integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
},
"npm-packlist": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
"integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
"requires": {
"ignore-walk": "^3.0.1",
"npm-bundled": "^1.0.1",
"npm-normalize-package-bin": "^1.0.1"
}
},
"npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
......@@ -2272,12 +2689,95 @@
"wrappy": "1"
}
},
"onetime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"dev": true,
"requires": {
"mimic-fn": "^1.0.0"
}
},
"ora": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
"integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
"dev": true,
"requires": {
"chalk": "^2.4.2",
"cli-cursor": "^2.1.0",
"cli-spinners": "^2.0.0",
"log-symbols": "^2.2.0",
"strip-ansi": "^5.2.0",
"wcwidth": "^1.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
}
}
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"requires": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
......@@ -2328,6 +2828,12 @@
"better-assert": "~1.0.0"
}
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
......@@ -2440,9 +2946,9 @@
},
"dependencies": {
"@types/node": {
"version": "13.13.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.11.tgz",
"integrity": "sha512-FX7mIFKfnGCfq10DGWNhfCNxhACEeqH5uulT6wRRA1KEt7zgLe0HdrAd9/QQkObDqp2Z0KEV3OAmNgs0lTx5tQ=="
"version": "13.13.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.10.tgz",
"integrity": "sha512-J+FbkhLTcFstD7E5mVZDjYxa1VppwT2HALE6H3n2AnBSP8uiCQk0Pyr6BkJcP38dFV9WecoVJRJmFnl9ikIW7Q=="
}
}
},
......@@ -2476,6 +2982,17 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"requires": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
}
},
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
......@@ -2548,6 +3065,18 @@
"lodash": "^4.17.15"
}
},
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true
},
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
"responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
......@@ -2557,6 +3086,16 @@
"lowercase-keys": "^1.0.0"
}
},
"restore-cursor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"dev": true,
"requires": {
"onetime": "^2.0.0",
"signal-exit": "^3.0.2"
}
},
"retry-request": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz",
......@@ -2589,6 +3128,15 @@
"sprintf-js": "^1.1.2"
}
},
"rxjs": {
"version": "6.5.5",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
"integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
......@@ -2751,6 +3299,34 @@
"source-map": "^0.6.0"
}
},
"spawn-rx": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz",
"integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==",
"dev": true,
"requires": {
"debug": "^2.5.1",
"lodash.assign": "^4.2.0",
"rxjs": "^6.3.1"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
}
}
},
"sprintf-js": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
......@@ -2758,6 +3334,15 @@
"dev": true,
"optional": true
},
"sqlite3": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz",
"integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==",
"requires": {
"nan": "^2.12.1",
"node-pre-gyp": "^0.11.0"
}
},
"sqlstring": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
......@@ -2829,6 +3414,11 @@
"ansi-regex": "^2.0.0"
}
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
},
"sumchecker": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
......@@ -2838,6 +3428,29 @@
"debug": "^4.1.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"tar": {
"version": "4.4.13",
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
"integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
"requires": {
"chownr": "^1.1.1",
"fs-minipass": "^1.2.5",
"minipass": "^2.8.6",
"minizlib": "^1.2.1",
"mkdirp": "^0.5.0",
"safe-buffer": "^5.1.2",
"yallist": "^3.0.3"
}
},
"tar-stream": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz",
......@@ -2925,6 +3538,12 @@
"utf8-byte-length": "^1.0.1"
}
},
"tslib": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
"dev": true
},
"tunnel": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
......@@ -3038,6 +3657,15 @@
"resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
"integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ=="
},
"wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
"integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
"dev": true,
"requires": {
"defaults": "^1.0.3"
}
},
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
......@@ -3046,6 +3674,12 @@
"isexe": "^2.0.0"
}
},
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
"wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
......@@ -3054,6 +3688,51 @@
"string-width": "^1.0.2 || 2"
}
},
"wrap-ansi": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.0",
"string-width": "^3.0.0",
"strip-ansi": "^5.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
}
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
......@@ -3109,11 +3788,80 @@
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
},
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"yargs": {
"version": "14.2.3",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
"integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
"dev": true,
"requires": {
"cliui": "^5.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^15.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
}
}
},
"yargs-parser": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
"integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
},
"yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
......
......@@ -4,24 +4,28 @@
"description": "",
"main": "main.js",
"scripts": {
"start": "electron ."
"start": "electron .",
"rebuild": "electron-rebuild -f -w sqlite3"
},
"author": "Hee <glwjd0414@khu.ac.kr>",
"license": "ISC",
"devDependencies": {
"electron": "^8.2.0"
"electron": "^8.2.0",
"electron-rebuild": "^1.11.0"
},
"dependencies": {
"@google-cloud/vision": "^2.0.0",
"appium-adb": "^7.27.1",
"bootstrap-icons": "^1.0.0-alpha4",
"chart.js": "^2.9.3",
"@google-cloud/video-intelligence": "^3.0.0",
"appium-adb": "^7.27.1",
"electron-log": "^4.2.0",
"jQuery": "^1.7.4",
"jquery": "^3.5.0",
"mysql": "^2.18.1",
"node-adb": "^0.1.6",
"python-shell": "^2.0.0",
"rimraf": "^3.0.2",
"socket.io": "^2.3.0"
"socket.io": "^2.3.0",
"sqlite3": "^4.2.0"
}
}
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
<link rel="stylesheet" href="../assets/css/alldata.css">
<title>Document</title>
</head>
<body>
<header class="menu-header py-4">
<div class="row pl-3 d-flex justify-content-start flex-nowrap align-items-end">
<div class="col">
<a class="title-name text-dark">All data</a>
</div>
<div div class="col-8">
<a class="title-detail">추출 데이터 확인</a>
</div>
<div div class="col">
<a class="title-back" href="menu.html" id="menu-out">나가기</a>
</div>
</div>
</header>
<div class="nav-scroller nav-color py-1 mb-2">
<nav class="nav d-flex justify-content-around">
<a class="p-2" href="#" style="color: whitesmoke" id="menu-info">INFO</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-calling">CALLING</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-photo">PHOTO</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-contact">CONTACT</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-video">VIDEO</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-sms">SMS</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-audio">AUDIO</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-document">DOCUMENT</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-calendar">CALENDAR</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-network">NETWORK</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-appinfo">APP INFO</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-wifi">WIFI</a>
<a class="p-2" href="#" style="color: whitesmoke" id="menu-usagestats">USAGESTATS</a>
</nav>
</div>
<div ids = "table_list">
<table id="table">
<tbody>
</tbody>
</table>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
<script src="alldata_menu.js"></script>
</body>
</html>
\ No newline at end of file
const log = require('electron-log')
const sqlite3 = require('sqlite3').verbose();
document.addEventListener("DOMContentLoaded", function(){
getInfoRows();
});
function el(selector) {
return document.getElementById(selector);
}
el('menu-info').addEventListener('click', function(){
// Get the mysql service
getInfoRows();
},false);
el('menu-calling').addEventListener('click', function(){
// Get the mysql service
getCallingRows();
},false);
el('menu-photo').addEventListener('click', function(){
// Get the mysql service
getPhotoRows();
},false);
el('menu-contact').addEventListener('click', function(){
// Get the mysql service
getContactRows();
},false);
el('menu-video').addEventListener('click', function(){
// Get the mysql service
getVideoRows();
},false);
el('menu-sms').addEventListener('click', function(){
// Get the mysql service
getSmsRows();
},false);
el('menu-audio').addEventListener('click', function(){
// Get the mysql service
getAudioRows();
},false);
el('menu-document').addEventListener('click', function(){
// Get the mysql service
getDocumentRows();
},false);
el('menu-calendar').addEventListener('click', function(){
// Get the mysql service
getCalendarRows();
},false);
el('menu-network').addEventListener('click', function(){
// Get the mysql service
getNetworkRows();
},false);
el('menu-appinfo').addEventListener('click', function(){
// Get the mysql service
getAppinfoRows();
},false);
el('menu-wifi').addEventListener('click', function(){
// Get the mysql service
getWifiRows();
},false);
el('menu-usagestats').addEventListener('click', function(){
// Get the mysql service
getAppUsageRows();
},false);
function getInfoRows(){
Promise.all([getphoneinfo(),getaccountinfo()]).then(function(value){
log.info(value);
var html = value[0] + value[1];
document.querySelector('#table > tbody').innerHTML = html;
});
}
function getCallingRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Id</th>\
<th>Type</th>\
<th>Name</th>\
<th>Number</th>\
<th>Duration</th>\
<th>Date</th>\
</tr>"
let sql = "SELECT * FROM calllog"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.id}</td>
<td>${row.type}</td>
<td>${row.name}</td>
<td>${row.number}</td>
<td>${row.duration}</td>
<td>${row.date}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getPhotoRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Title</th>\
<th>Id</th>\
<th>Date Added</th>\
<th>Display Name</th>\
<th>Mime type</th>\
<th>Path</th>\
<th>Latitude</th>\
<th>Longitude</th>\
<th>Size</th>\
</tr>"
let sql = "SELECT * FROM photo"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.title}</td>
<td>${row.id}</td>
<td>${row.date_added}</td>
<td>${row.display_name}</td>
<td>${row.mime_type}</td>
<td>${row.path}</td>
<td>${row.latitude}</td>
<td>${row.longitude}</td>
<td>${row.size}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getContactRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Number</th>\
<th>Name</th>\
<th>Photo_id</th>\
<th>Person_id</th>\
</tr>"
let sql = "SELECT * FROM contact"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.number}</td>
<td>${row.name}</td>
<td>${row.photo_id}</td>
<td>${row.person_id}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getVideoRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Title</th>\
<th>Date Added</th>\
<th>Display Name</th>\
<th>Mime type</th>\
<th>Path</th>\
<th>Latitude</th>\
<th>Longitude</th>\
<th>Album</th>\
<th>Artist</th>\
<th>Bookmark</th>\
<th>Category</th>\
<th>Description</th>\
<th>Language</th>\
<th>Resolution</th>\
<th>Tags</th>\
<th>Size</th>\
</tr>"
let sql = "SELECT * FROM video"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.title}</td>
<td>${row.date_added}</td>
<td>${row.display_name}</td>
<td>${row.mime_type}</td>
<td>${row.path}</td>
<td>${row.latitude}</td>
<td>${row.longitude}</td>
<td>${row.album}</td>
<td>${row.artist}</td>
<td>${row.bookmark}</td>
<td>${row.category}</td>
<td>${row.description}</td>
<td>${row.language}</td>
<td>${row.resolution}</td>
<td>${row.tags}</td>
<td>${row.size}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getSmsRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Mid</th>\
<th>Tid</th>\
<th>Type</th>\
<th>Address</th>\
<th>Person</th>\
<th>Creator</th>\
<th>Date</th>\
<th>Body</th>\
<th>Read_c</th>\
</tr>"
let sql = "SELECT * FROM sms"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.mid}</td>
<td>${row.tid}</td>
<td>${row.type}</td>
<td>${row.address}</td>
<td>${row.person}</td>
<td>${row.creator}</td>
<td>${row.date}</td>
<td>${row.body}</td>
<td>${row.read_c}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getAudioRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Title</th>\
<th>Date Added</th>\
<th>Mime type</th>\
<th>Path</th>\
<th>Album</th>\
<th>Artist</th>\
<th>Composer</th>\
<th>Year</th>\
<th>Size</th>\
</tr>"
let sql = "SELECT * FROM audio"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.title}</td>
<td>${row.date_added}</td>
<td>${row.mime_type}</td>
<td>${row.path}</td>
<td>${row.album}</td>
<td>${row.artist}</td>
<td>${row.composer}</td>
<td>${row.year}</td>
<td>${row.size}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getDocumentRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Name</th>\
<th>Title</th>\
<th>Mime type</th>\
<th>Date Added</th>\
<th>Date Modified</th>\
<th>Path</th>\
<th>Size</th>\
</tr>"
let sql = "SELECT * FROM documentinfo"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.name}</td>
<td>${row.title}</td>
<td>${row.mime_type}</td>
<td>${row.date_added}</td>
<td>${row.date_modified}</td>
<td>${row.path}</td>
<td>${row.size}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getCalendarRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Id</th>\
<th>Title</th>\
<th>Calendar Id</th>\
<th>Event Location</th>\
<th>Description</th>\
<th>Dstart</th>\
<th>Dend</th>\
<th>Duration</th>\
<th>All day</th>\
<th>Display name</th>\
<th>Account name</th>\
<th>Owner name</th>\
<th>Rrlue</th>\
<th>Rdate</th>\
</tr>"
let sql = "SELECT * FROM calendar"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.id}</td>
<td>${row.title}</td>
<td>${row.calendar_id}</td>
<td>${row.event_location}</td>
<td>${row.description}</td>
<td>${row.dtstart}</td>
<td>${row.dtend}</td>
<td>${row.duration}</td>
<td>${row.all_day}</td>
<td>${row.display_name}</td>
<td>${row.account_name}</td>
<td>${row.owner_name}</td>
<td>${row.rrlue}</td>
<td>${row.rdate}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getNetworkRows(){
Promise.all([getandroidmetadata(),getinetAddress(),getlinkAddress(),getnetworkInfo(),getrouteInfo()]).then(function(value){
log.info(value);
var html = value[0] + value[1] + value[2] + value[3] + value[4];
document.querySelector('#table > tbody').innerHTML = html;
});
}
function getAppinfoRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>Packagename</th>\
<th>Version</th>\
<th>Name</th>\
<th>First insatll</th>\
<th>Last update</th>\
<th>Wifi Usage</th>\
<th>Cellular Usage</th>\
</tr>"
let sql = "SELECT * FROM appinfo"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.packagename}</td>
<td>${row.version}</td>
<td>${row.name}</td>
<td>${row.firstinstall}</td>
<td>${row.lastupdate}</td>
<td>${row.wifiusage}</td>
<td>${row.cellularusage}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getWifiRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>ID</th>\
<th>Ssid</th>\
<th>Bssid</th>\
<th>Wepkeys</th>\
</tr>"
let sql = "SELECT * FROM wifi"
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr>
<td>${row.id}</td>
<td>${row.ssid}</td>
<td>${row.bssid}</td>
<td>${row.wepkeys}</td>
</tr>`;
});
document.querySelector('#table > tbody').innerHTML = html;
db.close();
log.info("Query succesfully executed");
});
}
function getAppUsageRows(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = "<tr><th>packagename</th>\
<th>firsttimestamp</th>\
<th>lasttimestamp</th>\
<th>lasttimeused</th>\
<th>totaltimeforeground</th>\
</tr>"
let sql = `select * from AppUsageDay
union
select * from AppUsageMonth
union
select * from AppUsageWeek
union
select * from AppUsageYear;`
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
const offset = new Date().getTimezoneOffset() * 60000;
rows.forEach((row) => {
html += `<tr>
<td>${row.packagename}</td>
<td>${row.firsttimestamp}</td>
<td>${row.lasttimestamp}</td>
<td>${row.lasttimeused}</td>
<td>${row.totaltimeforeground}</td>
</tr>`
});
db.close();
document.querySelector('#table > tbody').innerHTML = html;
log.info("Query succesfully executed");
});
}
var getphoneinfo = function getPhoneinfo(){
return new Promise(function(resolve, reject){
setTimeout( function(){
// var html = `<tr><th>Phone type</th><th>Software Number</th><th>Phone number</th>
// <th>Subscribe id</th><th>Adid</th><th>Call state</th>
// <th>Data state</th><th>Network type</th><th>Etwork countryis</th>
// <th>Simcountryiso</th><th>Network operator</th><th>Sim operator</th>
// <th>Network operator name</th><th>Sim operator name</th><th>Sim serial number</th>
// <th>Simstate</th><th>Is networking Roming</th>
// </tr>`;
var html = `<tr><th>Phone type</th><th>Software Number</th><th>Phone number</th></tr>`;
const db = new sqlite3.Database('InnerDatabase.db');
let sql = "SELECT * FROM android_metadata";
db.get(sql, [], (err, row) => {
if (err) {
log.err(err);
throw err;
}
html += `<tr><td>${row.phonetype}</td><td>${row.softwarenumber}</td><td>${row.phonenumber}</td></tr>`
html += `<tr><th>Subscribe id</th><th>Adid</th><th>Call state</th></tr>`
html += `<tr><td>${row.subscriberid}</td><td>${row.adid}</td><td>${row.callstate}</td></tr>`
html += `<tr><th>Data state</th><th>Network type</th><th>Etwork countryis</th></tr>`
html += `<tr><td>${row.datastate}</td><td>${row.networktype}</td><td>${row.networkcountryiso}</td></tr>`
html += `<tr><th>Simcountryiso</th><th>Network operator</th><th>Sim operator</th></tr>`
html += `<tr><td>${row.simcountryiso}</td><td>${row.networkoperater}</td><td>${row.simoperator}</td></tr>`
html += `<tr><th>Network operator name</th><th>Sim operator name</th><th>Sim serial number</th></tr>`
html += `<tr><td>${row.networkoperatorname}</td><td>${row.simoperatorname}</td><td>${row.simserialnumber}</td></tr>`
html += `<tr><th>Simstate</th><th>Is networking Roming</th></tr>`
html += `<tr><td>${row.simstate}</td><td>${row.isnetworkroming}</td></tr>`
db.close();
resolve(html);
});
}, 1000)
})
}
var getaccountinfo = function getAccountinfo(){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = `<tr><th>Account name</th><th>Accounttype</th></tr>`;
const db = new sqlite3.Database('InnerDatabase.db');
let sql = "SELECT * FROM accountinfo";
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr><td>${row.accountname}</td><td>${row.accounttype}</td></tr>`
});
db.close();
resolve(html);
});
}, 1000)
})
}
var getandroidmetadata = function getAM(){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = `<tr><th>locale</th></tr>`;
const db = new sqlite3.Database('networkDatabase.db');
let sql = "SELECT * FROM android_metadata";
db.get(sql, [], (err, row) => {
if (err) {
log.err(err);
throw err;
}
html += `<tr><td>${row.locale}</td></tr>`
db.close();
resolve(html);
});
}, 1000)
})
}
var getinetAddress = function getIA(){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = `<tr><th>net_id</th><th>host_address</th></tr>`;
const db = new sqlite3.Database('networkDatabase.db');
let sql = "SELECT * FROM inetAddress";
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr><td>${row.net_id}</td><td>${row.host_address}</td></tr>`
});
db.close();
resolve(html);
});
}, 1000)
})
}
var getlinkAddress = function getLA(){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = `<tr><th>net_id</th><th>host_address</th><th>prefix_length</th></tr>`;
const db = new sqlite3.Database('networkDatabase.db');
let sql = "SELECT * FROM linkAddress";
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr><td>${row.net_id}</td><td>${row.host_address}</td><td>${row.prefix_length}</td></tr>`
});
db.close();
resolve(html);
});
}, 1000)
})
}
var getnetworkInfo = function getNI(){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = `<tr><th>net_id</th><th>domain</th><th>interface_name</th></tr>`;
const db = new sqlite3.Database('networkDatabase.db');
let sql = "SELECT * FROM network_info";
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr><td>${row.net_id}</td><td>${row.domain}</td><td>${row.interface_name}</td></tr>`
});
db.close();
resolve(html);
});
}, 1000)
})
}
var getrouteInfo = function getRI(){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = `<tr><th>net_id</th><th>destination</th><th>d_prefix</th><th>gateway</th><th>interface_name</th></tr>`;
const db = new sqlite3.Database('networkDatabase.db');
let sql = "SELECT * FROM routeinfo";
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
html += `<tr><td>${row.net_id}</td><td>${row.destination}</td><td>${row.d_prefix}</td><td>${row.gateway}</td><td>${row.interface_name}</td></tr>`
});
db.close();
resolve(html);
});
}, 1000)
})
}
\ No newline at end of file
......@@ -32,16 +32,16 @@ connect_btn.addEventListener("click", () => {
/*
var connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'1234'
user: 'root',
password: '1234'
});
connection.connect();
*/
var mysql = {
user : 'root',
password : '1234'
user: 'root',
password: '1234'
};
function apkInstall(){
......@@ -77,6 +77,82 @@ function convertToMysql(){
})
}
// function extractDB () {
// cmd_backup = exec('adb -s '+device+' backup com.example.dataextraction -f backup.dataextraction.ad', function(error, stdout, stderr){
// cc.innerHTML="backup app";
// setTimeout(function(){
// cmd_unpack = exec('java -jar abe.jar unpack backup.dataextraction.ad dataextraction.tar',function(error, stdout, stderr){
// cc.innerHTML="unpack backup";
// cmd_unzip = exec('tar xvf dataextraction.tar', function(error, stdout, stderr){
// cc.innerHTML="unzip tar";
// cmd_moveIdb = fs.rename('apps/com.example.dataextraction/db/InnerDatabase.db', 'InnerDatabase.db', function(){
// cc.innerHTML="move InnerDB File";
// cmd_moveNdb = fs.rename('apps/com.example.dataextraction/db/networkDatabase.db', 'networkDatabase.db',function(){
// cc.innerHTML="move NetworkDB File";
// cmd_sqlIdb = exec('sqlite3 InnerDatabase.db .dump | python SQLiteToMysql.py > InnerDatabase.sql',function(error, stdout, stderr){
// cc.innerHTML="make InnerDB SQL";
// cmd_sqlNdb = exec('sqlite3 networkDatabase.db .dump | python SQLiteToMysql_network.py > networkDatabase.sql', function(error, stdout, stderr){
// cc.innerHTML="make NetworkDB SQL";
// cmd_makeIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION;CREATE DATABASE DATAEXTRACTION CHARACTER SET utf8 COLLATE utf8_unicode_ci;USE DATAEXTRACTION;"',function(error, stdout, stderr){
// cc.innerHTML="create InnerDB";
// cmd_insertIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION < InnerDatabase.sql',function(error, stdout, stderr){
// cc.innerHTML="insert Data ; InnerDB";
// cmd_makeNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION_network;CREATE DATABASE DATAEXTRACTION_network;USE DATAEXTRACTION_network;"',function(error, stdout, stderr){
// cc.innerHTML="create NetworkDB";
// cmd_insertNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION_network < networkDatabase.sql',function(error, stdout, stderr){
// cc.innerHTML="insert Data ; NetworkDB";
// cc.innerHTML="Data Extraction Complete !";
// cc.innerHTML="Click 'NEXT' Button";
// })
// })
// })
// })
// })
// })
// })
// })
// })
// })
// },7000);
// });
// //cmd_backup();
// }
// //db insert done
// io.on('connection', function(socket){
// var instanceId = socket.id;
// socket.on('alert', function(data){
// cc.innerHTML = data.comment+" db created";
// })
// socket.on('end', function(data){
// cc.innerHTML="all databases created !";
// extractDB();
// })
// })
function convertToMysql(){
cmd_sqlIdb = exec('sqlite3 InnerDatabase.db .dump | python SQLiteToMysql.py > InnerDatabase.sql',function(error, stdout, stderr){
cc.innerHTML="make InnerDB SQL";
cmd_sqlNdb = exec('sqlite3 networkDatabase.db .dump | python SQLiteToMysql_network.py > networkDatabase.sql', function(error, stdout, stderr){
cc.innerHTML="make NetworkDB SQL";
cmd_makeIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION;CREATE DATABASE DATAEXTRACTION CHARACTER SET utf8 COLLATE utf8_unicode_ci;USE DATAEXTRACTION;"',function(error, stdout, stderr){
cc.innerHTML="create InnerDB";
cmd_insertIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION < InnerDatabase.sql',function(error, stdout, stderr){
cc.innerHTML="insert Data ; InnerDB";
cmd_makeNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION_network;CREATE DATABASE DATAEXTRACTION_network;USE DATAEXTRACTION_network;"',function(error, stdout, stderr){
cc.innerHTML="create NetworkDB";
cmd_insertNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION_network < networkDatabase.sql',function(error, stdout, stderr){
cc.innerHTML="insert Data ; NetworkDB";
cc.innerHTML="Data Extraction Complete !";
cc.innerHTML="Click 'NEXT' Button";
})
})
})
})
})
})
}
function extractDB () {
cmd_backup = exec('adb -s '+device+' backup com.example.dataextraction -f backup.dataextraction.ad', function(error, stdout, stderr){
cc.innerHTML="backup app";
......@@ -119,5 +195,7 @@ ipcRenderer.on("device", (e, arg) => {
//device.innerHTML = arg.toString();
cc.innerHTML="DATA EXTRACTION START !";
apkInstall();
// apkInstall();
extractDB();
});
......
......@@ -18,7 +18,7 @@
<button id="btn" class="menu_alldata_nwide" onclick="menu_all();">All Data
<div id="menu_alldata_wide" style="display:none">
<br>
<h2 onclick="location.href='menu0.html'">전체 데이터 보기</h2>
<h2 onclick="location.href='alldata_menu.html'">전체 데이터 보기</h2>
<svg class="bi bi-arrow-right-circle" width="0.3em" height="0.3em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg" style="color:#4e73df" onclick="location.href='menu0.html'">
<path fill-rule="evenodd" d="M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
<path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1 0-.708L10.293 8 7.646 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0z"/>
......@@ -72,7 +72,7 @@
<div id ="menu" class="menu_up">
<div id="btn_group">
<button id="btn" class="menu_analysis_menu3_nwide" onclick="menu_analysis_menu3();">Apps
<div id="menu_analysis_menu3_wide" style="display:none" onclick="location.href='menu3.html'">
<div id="menu_analysis_menu3_wide" style="display:none" onclick="location.href='menu_apps.html'">
<h4>어플리케이션 사용 분석</h4>
<div id="wide_location">
<h2>어플 사용 분석</h2>
......@@ -89,7 +89,7 @@
<div id ="menu">
<div id="btn_group">
<button id="btn" class="menu_analysis_menu4_nwide" onclick="menu_analysis_menu4();">Media
<div id="menu_analysis_menu4_wide" style="display:none" onclick="location.href='menu4.html'">
<div id="menu_analysis_menu4_wide" style="display:none" onclick="location.href='menu_media.html'">
<h4>미디어 파일 저장공간 분석<br>비디오 분석</h4>
<div id="wide_location">
<h2>미디어 분석</h2>
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
<link rel="stylesheet" href="../assets/css/menu_apps.css">
<title>Document</title>
</head>
<body>
<div class="container">
<header class="menu-header py-4">
<div class="row d-flex justify-content-start flex-nowrap align-items-end">
<div class="col">
<a class="title-name text-dark">Apps</a>
</div>
<div div class="col-9">
<a class="title-detail">앱 사용 정보 분석</a>
</div>
<div div class="col">
<a class="title-back" href="menu.html" id="menu-info">뒤로가기</a>
</div>
</div>
</header>
<div class="nav-scroller nav-color py-1 mb-2">
<nav class="nav d-flex justify-content-around">
<a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('App-List');">App List</a>
<a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Deleted-App');">Deleted App</a>
<a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Recent-Usage');">Recent Usage</a>
</nav>
</div>
<div class="container">
<div id="App-List" class="menu">
<div class="row">
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pb-2 mb-0 font-nanum">App List</h6>
<div class="row sort justify-content-end">
<a id="wifiusage" class="sort p-2 text-muted" href="#" onclick="getAppInfoList('wifiusage');">wifi 사용량순</a>
<a id="cellularusage" class="sort p-2 text-muted" href="#" onclick="getAppInfoList('cellularusage');">cellular 사용량순</a>
<a id="totaltime" class="sort p-2 text-muted" href="#" onclick="getAppInfoList('totaltime');" style="font-weight: bold;">실행 시간순</a>
</div>
<div id="applist">
</div>
</div>
</div>
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<a id="appdetail_title" class="border-bottom border-gray pb-2 mb-0 font-nanum">App Detail</a>
<div id="appdetails" class="detail_app font-nanum pt-2 pb-5">
<h8 class="pt-3 pb-3 mb-0 font-italic">세부사항을 확인하려면 follow를 클릭하세요</h8>
</div>
<div id="pieChartdiv" class="pb-5">
<canvas id="pieChart" style="max-width: 500px;"></canvas>
</div>
<div id="barchart_title" style="display: none;">
<a class="pb-2 mb-0 font-nanum border-bottom border-gray">사용 시간대</a>
</div>
<div id="barChartdiv" class="pb-5">
<canvas id="barChart"></canvas>
</div>
<div id = "apptimelist" class="font-nanum">
</div>
</div>
</div>
</div>
</div>
<div id="Deleted-App" class="menu" style="display:none">
<div class="row">
<div class="col">
<div id="deletedapps" class="my-3 p-3 bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pb-2 mb-0">Deleted Apps</h6>
<div class="overflow-auto">
<div id="deletedapplist" class="font-nanum">
</div>
</div>
</div>
</div>
</div>
</div>
<div id="Recent-Usage" class="menu" style="display:none">
<h6 class="border-bottom border-gray pb-2 mb-0">최근 10일 사용 분석</h6>
<div class="row">
<div class="col">
<div id="day10analysis" class="my-3 p-3 bg-white rounded shadow-sm">
<div id="pieCharttop10">
<a class="border-bottom border-gray pb-2 mb-0 font-nanum">사용 시간 비율</a>
<canvas id="pieChart10" width="350" height="350"></canvas>
</div>
</div>
</div>
<div class="col">
<div id="top10list" class="my-3 p-3 bg-white rounded shadow-sm">
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<a class="border-bottom border-gray pb-2 mb-0 font-nanum">일별 사용량</a>
<canvas id="recent_bar" width="400" height="400"></canvas>
</div>
</div>
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<a class="border-bottom border-gray pb-2 mb-0 font-nanum">사용 어플</a>
<div id="selectday"class="row sort justify-content-end">
</div>
<table id="day_use_list" class="font-nanum" style="font-size: 10;">
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="menu_apps.js"></script>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
const log = require('electron-log')
const sqlite3 = require('sqlite3').verbose();
const offset = new Date().getTimezoneOffset() * 60000;
var mychart = null;
function el(selector) {
return document.getElementById(selector);
}
function cl(selector) {
return document.getElementsByClassName(selector);
}
// window.onload=function(){
// getAppInfoList();
// getDeletedAppList();
// }
document.addEventListener("DOMContentLoaded", function(){
getAppInfoList('totaltime');
getDeletedAppList();
getRecentUsage();
});
function openTap(tabName) {
var i;
var x = document.getElementsByClassName("menu");
for (i = 0; i < x.length; i++) {
x[i].style.display = "none"
}
document.getElementById(tabName).style.display = "block";
}
function testClick(tabName) {
log.info("testclick")
}
function getAppInfoList(sort_column){
const db = new sqlite3.Database('InnerDatabase.db');
var html = ''
let sql = `select Appinfo.name, Appinfo.packagename, Appinfo.wifiusage, Appinfo.cellularusage, sum(AppUsageYear.totaltimeforeground) totaltime from AppInfo, AppUsageYear\
where Appinfo.packagename = AppUsageYear.packagename\
GROUP BY AppUsageYear.packagename\
ORDER BY ${sort_column} desc;`
log.info("Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
const offset = new Date().getTimezoneOffset() * 60000;
var wifi;
var cell;
var totaltime;
rows.forEach((row) => {
if(row.wifiusage){
wifi = (row.wifiusage/1073741824).toFixed(2) + "GB";
}
else if(row.wifiusage > 1048576){
wifi = (row.wifiusage/1048576).toFixed(2) + "MB";
}
else if(row.wifiusage > 1024){
wifi = (row.wifiusage/1024).toFixed(2) + "KB";
}
if(row.cellularusage> 1073741824){
cell = (row.cellularusage/1073741824).toFixed(2) + "GB";
}
else if(row.cellularusage > 1048576){
cell = (row.cellularusage/1048576).toFixed(2) + "MB";
}
else if(row.cellularusage > 1024){
cell = (row.cellularusage/1024).toFixed(2) + "KB";
}
if(row.totaltime> 3600000){
totaltime = (row.totaltime/3600000).toFixed(2) + "Hour";
}
else if(row.totaltime > 60000){
totaltime = (row.totaltime/60000).toFixed(2) + "Minute";
}
else if(row.totaltime > 1000){
totaltime = (row.totaltime/1000).toFixed(2) + "Seconds";
}
html += `<div class="media pt-3 font-nanum rounded" onclick="getAppDetail('${row.packagename}');">
<p class="media-body pb-3 mb-0 small lh-125 border-bottom border-gray">
<a class="d-block font-weight-bolder">${row.name}</a>
<a class="d-block">${row.packagename}</a>
<a class="font-weight-bold">wifi usage</a>
<a>${wifi}</a><br>
<a class="font-weight-bold">cellular usage</a>
<a>${cell}</a><br>
<a>total time in foreground</a>
<a>${totaltime}</a><br>
</p>
</div>`
});
document.querySelector('#applist').innerHTML = html;
log.info("Query succesfully executed");
});
var i;
var x = document.getElementsByClassName("sort");
for (i = 0; i < x.length; i++) {
x[i].style.fontWeight = "normal";
}
document.getElementById(sort_column).style.fontWeight = "bold";
db.close();
}
function getDeletedAppList(){
const db = new sqlite3.Database('InnerDatabase.db');
var html = ''
let sql = `SELECT AppUsageYear.lasttimeused, AppUsageYear.packagename, SUM(AppUsageYear.totaltimeforeground) as totaltime FROM AppUsageYear
WHERE AppUsageYear.packagename NOT in (select Appinfo.packagename from AppInfo)
GROUP BY AppUsageYear.packagename
ORDER BY totaltime desc;`
log.info("Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
throw err;
}
rows.forEach((row) => {
var totaltime;
if(row.totaltime> 3600000){
totaltime = (row.totaltime/3600000).toFixed(2) + "Hour";
}
else if(row.totaltime > 60000){
totaltime = (row.totaltime/60000).toFixed(2) + "Minute";
}
else if(row.totaltime > 1000){
totaltime = (row.totaltime/1000).toFixed(2) + "Seconds";
}
html += `<div class="media pt-3">
<p class="media-body pb-3 mb-0 small lh-125 border-bottom border-gray">
<strong class="d-block">${row.packagename}</strong>
<a class="font-weight-bold">총 사용 시간</a>
<a>${totaltime}</a><br>
<a class="font-weight-bold">마지막 사용 시간</a>
<a>${new Date(row.lasttimeused-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>
<a href="https://play.google.com/store/apps/details?id=${row.packagename}" onclick="window.open(this.href); return false">Follow</a>
</p>
</div>
`
});
document.querySelector('#deletedapplist').innerHTML = html;
log.info("Query succesfully executed");
});
db.close();
}
function getRecentUsage(){
Promise.all([draw_recent_piechart(),listtop10(),get_recent_dataset()]).then(function(value){
log.info("getRecentUsage finished")
});
}
function getAppDetail(packagename){
Promise.all([drawpiechart(packagename),drawbarchart(packagename)]).then(function(value){
log.info("getAppDetail finished")
});
}
//Recent Usage 차트그리기
var draw_recent_piechart = function drawRecentPieChart(){
return new Promise(function(resolve, reject){
setTimeout( function(){
log.info("pie10 draw start");
Promise.all([top10_day(),totaltimeday()]).then(function(value){
log.info("pie10 draw start");
var recent_labels = [];
var recent_datasets = [];
var except = 0;
value[0].forEach((row) => {
recent_labels.push(row.name);
recent_datasets.push(row.totaltime);
except += row.totaltime;
});
recent_labels.push("그 외");
recent_datasets.push(value[1]-except);
var ctxP = document.getElementById("pieChart10").getContext('2d');
var myPieChart10 = new Chart(ctxP, {
type: 'pie',
data: {
labels: recent_labels,
datasets: [{
data: recent_datasets,
backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#9B59B6", "#2471A3", "#3498DB", "#F39C12","#16A085","#E91E63","#949FB1", "#4D5360"],
hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#AF7AC5 ", "#2980B9","#5DADE2", "#F5B041","#45B39D","#EC407A","#A8B3C5", "#616774"]
}]
},
options: {
responsive: false
}
});
log.info("pie10 chart draw draw draw")
});
resolve(true);
}, 1000)
})
}
var listtop10 = function listTop10(){
return new Promise(function(resolve, reject){
setTimeout( function(){
log.info("listtop10 draw start");
Promise.all([top10_day()]).then(function(value){
log.info("listtop10 draw start");
var html = `<a class="border-bottom border-gray pb-2 mb-0 font-nanum">사용 시간 Top10</a><br>`;
var index = 1;
value[0].forEach((row) => {
html += `<div class="pl-1 pt-1"><a class="pb-1" style="font-size: 15px">${index}. ${row.name}</a><br></div>`;
index++;
});
document.querySelector('#top10list').innerHTML = html;
log.info("listtop10 chart draw draw draw")
});
resolve(true);
}, 1000)
})
}
//AppList 차트그리기
var drawpiechart = function drawPieChart(packagename){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = ''
Promise.all([alltime(),totaltime(packagename),packagedetail(packagename),usedtime(packagename)]).then(function(value){
document.querySelector('#pieChartdiv').innerHTML = '<a class="border-bottom border-gray pb-2 mb-0" style="font-family: \'나눔바른고딕\'">사용 시간 비율</a><canvas id="pieChart" style="max-width: 500px;"></canvas>'
var wifi;
var cell;
var totaltime;
document.querySelector('#appdetail_title').innerHTML = value[2].name;
if(value[2].wifiusage){
wifi = (value[2].wifiusage/1073741824).toFixed(2) + "GB";
}
else if(value[2].wifiusage > 1048576){
wifi = (value[2].wifiusage/1048576).toFixed(2) + "MB";
}
else if(value[2].wifiusage > 1024){
wifi = (value[2].wifiusage/1024).toFixed(2) + "KB";
}
if(value[2].cellularusage > 1073741824){
cell = (value[2].cellularusage/1073741824).toFixed(2) + "GB";
}
else if(value[2].cellularusage > 1048576){
cell = (value[2].cellularusage/1048576).toFixed(2) + "MB";
}
else if(value[2].cellularusage > 1024){
cell = (value[2].cellularusage/1024).toFixed(2) + "KB";
}
if(value[2].totaltime> 3600000){
totaltime = (value[2].totaltime/3600000).toFixed(2) + "Hour";
}
else if(value[2].totaltime > 60000){
totaltime = (value[2].totaltime/60000).toFixed(2) + "Minute";
}
else if(row.totaltime > 1000){
totaltime = (value[2].totaltime/1000).toFixed(2) + "Seconds";
}
html += `
<a class="d-block text-muted" style="font-size: 13px; float: right">${value[2].packagename}</a>
<a class="d-block text-muted" style="font-size: 13px">${value[2].version} ver</a>
<a class="font-weight-bold" style="font-size: 13px">First Install</a>
<a style="font-size: 13px">${new Date(value[2].firstinstall-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>
<a class="font-weight-bold" style="font-size: 13px">Last Update</a>
<a style="font-size: 13px">${new Date(value[2].lastupdate-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>
<a class="font-weight-bold" style="font-size: 13px">Wifi Usage</a>
<a style="font-size: 13px">${wifi}</a><br>
<a class="font-weight-bold" style="font-size: 13px">Cellular Usage</a>
<a style="font-size: 13px">${cell}</a><br>
<a class="font-weight-bold" style="font-size: 13px">Total Time in Foreground</a>
<a style="font-size: 13px">${totaltime}</a><br>`
document.querySelector('#appdetails').innerHTML = html;
var ctxP = document.getElementById("pieChart").getContext('2d');
var myPieChart = new Chart(ctxP, {
type: 'pie',
data: {
labels: [value[2].name,"그외 어플"],
datasets: [{
data: [value[1], value[0]-value[1]],
backgroundColor: ["#F7464A","#949FB1"],
hoverBackgroundColor: ["#FF5A5E","#A8B3C5"]
}]
},
options: {
responsive: true
}
});
log.info("pie chart draw draw draw")
});
resolve(true);
}, 1000)
})
}
var drawbarchart = function drawBarChart(packagename){
return new Promise(function(resolve, reject){
setTimeout( function(){
var timedataset = [0,0,0,0,0,0,0,0,0,0,0,0];
var html1 = '<a class="pb-2 mb-0 font-nanum border-bottom border-gray">기간별 마지막 사용시간 리스트</a><br>';
Promise.all([usedtime(packagename)]).then(function(value){
log.info("bar chart draw draw draw")
value[0].forEach((time) => {
var hour = new Date(time-offset).getHours()
switch(true){
case (hour < 2) :
timedataset[0] += 1;
break;
case (hour < 4) :
timedataset[1] += 1;
break;
case (hour < 6) :
timedataset[2] += 1;
break;
case (hour < 8) :
timedataset[3] += 1;
break;
case (hour < 10) :
timedataset[4] += 1;
break;
case (hour < 12) :
timedataset[5] += 1;
break;
case (hour < 14) :
timedataset[6] += 1;
break;
case (hour < 16) :
timedataset[7] += 1;
break;
case (hour < 18) :
timedataset[8] += 1;
break;
case (hour < 20) :
timedataset[9] += 1;
break;
case (hour < 22) :
timedataset[10] += 1;
break;
case (hour < 24) :
timedataset[11] += 1;
break;
}
});
var ctx = document.getElementById("barChart").getContext('2d');
var config = {
type: 'bar',
data: {
labels: ["00-02","02-04","04-06","06-08","08-10","10-12","12-14","14-16","16-18","18-20","20-22","22-24"],
datasets: [{
label: '# of Last used time',
data: timedataset,
backgroundColor: [
'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)','rgba(153, 102, 255, 0.2)','rgba(255, 159, 64, 0.2)',
'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)','rgba(153, 102, 255, 0.2)','rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)','rgba(153, 102, 255, 1)','rgba(255, 159, 64, 1)',
'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)','rgba(153, 102, 255, 1)','rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
stepSize:1
}
}]
}
}
}
if (mychart == null) {
mychart = new Chart(ctx, config);
log.info("bar chart create")
} else {
mychart.config = config;
mychart.update();
log.info("bar chart update")
}
value[0].forEach((time) => {
html1 += `<a class="pl-1" style="font-size: 13px">${new Date(time-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>`;
});
document.querySelector('#apptimelist').innerHTML = html1;
document.getElementById('barchart_title').style.display = "block";
});
resolve(true);
}, 1000)
})
}
var getbyte = function getB(byte){
return new Promise(resolve =>
setTimeout(() => {
if(byte > 1073741824){
resolve((byte/1073741824).toFixed(2) + "GB");
log.info((byte/1073741824).toFixed(2) + "GB");
}
else if(byte > 1048576){
resolve((byte/1048576).toFixed(2) + "MB");
}
else if(byte > 1024){
resolve((byte/1024).toFixed(2) + "KB");
}
}, 1000)
);
}
var alltime = function getAllTime(){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
let sql = `select sum(AppUsageYear.totaltimeforeground) as alltime from AppUsageYear;`
log.info("alltime Query start");
db.get(sql, [], (err, row) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("alltime Query succesfully executed");
log.info(row.alltime);
db.close();
resolve(row.alltime);
}
});
}, 1000)
})
}
var totaltime = function getTotaltime(packagename){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
log.info(packagename);
let sql = `select sum(AppUsageYear.totaltimeforeground) as totaltime from AppUsageYear
where packagename = "${packagename}";`
log.info("totaltime Query start");
db.get(sql, [], (err, row) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("totaltime Query succesfully executed");
log.info(row.totaltime);
db.close();
resolve(row.totaltime);
}
});
}, 1000)
})
}
var totaltimeday = function getTotaltimeDay(){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
let sql = `select sum(AppUsageDay.totaltimeforeground) as totaltime from AppUsageDay;`
log.info("totaltime Query start");
db.get(sql, [], (err, row) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("totaltime Query succesfully executed");
log.info(row.totaltime);
db.close();
resolve(row.totaltime);
}
});
}, 1000)
})
}
var packagedetail = function getPackageDetail(packagename){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
log.info(packagename);
var sql = `select Appinfo.name, Appinfo.packagename, Appinfo.version, Appinfo.firstinstall, Appinfo.lastupdate, Appinfo.wifiusage, Appinfo.cellularusage, sum(AppUsageYear.totaltimeforeground) totaltime\
from AppInfo left join AppUsageYear on AppInfo.packagename = AppUsageYear.packagename\
WHERE Appinfo.packagename = "${packagename}"\
GROUP BY AppUsageYear.packagename;`
log.info("packagedetail Query start");
db.get(sql, [], (err, row) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("packagedetail Query succesfully executed");
db.close();
resolve(row);
}
});
}, 1000)
})
}
var usedtime = function getLasttimeused(packagename){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
log.info(packagename);
var timelist = [];
var sql = `select lasttimeused from AppUsageYear\
where packagename = "${packagename}" and lasttimeused != firsttimestamp\
union\
select lasttimeused from AppUsageMonth
where packagename = "${packagename}" and lasttimeused != firsttimestamp\
union\
select lasttimeused from AppUsageWeek
where packagename = "${packagename}" and lasttimeused != firsttimestamp\
union\
select lasttimeused from AppUsageDay\
where packagename = "${packagename}" and lasttimeused != firsttimestamp;`
log.info("usedtime Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
rows.forEach((row) => {
if(row.lasttimeused>1000000000000){
timelist.push(row.lasttimeused);
}
});
log.info("usedtime Query succesfully executed");
log.info(timelist.length);
resolve(timelist);
});
}, 1000)
})
}
var top10_day = function getTop10(){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
var timelist = [];
var sql = `select Appinfo.name, Appinfo.packagename, sum(AppUsageDay.totaltimeforeground) totaltime from AppInfo, AppUsageDay
where Appinfo.packagename = AppUsageDay.packagename
GROUP BY AppUsageDay.packagename
ORDER BY totaltime desc
LIMIT 10;`
log.info("getTop10 Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("getTop10 Query succesfully executed");
db.close();
resolve(rows)
}
});
}, 1000)
})
}
function getdayusedapp(day){
var date = (day > 9)? day : "0"+day;
const db = new sqlite3.Database('InnerDatabase.db');
var html = `<tr class="pb-2" style="font-size: 13px"><th>name</th><th>last time used</th><th>time</th></tr>`;
var sql = `SELECT AppUsageDay.packagename,AppInfo.name, lasttimeused,totaltimeforeground,strftime('%d',datetime(firsttimestamp/1000, 'unixepoch', 'localtime')) as day FROM AppUsageDay, AppInfo
where day = '${date}' and totaltimeforeground > 0 and AppInfo.packagename = AppUsageDay.packagename
order by lasttimeused;`;
log.info("getdayusedapp Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
rows.forEach((row) => {
var totaltime;
if(row.totaltimeforeground> 3600000){
totaltime = (row.totaltimeforeground/3600000).toFixed(2) + "h";
}
else if(row.totaltimeforeground > 60000){
totaltime = (row.totaltimeforeground/60000).toFixed(2) + "m";
}
else if(row.totaltimeforeground > 1000){
totaltime = (row.totaltimeforeground/1000).toFixed(2) + "s";
}
html += `<tr style="font-size: 13px"><td class="pr-4">${row.name}</td><td class="pr-4">${new Date(row.lasttimeused-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</td><td class="pr-1">${totaltime}</td></tr>`
});
document.querySelector('#day_use_list > tbody').innerHTML = html;
});
var i;
var x = document.getElementsByClassName("sort");
for (i = 0; i < x.length; i++) {
x[i].style.fontWeight = "normal";
}
document.getElementById('day_'+day).style.fontWeight = "bold";
}
var get_recent_dataset = function getRecentDataset(){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
var sql = `select firsttimestamp,lasttimestamp,sum(totaltimeforeground) as totaltime from AppUsageDay
group by firsttimestamp;`
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
var label_array = [];
var bardataset = [];
rows.forEach((row) => {
var date = new Date(row.firsttimestamp-offset);
label_array.push(date.getDate());
bardataset.push(row.totaltime/3600000);
document.getElementById('selectday').innerHTML += `<a id="day_${date.getDate()}" class="sort p-2 text-muted" onclick="getdayusedapp('${date.getDate()}');">${date.getDate()}</a>`;
});
db.close();
var ctx = document.getElementById("recent_bar").getContext('2d');
var config = {
type: 'bar',
data: {
labels: label_array,
datasets: [{
label: 'Hour',
data: bardataset,
backgroundColor: [
'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)','rgba(153, 102, 255, 0.2)','rgba(255, 159, 64, 0.2)',
'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)'
],
borderColor: [
'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)','rgba(153, 102, 255, 1)','rgba(255, 159, 64, 1)',
'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}]
},
responsive: false
}
}
var myChart = new Chart(ctx, config);
getdayusedapp(label_array[0]);
});
}, 1000)
})
}
// var ctxP = document.getElementById("pieChart").getContext('2d');
// var myPieChart = new Chart(ctxP, {
// type: 'pie',
// data: {
// labels: ["Red", "Green", "Yellow", 보라 "Grey", "Dark Grey"],
// datasets: [{
// data: [300, 50, 100, 40, 120],
// backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1", "#4D5360"],
// hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5", "#616774"]
// }]
// },
// options: {
// responsive: true
// }
// });
// db.close();
// var options_main_stacked={
// type: 'bar',
// data: {
// labels: label_text,
// datasets:[{
// label:label_data1_text,
// data:label_data1,
// backgroundColor:'rgba(255, 127, 80, 1)',
// borderColor:'rgba(255, 127, 80, 1)',
// type:"line",
// fill: false
// },
// {
// label:label_data2_text,
// data:label_data2,
// backgroundColor:'rgba(255, 206, 86, 0.2)',
// },
// {
// label:label_data3_text,
// data:label_data3,
// backgroundColor:'rgba(75, 192, 192, 0.2)',
// }]
// },
// options: options_stacked
// };
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
<link rel="stylesheet" href="../assets/css/menu_apps.css">
<title>Document</title>
</head>
<body>
<div class="container">
<header class="menu-header py-4">
<div class="row d-flex justify-content-start flex-nowrap align-items-end">
<div class="col">
<a class="title-name text-dark">Media</a>
</div>
<div div class="col-9">
<a class="title-detail">미디어 파일 분석</a>
</div>
<div div class="col">
<a class="title-back" href="menu.html" id="menu-info">나가기</a>
</div>
</div>
</header>
<div class="nav-scroller nav-color py-1 mb-2">
<nav class="nav d-flex justify-content-around">
<a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Media-Strorage-Structure');">Media Strorage Structure</a>
<a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Video-Analysis');">Video Analysis</a>
</nav>
</div>
<div class="container">
<div id="Media-Strorage-Structure" class="menu">
<div class="row">
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pb-2 mb-0">Media file 저장공간</h6>
<div id="barChartdiv">
<canvas id="pieChart"></canvas>
</div>
<div id="pie_datalist" class="w-75 pt-4">
</div>
</div>
</div>
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pb-2 mb-0">파일 구조 분석</h6>
<div class="row justify-content-end">
<a id="photo" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('photo');" style="font-weight: bold;">Image</a>
<a id="video" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('video');">Video</a>
<a id="audio" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('audio');">Audio</a>
<a id="documentinfo" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('documentinfo');">Document</a>
</div>
<h8 id="struct_title" class="pt-3 pb-3 pl-1 mb-0 font-italic" style="font-size: 17px;">Image</h8>
<div id="mediafile_struct">
<div>
</div>
</div>
</div>
</div>
</div>
<div id="filelist_for_folder" class="row" style="display: none;">
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<h6 id='infilelist' class="border-bottom border-gray pb-2 mb-0 "></h6>
<table id="filetable" class="table">
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="Video-Analysis" class="menu" style="display: none;">
<div class="row">
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pb-2 mb-0">Video 선택</h6>
<div class="check_confirm d-flex justify-content-end p-1">
<button id="temp_post" type="button" class="btn btn-sm btn-primary font-nanum">analysis start</button>
</div>
<table id="videotable" class="table">
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="Analysis-Detail" class="menu" style="display: none;">
<div id ="va_list" class="bg-white rounded shadow-sm">
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
<script src="menu_media.js"></script>
</body>
</html>
\ No newline at end of file
const { ipcRenderer } = require("electron");
const log = require('electron-log')
const sqlite3 = require('sqlite3').verbose();
const offset = new Date().getTimezoneOffset() * 60000;
var exec = require('child_process').exec, child;
var mypiechart = null;
function el(selector) {
return document.getElementById(selector);
}
function cl(selector) {
return document.getElementsByClassName(selector);
}
const videoanalysis = document.getElementById("temp_post");
videoanalysis.addEventListener("click", ()=>{
Promise.all([check()]).then(function(value){
ipcRenderer.send(
"video-analysis",
value[0]
);
});
// check().then(copy).then(result => {
// ipcRenderer.send(
// "video-analysis",
// result
// );
// })
});
var check = function checkboxcheck(){
return new Promise(function(resolve, reject){
setTimeout(function(){
var checkedValue = [];
var inputElements = document.querySelectorAll('#blankCheckbox');
for(var i=0; i < inputElements.length; i++){
if(inputElements[i].checked){
checkedValue.push(inputElements[i].value);
log.info(inputElements[i].value);
}
}
resolve(checkedValue);
}, 1000)
})
}
var copy = function copyfiles(values){
return new Promise(function(resolve, reject){
setTimeout(function(){
values.forEach((value)=>{
cmd_pull = exec('adb pull '+value,function(error, stdout, stderr){
if(error){
console.log(error);
}
});
});
resolve(values);
}, 1000)
})
}
ipcRenderer.on("getvideodetail", (e, arg) => {
log.info(arg + " from main");
Promise.all([popvideoanalysis(arg)]).then(function(value){
log.info(value);
value[0].forEach((pie) => {
log.info("hello")
var ctx = document.getElementById(pie[0]).getContext("2d");
log.info("hello")
new Chart(ctx, pie[1]);
log.info(pie[0] +" dect pie chart create");
})
});
});
document.addEventListener("DOMContentLoaded", function(){
getMediaChart();
getStorageStructure('photo');
video_list();
});
var popvideoanalysis = function popVideoAnalysis(arg){
return new Promise(function(resolve, reject){
setTimeout( function(){
log.info("start popVideoAnalysis");
document.querySelector('#va_list').innerHTML = '';
var mydectpiechart = [];
var x = document.getElementsByClassName("menu");
for (i = 0; i < x.length; i++) {
x[i].style.display = "none"
}
document.getElementById('Analysis-Detail').style.display = "block";
for(var k =0; k < arg[0].length; k++)
{
var lb_dict = arg[0][k];
var dt_dict = arg[1][k];
var html_taglist = ``;
var i,j;
for(i=0; i < lb_dict['labels'].length; i++){
var label_name = lb_dict['labels'][i];
html_taglist += `<div class="font-nanum pb-1 pt-1" style="font-size: 14px;"><a style="font-weight: bold;">${label_name}<a><br>`;
for(j=0; j<lb_dict[label_name].length; j++){
var label_detail = lb_dict[label_name][j];
html_taglist += `<p style="text-align: right;"><a class="pb-1s">${label_detail[0]}s ~ ${label_detail[1]} for ${label_detail[2].toFixed(2)} confidence</a><p>`;
}
html_taglist += '</div>'
}
var likelihood_index = {'UNKNOWN': 0,'VERY_UNLIKELY': 1,'UNLIKELY': 2,'POSSIBLE': 3,'LIKELY': 4,'VERY_LIKELY': 5};
var det_dataset = [0,0,0,0,0,0]
var html_detlist = ``;
var i,j;
for(i=0; i < dt_dict['likelihood'].length; i++){
html_detlist += `<div class="font-nanum pb-2 pt-2" style="font-size: 14px; text-align: right;"><a>~ ${dt_dict['likelihood'][i][0]}s , ${dt_dict['likelihood'][i][1]}</a><div>`;
det_dataset[likelihood_index[dt_dict['likelihood'][i][1]]] +=1;
}
log.info(det_dataset);
var html = `<div class="bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pl-2 pb-2 mb-0">${lb_dict['video']}</h6>
<div class="row">
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pb-2 mb-0">Tag</h6>
<div id="taglist_${lb_dict['video']}" class="pt-2">
${html_taglist}
</div>
</div>
</div>
<div class="col">
<div class="my-3 p-3 bg-white rounded shadow-sm">
<h6 class="border-bottom border-gray pb-2 mb-0">Content Detection</h6>
<div>
<canvas id="det_piechart_${lb_dict['video']}"></canvas>
</div>
<div id="detectionlist_${lb_dict['video']}" class="pt-2">
${html_detlist}
</div>
</div>
</div>
</div>
</div>`;
document.querySelector('#va_list').innerHTML += html;
// var ctx = document.getElementById('det_piechart_'+lb_dict['video']).getContext("2d");
var config = {
type: 'pie',
data: {
labels: ["UNKNOWN","VERY_UNLIKELY", "UNLIKELY","POSSIBLE", "LIKELY","VERY_LIKELY"],
datasets: [{
data: det_dataset,
backgroundColor: ["#D3D3D3", "#C0C0C0", "#A9A9A9", "#FF3333","#FF0000","#CC0000"],
hoverBackgroundColor: ["#D3D3D3", "#C0C0C0", "#A9A9A9", "#FF3333","#FF0000","#CC0000"]
}]
},
options: {
responsive: true,
},
}
mydectpiechart.push(['det_piechart_'+lb_dict['video'],config]);
// mydectpiechart[k] = new Chart(ctx, config);
// log.info('det_piechart_'+lb_dict['video'] +" dect pie chart create");
}
resolve(mydectpiechart);
}, 1000)
})
}
function openTap(tabName) {
var i;
var x = document.getElementsByClassName("menu");
for (i = 0; i < x.length; i++) {
x[i].style.display = "none"
}
document.getElementById(tabName).style.display = "block";
}
function getMediaChart(){
Promise.all([drawpiechart()]).then(function(value){
log.info("getMediaChart finished")
});
}
function getStorageStructure(filetype){
document.querySelector('#mediafile_struct > div').innerHTML = '';
document.querySelector('#filetable > tbody').innerHTML = '';
document.getElementById('filelist_for_folder').style.display = "none";
log.info("getStorageStructure start")
Promise.all([file_struct(filetype)]).then(function(value){
value[0].forEach((row) => {
getByte(row.dirsize).then(function(bytedata) {
document.querySelector('#mediafile_struct > div').innerHTML += `<div class="d-flex justify-content-between p-1"><a href="#" clase="folder_name" onclick="getFilelistinFolder('${row.dir}','${filetype}');" id="${row.dir}">${row.dir} </a><a></a>${bytedata}<br></div>`
});
});
});
var i;
var x = document.getElementsByClassName("filetype");
for (i = 0; i < x.length; i++) {
x[i].style.fontWeight = "normal";
}
document.getElementById(filetype).style.fontWeight = "bold";
switch(filetype){
case 'photo':
document.getElementById('struct_title').innerText = "Image";
break;
case 'video':
document.getElementById('struct_title').innerText = "Video";
break;
case 'audio':
document.getElementById('struct_title').innerText = "Audio";
break;
case 'documentinfo':
document.getElementById('struct_title').innerText = "Document";
break;
}
}
function getFilelistinFolder(foldername,filetype){
log.info("getFilelistinFolder start")
document.querySelector('#filetable > tbody').innerHTML = `<tr><th>name</th>\
<th>date_added</th>\
<th>size</th>\
</tr>`;
Promise.all([fileinfolder(foldername, filetype)]).then(function(value){
value[0].forEach((row) => {
getByte(row.size).then(function(bytedata) {
document.querySelector('#filetable > tbody').innerHTML += `<tr><td>${row.name}</td><td>${new Date(row.date_added*1000-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</td><td>${bytedata}</td></tr>`
});
});
});
document.getElementById('filelist_for_folder').style.display = "block";
}
var drawpiechart = function drawPieChart(){
return new Promise(function(resolve, reject){
setTimeout( function(){
var html = ''
Promise.all([filetype_all_size('photo'),filetype_all_size('video'),filetype_all_size('audio'),filetype_all_size('documentinfo')]).then(function(value){
var ctx = document.getElementById("pieChart").getContext('2d');
var config = {
type: 'pie',
data: {
labels: ["Image", "Video", "Audio", "Documents"],
datasets: [{
data: [value[0], value[1], value[2], value[3]],
backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1"],
hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5"]
}]
},
options: {
responsive: true
}
}
if (mypiechart == null) {
mypiechart = new Chart(ctx, config);
log.info("pie chart create")
} else {
mypiechart.config = config;
mypiechart.update();
log.info("pie chart update")
}
Promise.all([getByte(value[0]),getByte(value[1]),getByte(value[2]),getByte(value[3])]).then(function(b){
var html = `<div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Image </a><a>${b[0]}</a></div>
<div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Video </a><a>${b[1]}</a></div>
<div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Audio </a><a>${b[2]}</a></div>
<div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Document </a><a>${b[3]}</a></div>`
document.querySelector('#pie_datalist').innerHTML = html;
});
});
resolve(true);
}, 1000)
})
}
var getByte = function getB(byte){
return new Promise(function(resolve, reject){
setTimeout( function(){
if(byte > 1073741824){
resolve((byte/1073741824).toFixed(2) + "GB");
}
else if(byte > 1048576){
resolve((byte/1048576).toFixed(2) + "MB");
}
else if(byte > 1024){
resolve((byte/1024).toFixed(2) + "KB");
}
}, 1000)
})
}
var filetype_all_size = function getAllAudioSize(filetype){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
let sql = `select SUM(size) as totalsize from ${filetype};`
log.info("filetype_all_size Query start");
db.get(sql, [], (err, row) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("filetype_all_size Query succesfully executed");
db.close();
resolve(row.totalsize);
}
});
}, 1000)
})
}
var file_struct = function getStruct(filetype){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
let sql = `select replace(SUBSTR(rtrim(path, replace(path, '/', '')),1,LENGTH(rtrim(path, replace(path, '/', '')))-1), rtrim(SUBSTR(rtrim(path, replace(path, '/', '')),1,LENGTH(rtrim(path, replace(path, '/', '')))-1), replace(SUBSTR(rtrim(path, replace(path, '/', '')),1,LENGTH(rtrim(path, replace(path, '/', '')))-1), '/', '')), '') as dir, sum(size) as dirsize
from ${filetype}
group by dir;`
log.info("file_struct Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("file_struct Query succesfully executed");
db.close();
resolve(rows);
}
});
}, 1000)
})
}
var fileinfolder = function getFileinFolder(foldername,filetype){
return new Promise(function(resolve, reject){
setTimeout( function(){
const db = new sqlite3.Database('InnerDatabase.db');
let sql = '';
switch(filetype){
case 'photo':
sql += `select display_name as name, date_added, path, size from ${filetype}
where path LIKE '%${foldername}%';`
document.querySelector('#infilelist').innerText = `Images in ${foldername}`;
break;
case 'video':
sql += `select display_name as name, date_added, path, size from ${filetype}
where path LIKE '%${foldername}%';`
document.querySelector('#infilelist').innerText = `Videos in ${foldername}`;
break;
case 'audio':
sql += `select title as name, date_added, path, size from ${filetype}
where path LIKE '%${foldername}%';`
document.querySelector('#infilelist').innerText = `Audios in ${foldername}`;
break;
case 'documentinfo':
sql += `select name, date_added, path, size from ${filetype}
where path LIKE '%${foldername}%';`
document.querySelector('#infilelist').innerText = `Documents in ${foldername}`;
break;
}
log.info("fileinfolder Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("fileinfolder Query succesfully executed");
db.close();
resolve(rows);
}
});
}, 1000)
})
}
var video_list = function getVideolist(filetype){
return new Promise(function(resolve, reject){
setTimeout( function(){
document.querySelector('#videotable > tbody').innerHTML = `<tr><th></th>
<th>name</th>\
<th>date_added</th>\
<th>resolution</th>\
<th>size</th>\
</tr>`;
const db = new sqlite3.Database('InnerDatabase.db');
let sql = `select display_name as name, date_added, path, resolution, size
from video;`
log.info("video_list Query start");
db.all(sql, [], (err, rows) => {
if (err) {
log.err(err);
reject(err);
throw err;
}
else{
log.info("video_list Query succesfully executed");
rows.forEach((row) => {
getByte(row.size).then(function(bytedata) {
document.querySelector('#videotable > tbody').innerHTML += `<tr><td><div class="form-check">
<input class="form-check-input position-static" type="checkbox" id="blankCheckbox" value="${row.path}">
</div></td>
<td>${row.name}</td><td>${new Date(row.date_added*1000-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</td><td>${row.resolution}</td><td>${bytedata}</td></tr>`
});
});
db.close();
resolve(true);
}
});
}, 1000)
})
}
\ No newline at end of file
// Imports the Google Cloud Video Intelligence library + Node's fs library
const video = require('@google-cloud/video-intelligence').v1;
const fs = require('fs');
const util = require('util');
async function getinfo(){
console.log('before client');
// Creates a client
const client = new video.VideoIntelligenceServiceClient();
console.log('after client');
/**
* TODO(developer): Uncomment the following line before running the sample.
*/
const path = 'C:/Users/yunyoung/Desktop/temp/2016104137/source/forensic_tool/20190525_113617.mp4';
// Reads a local video file and converts it to base64
const readFile = util.promisify(fs.readFile);
const file = await readFile(path);
const inputContent = file.toString('base64');
// Constructs request
const request = {
inputContent: inputContent,
features: ['LABEL_DETECTION'],
};
// Detects labels in a video
const [operation] = await client.annotateVideo(request);
console.log('Waiting for operation to complete...');
const [operationResult] = await operation.promise();
// Gets annotations for video
const annotations = operationResult.annotationResults[0];
const labels = annotations.segmentLabelAnnotations;
labels.forEach(label => {
console.log(`Label ${label.entity.description} occurs at:`);
label.segments.forEach(segment => {
const time = segment.segment;
if (time.startTimeOffset.seconds === undefined) {
time.startTimeOffset.seconds = 0;
}
if (time.startTimeOffset.nanos === undefined) {
time.startTimeOffset.nanos = 0;
}
if (time.endTimeOffset.seconds === undefined) {
time.endTimeOffset.seconds = 0;
}
if (time.endTimeOffset.nanos === undefined) {
time.endTimeOffset.nanos = 0;
}
console.log(
`\tStart: ${time.startTimeOffset.seconds}` +
`.${(time.startTimeOffset.nanos / 1e6).toFixed(0)}s`
);
console.log(
`\tEnd: ${time.endTimeOffset.seconds}.` +
`${(time.endTimeOffset.nanos / 1e6).toFixed(0)}s`
);
console.log(`\tConfidence: ${segment.confidence}`);
});
});
}
//getinfo();
//get_videosaftey();
async function get_videosaftey(){
// Imports the Google Cloud Video Intelligence library
const video = require('@google-cloud/video-intelligence').v1;
console.log('before client');
// Creates a client
const client = new video.VideoIntelligenceServiceClient();
console.log('after client');
/**
* TODO(developer): Uncomment the following line before running the sample.
*/
// const gcsUri = 'GCS URI of video to analyze, e.g. gs://my-bucket/my-video.mp4';
const path = 'C:/Users/yunyoung/Videos/20190525_113617.mp4';
// Reads a local video file and converts it to base64
const readFile = util.promisify(fs.readFile);
const file = await readFile(path);
const inputContent = file.toString('base64');
const request = {
inputContent: inputContent,
features: ['EXPLICIT_CONTENT_DETECTION'],
};
// Human-readable likelihoods
const likelihoods = [
'UNKNOWN',
'VERY_UNLIKELY',
'UNLIKELY',
'POSSIBLE',
'LIKELY',
'VERY_LIKELY',
];
// Detects unsafe content
const [opertaion] = await client.annotateVideo(request);
console.log('Waiting for operation to complete...');
const [operationResult] = await opertaion.promise();
// Gets unsafe content
const explicitContentResults =
operationResult.annotationResults[0].explicitAnnotation;
console.log('Explicit annotation results:');
explicitContentResults.frames.forEach(result => {
if (result.timeOffset === undefined) {
result.timeOffset = {};
}
if (result.timeOffset.seconds === undefined) {
result.timeOffset.seconds = 0;
}
if (result.timeOffset.nanos === undefined) {
result.timeOffset.nanos = 0;
}
console.log(
`\tTime: ${result.timeOffset.seconds}` +
`.${(result.timeOffset.nanos / 1e6).toFixed(0)}s`
);
console.log(
`\t\tPornography likelihood: ${likelihoods[result.pornographyLikelihood]}`
);
});
}
// var ss = `C:\\Users\\yunyoung\\Desktop\\temp\\2016104137\\source\\forensic_tool\\20190215_152731.mp4`
// var h = ss.split('\\');
// var c = '';
// for(var i = 0; i < h.length; i++){
// c += h[i] + '/';
// }
// console.log(c);
// const l = c.slice(0,-1);
// console.log(l);
// console.log(ss);
// var hell = ss.replace('/\\/g','/');
// console.log(hell);
const labels = [['landmark',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['tourist destination',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['tourism',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['historic site',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['building',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]]];
console.log(labels);
var content = {video : '2020',labels : []}
labels.forEach(label => {
content['labels'].push(label[0]);
content[label[0]] = [];
label[1].forEach(segment => {
var temp = [segment[0],segment[1]];
content[label[0]].push(temp);
});
});
console.log(content);
var array = content['labels'];
array.forEach(label =>{
for(var i = 0; i < content[label].length; i++){
console.log(content[label][i]);
}
});
var likelihood_index = {'UNKNOWN': 0,'VERY_UNLIKELY': 1,'UNLIKELY': 2,'POSSIBLE': 3,'LIKELY': 4,'VERY_LIKELY': 5};
var det_dataset = [0,0,0,0,0,0]
det_dataset[likelihood_index[dt_dict['likelihood'][i][1]]] +=1;
var ctx = document.getElementById('det_piechart_'+lb_dict['video']);
var config = {
type: 'pie',
data: {
labels: ["UNKNOWN", "VERY_UNLIKELY", "UNLIKELY", "POSSIBLE","LIKELY",'VERY_LIKELY'],
datasets: [{
data: det_dataset,
backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1"],
hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5"]
}]
},
options: {
responsive: true
}
}
\ No newline at end of file