--- /dev/null
+package hu.user.mediacube.executors.tests;\r
+\r
+import java.util.Arrays;\r
+\r
+import org.junit.Test;\r
+\r
+public class PracticeTests {\r
+\r
+ public static int[] _01_Two_Sum(int[] nums, int target) {\r
+ for (int j = 0; j < nums.length; j++) {\r
+ for (int i = j + 1; i < nums.length; i++) {\r
+ if (nums[i] + nums[j] == target)\r
+ return new int[] { j, i };\r
+ // System.out.println("compare " + j + " " + i);\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ @Test\r
+ public void test() throws Exception {\r
+\r
+ int[] nums = { 2, 7, 11, 15 };\r
+ int target = 9;\r
+ int[] result = _01_Two_Sum(nums, target);\r
+\r
+ System.out.println(Arrays.toString(result));\r
+\r
+ }\r
+\r
+}\r
import java.nio.file.Paths;\r
import java.nio.file.attribute.BasicFileAttributes;\r
import java.util.Arrays;\r
+import java.util.LinkedHashSet;\r
import java.util.List;\r
import java.util.Map;\r
+import java.util.Set;\r
\r
+import org.apache.commons.io.FileUtils;\r
import org.apache.commons.io.FilenameUtils;\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
-import org.apache.logging.log4j.message.Message;\r
-import org.apache.logging.log4j.message.ParameterizedMessage;\r
\r
import com.ibm.nosql.json.api.BasicDBObject;\r
\r
import user.commons.JobStatus;\r
import user.commons.ListUtils;\r
-import user.commons.log4j2.marker.MediaCubeMarker;\r
import user.commons.mediatool.MediaInfo;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
private int submitted;\r
private int killDateDays;\r
private boolean disableProxy;\r
+ private Set<String> includeList;\r
\r
private boolean canReadMediaInfo(Path mediaFilePath) {\r
boolean result = false;\r
this.disableProxy = disableProxy;\r
logger.info(getSessionMarker(), "Starting in {}", sourcePath);\r
try {\r
+ String location = "/opt/test-mediacube/file_list_original.txt";\r
+ includeList = loadIncludeList(location);\r
+\r
if (getJobRuntime().forkPrepare()) {\r
Files.walkFileTree(Paths.get(sourcePath), this);\r
}\r
result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
result.setMediaType(json.getString(MEDIA_TYPE));\r
}\r
+\r
+ if (result == null) {\r
+ logger.info(getSessionMarker(), "Metadata not available for {}", mediaHouseId);\r
+\r
+ if (mediaHouseId.charAt(mediaHouseId.length() - 2) == '-') {\r
+ mediaHouseId = mediaHouseId.substring(0, mediaHouseId.length() - 2);\r
+ logger.info(getSessionMarker(), "Checking metadata for {}", mediaHouseId);\r
+ ArchiveItem metadata = getPlanAirMetadata(mediaHouseId);\r
+ // elenorizni, hogy ez tenyleg az e\r
+\r
+ if (metadata == null)\r
+ logger.info(getSessionMarker(), "Metadata not available for {}", mediaHouseId);\r
+ else\r
+ logger.info(getSessionMarker(), "Metadata is available for {}: {}", mediaHouseId,\r
+ metadata.getMediaTitle());\r
+ }\r
+\r
+ }\r
+\r
return result;\r
}\r
\r
return FileVisitResult.CONTINUE;\r
}\r
\r
+ private boolean removeFile(Path filePath) {\r
+ boolean result = false;\r
+ try {\r
+ File file = filePath.toFile();\r
+ if (file.exists()) {\r
+ logger.info(getSessionMarker(), "Törlés {}", filePath);\r
+ result = file.delete();\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), "A {} fájl nem törölhető. A rendszer hibaüzenete: {}", filePath,\r
+ e.getMessage());\r
+ }\r
+ return result;\r
+ }\r
+\r
@Override\r
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes)\r
throws IOException {\r
}\r
\r
private boolean processPathItem(Path mediaPath) throws Exception {\r
+\r
+ boolean includeContains = includeList.contains(mediaPath.toString());\r
+ if (!includeContains) {\r
+ logger.info(getSessionMarker(), "Not on whitelist {}, skipping", mediaPath);\r
+ return false;\r
+ }\r
+\r
if (limit != 0 && submitted == limit) {\r
logger.info(getSessionMarker(), "Limit reached {}, canceling", limit);\r
return false;\r
\r
File mediaFile = mediaPath.toFile();\r
if (mediaFile.isDirectory()) {\r
- // logger.info(getSessionMarker(), "Skipping directory {}", mediaPath);\r
- return false;\r
- }\r
-\r
- if (EscortFiles.isMediaCatched(mediaPath)) {\r
- // logger.info(getSessionMarker(), "Skipping already catched {}", mediaPath);\r
return false;\r
}\r
\r
Path nomdFile = Paths.get(mediaPath.toString() + ".nomd");\r
\r
if (nomdFile.toFile().exists()) {\r
- // logger.info(getSessionMarker(), "Skipping nomd file exists {}", nomdFile);\r
+ // toroljuk es ujbol letrehozzuk ha kell\r
+ if (!removeFile(nomdFile)) {\r
+ logger.info(getSessionMarker(), "Can't delete nomd file for {}, skipping", nomdFile);\r
+ return false;\r
+ }\r
+ if (EscortFiles.isMediaCatched(mediaPath)) {\r
+ Path catchedFile = EscortFiles.createMediaCatchFilePath(mediaPath);\r
+ if (!removeFile(catchedFile)) {\r
+ logger.info(getSessionMarker(), "Can't delete catched file for {}, skipping", nomdFile);\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (EscortFiles.isMediaCatched(mediaPath)) {\r
+ // logger.info(getSessionMarker(), "Skipping already catched {}", mediaPath);\r
return false;\r
}\r
\r
ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
\r
if (archiveItem == null) {\r
- Message msg = new ParameterizedMessage("Nincs metaadat!");\r
- logger.info(new MediaCubeMarker("vasary@elgekko.net,muszak@mediavivantis.hu",\r
- "Értesítés problémás " + mediaPath.getFileName().toString() + " archiválásról"), msg);\r
+// Message msg = new ParameterizedMessage("Nincs metaadat!");\r
+// logger.info(new MediaCubeMarker("vasary@elgekko.net,muszak@mediavivantis.hu",\r
+// "Értesítés problémás " + mediaPath.getFileName().toString() + " archiválásról"), msg);\r
Files.createFile(nomdFile);\r
return false;\r
}\r
logger.error(getSessionMarker(),\r
"A(z) '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", mediaPath,\r
e.getMessage());\r
+ return false;\r
}\r
\r
return true;\r
logger.info("Error archive {}", filePath);\r
return FileVisitResult.CONTINUE;\r
}\r
+\r
+ private Set<String> loadIncludeList(String location) throws IOException {\r
+ Set<String> result = new LinkedHashSet<>();\r
+\r
+ Path path = Paths.get(location);\r
+ List<String> lines = FileUtils.readLines(path.toFile());\r
+\r
+ String lastDir = null;\r
+ for (String line : lines) {\r
+ line = line.trim();\r
+ if (line.startsWith("Directory of")) {\r
+ lastDir = line;\r
+ lastDir = lastDir.replace("Directory of", "");\r
+ lastDir = lastDir.replace("X:", "");\r
+ lastDir = lastDir.replace("\\", "/");\r
+ lastDir = lastDir.trim();\r
+ // if (!lastDir.endsWith(".STATUS"))\r
+ // System.out.println(">> " + lastDir);\r
+ }\r
+\r
+ if (lastDir != null && lastDir.endsWith(".STATUS"))\r
+ continue;\r
+\r
+ if (line.startsWith("2") && line.length() > 39) {\r
+ String file = line.substring(39).trim();\r
+\r
+ if (file.equals(".") || file.equals(".."))\r
+ continue;\r
+\r
+ String len = line.substring(21, 39).trim();\r
+ if (len.length() != 0) {\r
+ String fullpath = "/mnt/POLC/FINISHED_SHOWS" + lastDir + "/" + file;\r
+ // System.out.println("/mnt/POLC/FINISHED_SHOWS" + lastDir + "/" + file + " : "\r
+ // + len);\r
+ result.add(fullpath);\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
}\r
import java.util.List;\r
\r
import org.apache.commons.io.FilenameUtils;\r
-import org.apache.ibatis.jdbc.SQL;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
\r
public class MetadataSyncRecursiveStep extends JobStep implements FileVisitor<Path> {\r
private static final Logger logger = LogManager.getLogger();\r
\r
- private static final String ITEM_TITLE = "itemTitle";\r
- private static final String ITEM_HOUSEID = "itemHouseId";\r
- private static final String MEDIA_HOUSEID = "mediaHouseId";\r
- private static final String MEDIA_TITLE = "mediaTitle";\r
- private static final String MEDIA_DESCRIPTION = "mediaDescription";\r
- private static final String MEDIA_TYPE = "mediaType";\r
-\r
private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", EscortFiles.STATUSFOLDER,\r
EscortFiles.CONFLICTFOLDER);\r
\r
}\r
}\r
if (json != null) {\r
- result = new ArchiveItem();\r
- result.setItemHouseId(json.getString(ITEM_HOUSEID));\r
- result.setItemTitle(json.getString(ITEM_TITLE));\r
- result.setMediaHouseId(json.getString(MEDIA_HOUSEID));\r
- result.setMediaTitle(json.getString(MEDIA_TITLE));\r
- result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
- result.setMediaType(json.getString(MEDIA_TYPE));\r
+ logger.info(getSessionMarker(), json.toString());\r
+ result = ArchiveItem.fromJSONObject(json);\r
}\r
\r
if (result == null) {\r
ArchiveItem metadata = getPlanAirMetadata(mediaHouseId);\r
if (metadata == null)\r
logger.info(getSessionMarker(), "Metadata not available for {}", mediaHouseId);\r
- else\r
+ else {\r
logger.info(getSessionMarker(), "Metadata is available for {}: {}", mediaHouseId,\r
metadata.getMediaTitle());\r
+\r
+ if (mediaHouseId.equals(metadata.getForeignMediaId()))\r
+ result = metadata;\r
+ }\r
}\r
\r
}\r
long size = mediaFSFile.length();\r
boolean mcArchived = mediaFile != null;\r
boolean metadataEquals = false;\r
- boolean tsmArchived = false;\r
boolean sizeEquals = false;\r
long tsmSize = 0;\r
\r
// tsm\r
String tsmFileName = mediaFile.getRelativePath();\r
RemoteFile tsmFile = getTSMFile(tsmFileName);\r
- tsmArchived = tsmFile != null;\r
- if (tsmArchived) {\r
+ if (tsmFile != null) {\r
tsmSize = tsmFile.getSize();\r
sizeEquals = tsmSize == size;\r
+ logger.info(getSessionMarker(),\r
+ "Sync status: | metadataEquals {} | sizeEquals {} | archiveItem {} for {}", metadataEquals,\r
+ sizeEquals, archiveItem != null, mediaPath);\r
\r
if (sizeEquals && archiveItem != null && !metadataEquals) {\r
syncMetadata(mediaPath, item, media, archiveItem, mediaFile);\r
return true;\r
}\r
\r
- public String createUpdateItemQuery(long itemId, ArchiveItem archiveItem) {\r
- SQL sql = new SQL();\r
- sql.UPDATE("ITEM");\r
- sql.SET(String.format("HOUSEID='%s'", archiveItem.getItemHouseId()));\r
- sql.SET(String.format("TITLE='%s'", archiveItem.getItemTitle()));\r
- sql.WHERE(String.format("ID = %d", itemId));\r
- return sql.toString();\r
- }\r
-\r
- public String createUpdateMediaQuery(long mediaId, ArchiveItem archiveItem) {\r
- SQL sql = new SQL();\r
- sql.UPDATE("MEDIA");\r
- sql.SET(String.format("HOUSEID='%s'", archiveItem.getMediaHouseId()));\r
- sql.SET(String.format("TITLE='%s'", archiveItem.getMediaTitle()));\r
- sql.SET(String.format("DESCRIPTION='%s'", archiveItem.getMediaDescription()));\r
- sql.WHERE(String.format("ID = %d", mediaId));\r
- return sql.toString();\r
- }\r
-\r
private void syncMetadata(Path mediaPath, Item item, Media media, ArchiveItem archiveItem, MediaFile mediaFile) {\r
- String sql = createUpdateItemQuery(item.getId(), archiveItem);\r
- getManager().executeUpdate(sql, null, null);\r
- // logger.info(getSessionMarker(), sql);\r
- sql = createUpdateMediaQuery(media.getId(), archiveItem);\r
- // logger.info(getSessionMarker(), sql);\r
- getManager().executeUpdate(sql, null, null);\r
+\r
+ item.setId(0);\r
+ item.setHouseId(archiveItem.getItemHouseId());\r
+ item.setTitle(archiveItem.getItemTitle());\r
+ getManager().merge(item);\r
+ logger.info(getSessionMarker(), "Created new item {}", item.getId());\r
+\r
+ media.setItemId(item.getId());\r
+ media.setHouseId(archiveItem.getMediaHouseId());\r
+ media.setTitle(archiveItem.getMediaTitle());\r
+ media.setDescription(archiveItem.getMediaDescription());\r
+ getManager().merge(media);\r
+ logger.info(getSessionMarker(), "Updated media {}", media.getId());\r
}\r
\r
@Override\r
Files.createFile(catchedFile);\r
}\r
\r
- private static Path createMediaCatchFilePath(Path mediaFile) {\r
+ public static Path createMediaCatchFilePath(Path mediaFile) {\r
return Paths.get(mediaFile.getParent().toString(), STATUSFOLDER, mediaFile.getFileName() + DOT_CATCHED);\r
}\r
\r
package user.jobengine.server.steps;\r
\r
import java.io.File;\r
+import java.io.FileNotFoundException;\r
import java.io.IOException;\r
import java.io.Serializable;\r
import java.nio.file.Files;\r
import java.nio.file.Path;\r
\r
+import org.apache.commons.lang.NullArgumentException;\r
+\r
import com.ibm.nosql.json.JSONUtil;\r
import com.ibm.nosql.json.api.BasicDBList;\r
import com.ibm.nosql.json.api.BasicDBObject;\r
public static final String MEDIA_TYPE = "mediaType";\r
private static final String DURATION = "duration";\r
private static final String EXISTING_MEDIAID = "existingMediaId";\r
+ private static final String FOREIGN_MEDIAID = "foreignMediaId";\r
private static final String TAGS = "tags";\r
\r
public static ArchiveItem fromFile(Path jsonFilePath) throws IOException {\r
- ArchiveItem result = null;\r
byte[] readAllBytes = null;\r
+\r
+ if (!jsonFilePath.toFile().exists())\r
+ throw new FileNotFoundException("JSON file not exists: " + jsonFilePath);\r
+\r
readAllBytes = Files.readAllBytes(jsonFilePath);\r
BasicDBObject dbObject = (BasicDBObject) JSONUtil.jsonToDbObject(new String(readAllBytes));\r
+\r
+ return fromJSONObject(dbObject);\r
+ }\r
+\r
+ public static ArchiveItem fromJSONObject(BasicDBObject dbObject) throws IOException {\r
+ ArchiveItem result = null;\r
if (dbObject == null)\r
- throw new NullPointerException("Can not parse JSON file: " + jsonFilePath);\r
+ throw new NullArgumentException("JSON object is empty!");\r
+\r
result = new ArchiveItem();\r
- result.setItemHouseId(getMetadata(dbObject, ITEM_HOUSEID));\r
- result.setItemTitle(getMetadata(dbObject, ITEM_TITLE));\r
- result.setItemDescription(getMetadata(dbObject, ITEM_DESCRIPTION));\r
- result.setMediaHouseId(getMetadata(dbObject, MEDIA_HOUSEID));\r
- result.setMediaTitle(getMetadata(dbObject, MEDIA_TITLE));\r
- result.setMediaDescription(getMetadata(dbObject, MEDIA_DESCRIPTION));\r
- result.setMediaType(getMetadata(dbObject, MEDIA_TYPE));\r
+ result.setItemHouseId(NoSQLUtils.asString(dbObject, ITEM_HOUSEID));\r
+ result.setItemTitle(NoSQLUtils.asString(dbObject, ITEM_TITLE));\r
+ result.setItemDescription(NoSQLUtils.asString(dbObject, ITEM_DESCRIPTION));\r
+ result.setMediaHouseId(NoSQLUtils.asString(dbObject, MEDIA_HOUSEID));\r
+ result.setMediaTitle(NoSQLUtils.asString(dbObject, MEDIA_TITLE));\r
+ result.setMediaDescription(NoSQLUtils.asString(dbObject, MEDIA_DESCRIPTION));\r
+ result.setMediaType(NoSQLUtils.asString(dbObject, MEDIA_TYPE));\r
result.setDuration(NoSQLUtils.asLong(dbObject, DURATION));\r
result.setExistingMediaId(NoSQLUtils.asLong(dbObject, EXISTING_MEDIAID));\r
- result.setTags(getMetadatas(dbObject, TAGS));\r
+ result.setTags(NoSQLUtils.asDBList(dbObject, TAGS));\r
\r
return result;\r
}\r
\r
- private static String getMetadata(BasicDBObject dbObject, String fieldName) {\r
- String result = null;\r
- if (dbObject.containsKey(fieldName))\r
- result = dbObject.getString(fieldName);\r
- return result;\r
- }\r
-\r
- private static BasicDBList getMetadatas(BasicDBObject dbObject, String fieldName) {\r
- BasicDBList result = null;\r
- if (dbObject.containsKey(fieldName))\r
- result = (BasicDBList) dbObject.get(fieldName);\r
- return result;\r
- }\r
-\r
private String itemTitle;\r
private String itemHouseId;\r
private String itemDescription;\r
private String mediaType;\r
private long duration;\r
private long existingMediaId;\r
+ private String foreignMediaId;\r
private boolean disableProxy;\r
\r
private BasicDBList tags;\r
this.disableProxy = disableProxy;\r
}\r
\r
+ public String getForeignMediaId() {\r
+ return foreignMediaId;\r
+ }\r
+\r
+ public void setForeignMediaId(String foreignMediaId) {\r
+ this.foreignMediaId = foreignMediaId;\r
+ }\r
+\r
}\r
import user.mediacube.metadata.interfaces.IMetadata;\r
\r
public class PlanAirAD implements IMetadata {\r
- private String mediaID; //t_MediaID\r
- private String title; //v_Title\r
- private int spotID;//t_SpotID\r
- private String okForAirs; //v_OkForAirs\r
+ private String mediaID; // t_MediaID\r
+ private String title; // v_Title\r
+ private int spotID;// t_SpotID\r
+ private String okForAirs; // v_OkForAirs\r
\r
@Override\r
public BasicDBObject asJSON() {\r
BasicDBObject result = new BasicDBObject();\r
+ result.put("mediaId", mediaID);\r
result.put("itemHouseId", mediaID);\r
result.put("itemTitle", title);\r
result.put("mediaHouseId", mediaID);\r
@Override\r
public BasicDBObject asJSON() {\r
BasicDBObject result = new BasicDBObject();\r
+ result.put("mediaId", mediaID);\r
result.put("itemHouseId", programmeID);\r
result.put("itemTitle", progTitle);\r
result.put("mediaHouseId", episodeID);\r
import user.mediacube.metadata.interfaces.IMetadata;\r
\r
public class PlanAirPromo implements IMetadata {\r
- private String mediaID; //t_MediaID\r
- private String title; //v_Title\r
- private String progTitle;//v_ProgTitle\r
- private short episode;//v_Episode\r
- private Date psStart;//t_PSStart\r
- private int spotID;//t_SpotID\r
- private String okForAirs; //v_OkForAirs\r
+ private String mediaID; // t_MediaID\r
+ private String title; // v_Title\r
+ private String progTitle;// v_ProgTitle\r
+ private short episode;// v_Episode\r
+ private Date psStart;// t_PSStart\r
+ private int spotID;// t_SpotID\r
+ private String okForAirs; // v_OkForAirs\r
\r
@Override\r
public BasicDBObject asJSON() {\r
BasicDBObject result = new BasicDBObject();\r
+ result.put("mediaId", mediaID);\r
result.put("itemHouseId", mediaID);\r
result.put("itemTitle", title);\r
result.put("mediaHouseId", mediaID);\r