Advertisement
Guest User

Untitled

a guest
Apr 6th, 2018
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.61 KB | None | 0 0
  1. package scripts.warner
  2.  
  3. import com.google.common.base.Stopwatch
  4. import com.google.common.collect.Lists
  5. import com.google.common.collect.Sets
  6. import com.zina.console.export.FingerprintUtil
  7. import com.zina.console.export.ImportUtil
  8. import com.zina.console.export.UnbendedFingerprintUtil
  9. import com.zina.domain.*
  10. import com.zina.domain.album.Album
  11. import com.zina.domain.album.AlbumItem
  12. import com.zina.domain.artist.Artist
  13. import com.zina.domain.dao.ArtistDao
  14. import com.zina.domain.dao.AudioTrackDao
  15. import com.zina.domain.dao.ProtectedAudioTrackDao
  16. import com.zina.domain.dao.CopyrightDao
  17. import com.zina.domain.dao.ProtectedCopyrightDao
  18. import com.zina.domain.dao.PersonDao
  19. import com.zina.domain.dao.TagDao
  20. import com.zina.domain.dao.album.AlbumDao
  21. import com.zina.domain.dao.album.AlbumItemDao
  22. import com.zina.domain.dao.rightpossessor.RightPossessorDao
  23. import com.zina.fingerprint.HashShift
  24. import com.zina.fprocessing.domain.Entry
  25. import com.zina.fprocessing.domain.EntryAddress
  26. import com.zina.fprocessing.worker.IAudioEncodeWorker
  27. import com.zina.fprocessing.worker.exception.WorkerError
  28. import com.zina.fprocessing.worker.local.*
  29. import com.zina.service.CopyrightService
  30. import com.zina.service.artist.ArtistService
  31. import com.zina.service.audiotrack.AudioTrackService
  32. import com.zina.service.audiotrack.AudioTrackUnionService
  33. import com.zina.service.fileRestriction.FileRestrictionAddRuleBean
  34. import com.zina.service.fileRestriction.FileRestrictionService
  35. import com.zina.service.mail.MailService
  36. import com.zina.service.warner.WarnerFileRestrictionService
  37. import com.zina.util.DKeyGenerationUtil
  38. import com.zina.util.EntryAddressUtil
  39. import com.zina.util.StringUtil
  40. import com.zina.warner.FillWarnerMetaDB
  41. import com.zina.warner.WarnerModelBeanMapper
  42. import com.zina.warner.connector.SSHConnector
  43. import com.zina.warner.historian.Historian
  44. import com.zina.warner.marshall.WarnerModelBean
  45. import groovy.sql.Sql
  46. import net.schmizz.sshj.sftp.SFTPClient
  47. import org.apache.ibatis.session.SqlSession
  48. import org.apache.ibatis.session.SqlSessionFactory
  49. import org.apache.ibatis.session.SqlSessionFactoryBuilder
  50. import org.codehaus.jackson.map.ObjectMapper
  51. import org.mapdb.DBMaker
  52. import org.springframework.orm.jpa.EntityManagerHolder
  53. import org.springframework.transaction.support.TransactionCallback
  54. import org.springframework.transaction.support.TransactionSynchronizationManager
  55. import org.springframework.transaction.support.TransactionTemplate
  56.  
  57. import java.io.File
  58. import java.sql.Time
  59. import java.text.SimpleDateFormat
  60. import static com.google.common.base.Strings.isNullOrEmpty
  61. import static com.zina.fingerprint.util.TransformUtil.sortCodes
  62. import static com.zina.fingerprint.util.TransformUtil.splitCodes
  63. import static java.util.concurrent.TimeUnit.SECONDS
  64.  
  65. /**
  66. * User: vad
  67. * Date: 3/31/15
  68. * импорт каталога от WB. Без использования ранее сохранённой метаинформации
  69. *
  70. * бывший directLoad2MogileRetry2.groovy
  71. *
  72. */
  73.  
  74. version = "0.2.11.2015.12.23"
  75. println "start {$version} at " + new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date())
  76. sqlM = Sql.newInstance("jdbc:mysql://95.183.15.191:3306/zaycev_new", "zaycev_net", "BNdS3D7g", "com.mysql.jdbc.Driver")
  77. println args
  78. // ---------------------------------------------------------------------------------------------------------------------
  79. processMatching = true
  80. processToFtp = true
  81.  
  82. //DELIMITER = "\t"
  83. RESOURCES = "resources"
  84. SUFFIX = ".dfugv"
  85. FP = "fp"
  86. ORIGINAL_TRACK_POSTFIX = ".otmbm";
  87.  
  88. DEFAULT_SHARE = 200.0f
  89. RP_ID = 8919L
  90.  
  91. SIZE_LIMIT = 100000
  92.  
  93. NAME_LIMIT = 255 - 3
  94.  
  95. FORBIDDEN_GENRES = ["Spoken Word"]
  96.  
  97. // ---------------------------------------------------------------------------------------------------------------------
  98. workDir = System.getProperty("user.home") + "/zina/warner-retry2/catalog"
  99. workerDir = workDir + "/worker"
  100. workerStoreDir = workDir + "/tmp"
  101. workMp3Dir = workDir + "/mp3"
  102.  
  103. (new File(workDir)).mkdirs()
  104. (new File(workerDir)).mkdirs()
  105. (new File(workerStoreDir)).mkdirs()
  106. (new File(workMp3Dir)).mkdirs()
  107.  
  108. emf = ctx.getBean("entityManagerFactory")
  109. em = emf.createEntityManager()
  110. TransactionSynchronizationManager.bindResource(emf, new EntityManagerHolder(em))
  111.  
  112. withTx = { TransactionTemplate txt, Closure c ->
  113. return txt.execute(c as TransactionCallback)
  114. }
  115.  
  116. warnerFileRestrictionService = ctx.getBean(WarnerFileRestrictionService)
  117. fileRestrictionService = ctx.getBean(FileRestrictionService)
  118. rightPossessorDao = ctx.getBean(RightPossessorDao)
  119. audioTrackDao = ctx.getBean(AudioTrackDao)
  120. protectedAudioTrackDao = ctx.getBean(ProtectedAudioTrackDao)
  121. audioTrackQueryService = ctx.getBean("audioTrackQueryService")
  122. artistDao = ctx.getBean(ArtistDao)
  123. artistService = ctx.getBean(ArtistService)
  124. audioTrackService = ctx.getBean(AudioTrackService)
  125. audioTrackUnionService = ctx.getBean(AudioTrackUnionService)
  126. copyrightDao = ctx.getBean(CopyrightDao)
  127. protectedCopyrightDao = ctx.getBean(ProtectedCopyrightDao)
  128. albumDao = ctx.getBean(AlbumDao)
  129. albumItemDao = ctx.getBean(AlbumItemDao)
  130. entryAddressUtil = ctx.getBean(EntryAddressUtil)
  131. tagDao = ctx.getBean(TagDao)
  132. mailService = ctx.getBean(MailService)
  133. idDesc = Long.valueOf(2000000000000L)
  134. personDao = ctx.getBean(PersonDao)
  135. сopyrightService = ctx.getBean(CopyrightService)
  136. //idDesc = Long.valueOf(propertiesUtil.getProperty("global.idDesc.futureDate"))
  137.  
  138. // ---------------------------------------------------------------------------------------------------------------------
  139. final sdp = new SimpleDateFormat("yyyy.MM.dd_HH:mm:ss")
  140. final sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss")
  141. final logFileName = workDir + "/${sdf.format(new Date())}.log"
  142. final logFile = new File(logFileName)
  143. log = { msg ->
  144. println msg
  145. logFile.append("${sdp.format(new Date())}: ${msg}\n")
  146. }
  147.  
  148. final eventFreq = [done:0, alreadyProcessedFail:0, emptyFileNameFail:0, emptyArtistNameFail:0, emptyTrackNameFail:0, copyrightsAlreadyExistFail:0, downloadFail:0, sizeLimitFail: 0, forbiddenGenre: 0]
  149. incrementEvent = { eventName ->
  150. def curFreq = eventFreq.get(eventName)
  151. curFreq++
  152. eventFreq.put(eventName, curFreq)
  153. }
  154.  
  155. // ---------------------------------------------------------------------------------------------------------------------
  156. sftpHost = "bak5.serv"
  157. sftpPort = 22
  158. sftpUser = "interakt"
  159. sftpPrivateKeyPath = System.getProperty("user.home") + "/.ssh/id_dsa"
  160. historianStorePath = workDir + "/historian"
  161.  
  162. // ---------------------------------------------------------------------------------------------------------------------
  163. InputStream inputStream = FillWarnerMetaDB.class.getClass().getResourceAsStream("/mybatis-config.xml")
  164. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  165. SqlSession sqlSession = sqlSessionFactory.openSession();
  166. modelBeanMapper = sqlSession.getMapper(WarnerModelBeanMapper.class);
  167.  
  168. println "В modelBeanMapper ${modelBeanMapper.count()} записей"
  169. println "В modelBeanMapper ${modelBeanMapper.countIsrc()} уникальных isrc"
  170.  
  171. copyrightCatIdSet = DBMaker.newTempHashSet()
  172. rightCatIdSet = DBMaker.newTempTreeSet()
  173. absentCatIdSet = Sets.newHashSet()
  174.  
  175. packageDirSet = Sets.newHashSet()
  176. // ---------------------------------------------------------------------------------------------------------------------
  177. codegenPath = System.getProperty("user.home") + "/bin/echoprint-codegen"
  178.  
  179. om = new ObjectMapper()
  180.  
  181. inputDirPath = "warner"
  182.  
  183. // ---------------------------------------------------------------------------------------------------------------------
  184. stopwatch = new Stopwatch().start()
  185.  
  186. count = 0
  187.  
  188. RightPossessor rightPossessor = rightPossessorDao.find(RP_ID)
  189. if (rightPossessor == null) {
  190. println "не найден ПО ${RP_ID}"
  191. System.exit(0)
  192. }
  193.  
  194. Person person = personDao.find(10902590L)
  195.  
  196. if (person == null) {
  197. println "не найден Пользователь для ${RP_ID}"
  198. System.exit(0)
  199. }
  200.  
  201. historian = new Historian(historianStorePath)
  202. println "already pass ${historian.okSet.size()} row"
  203.  
  204. sshConnector = new SSHConnector(sftpHost, sftpPort, sftpUser, sftpPrivateKeyPath);
  205. client = sshConnector.getClient()
  206. try {
  207. absentCatIdSet = ImportUtil.buildAbsentCatId(em, modelBeanMapper)
  208. packageDirSet = ImportUtil.buildPackageDirList(client, inputDirPath)
  209. process(rightPossessor, person)
  210. } catch (Throwable t) {
  211. log("Some crazy exception occurred, can not continue process: " + t.getLocalizedMessage())
  212. t.printStackTrace()
  213. }
  214. def message =
  215. "Обработано: ${eventFreq.get("done")},\n" +
  216. // "Не обработано ${eventFreq.values().sum()} :" +
  217. "уже обрабатывались: ${eventFreq.get("alreadyProcessedFail")},\n" +
  218. "пустое имя файла: ${eventFreq.get("emptyFileNameFail")},\n" +
  219. "пустое поле имени артиста: ${eventFreq.get("emptyArtistNameFail")},\n" +
  220. "пустое поле названия трека: ${eventFreq.get("emptyTrackNameFail")},\n" +
  221. "копирайты уже проставлены: ${eventFreq.get("copyrightsAlreadyExistFail")}," +
  222. "ошибка скачки файла: ${eventFreq.get("downloadFail")},\n" +
  223. "размер файла меньше лимита: ${eventFreq.get("sizeLimitFail")},\n" +
  224. "содержит запрещённый жанр: ${eventFreq.get("forbiddenGenre")}"
  225. mailFromAddress = "report-generator@zaycev.net"
  226. mailToAddress = "zina-warn@mailman.z-inc.net"
  227. subject="Отчет по импорту Warner"
  228. mailService.sendTextMessage(mailFromAddress, subject, mailToAddress, message)
  229.  
  230. println "Done " + stopwatch.elapsedTime(SECONDS) + "s"
  231. System.exit(0)
  232.  
  233. // ---------------------------------------------------------------------------------------------------------------------
  234. def process(RightPossessor rightPossessor, Person person) {
  235. for (String catId : absentCatIdSet) {
  236. println "## catId: " + catId
  237.  
  238. List<WarnerModelBean> restock = modelBeanMapper.findByIsrc(catId)
  239.  
  240. def found = false
  241.  
  242. for (int i = 0; i <= restock.size() - 1; i++) {
  243. // с начала
  244. WarnerModelBean modelBean = restock.get(i)
  245. def releaseDate = modelBean.getReleaseDisplayStartDate()
  246. def now = new Date()
  247. if (releaseDate == null || releaseDate.before(now)) { // если дата релиза в прошлом, то импортируем
  248. if (!found && modelBean.trackPath != null && modelBean.trackPath.contains("mp3") && packageExist(modelBean.src)) {
  249. found = true
  250. withTx(txTemplate, {
  251. processOriginal(rightPossessor, person, modelBean, restock.get(0).countryRightMapAsMap)
  252. })
  253. }
  254. }
  255. }
  256.  
  257. if(!found) {
  258. log("${catId} not found")
  259. }
  260. }
  261. }
  262.  
  263. File retreiveFile(String trackPath, String ext) {
  264. if (!client.isConnected()) {
  265. log "client not connected. reget client"
  266. client.close()
  267. client = sshConnector.getClient()
  268. }
  269.  
  270. File tmpFile = new File(workMp3Dir, StringUtil.uidStringWODash() + "." + ext)
  271. SFTPClient sftp = client.newSFTPClient()
  272. try {
  273. sftp.get(trackPath, tmpFile.absolutePath)
  274. } catch (Exception e) {
  275. e.printStackTrace()
  276. } finally {
  277. sftp.close()
  278. }
  279.  
  280. return tmpFile
  281. }
  282.  
  283. def limitString(String str, size) {
  284. str.substring(0, Math.min(str.length(), size))
  285. }
  286.  
  287. // ---------------------------------------------------------------------------------------------------------------------
  288. def processOriginal(RightPossessor rightPossessor, Person person, WarnerModelBean modelBean, Map<String, Boolean> lastCountryRightMap) {
  289. log "processOriginal ${modelBean}"
  290. def src = modelBean.src
  291. def update = modelBean.upd
  292. def catId = modelBean.getIsrc()
  293. def trackName = modelBean.trackName
  294. def artistName = modelBean.artistName
  295. def durationInMillis = modelBean.durationInMillis
  296. def rightPossessorSubName = "(" + modelBean.rightPossessorName + ")"
  297. def trackPath = (inputDirPath.equals(".") ? "" : inputDirPath + "/") + src.substring(1, src.lastIndexOf("/")) + "/" + RESOURCES + "/" + modelBean.getTrackPath()
  298. List<String> genreList = modelBean.getGenreListAsList()
  299. def albumId = modelBean.getAlbumId()
  300. def albumName = modelBean.getAlbumName()
  301. def albumYear = modelBean.getAlbumYear() != null ? modelBean.getAlbumYear() : 0
  302. def countryRightMap = lastCountryRightMap
  303.  
  304. if (isPass(catId)) {
  305. log "### ${catId} уже обрабатывался"
  306. incrementEvent("alreadyProcessedFail")
  307. return
  308. }
  309.  
  310. if (isNullOrEmpty(trackPath)) {
  311. log "### ${modelBean} пустое поле имени файла"
  312. incrementEvent("emptyFileNameFail")
  313. return
  314. }
  315.  
  316. if (isNullOrEmpty(artistName)) {
  317. log("### ${catId}. поле артиста пусто")
  318. incrementEvent("emptyArtistNameFail")
  319. return
  320. }
  321.  
  322. if (isNullOrEmpty(trackName)) {
  323. log("### ${catId}. поле трека пусто")
  324. incrementEvent("emptyTrackNameFail")
  325. return
  326. }
  327.  
  328. if (!Collections.disjoint(genreList, FORBIDDEN_GENRES)) {
  329. log("### ${catId}. содержит нежелательный жанр")
  330. incrementEvent("forbiddenGenre")
  331. return
  332. }
  333.  
  334. if (trackName.length() > NAME_LIMIT) {
  335. trackName = refactorLongName(trackName)
  336. log("### ${catId}. поле trackName более ${NAME_LIMIT} символов. усекаем до ${trackName}")
  337. }
  338.  
  339. if (artistName.length() > NAME_LIMIT) {
  340. artistName = refactorLongName(artistName)
  341. log("### ${catId}. поле artistName более ${NAME_LIMIT} символов. усекаем до ${artistName}")
  342. }
  343.  
  344. Album album = findOrCreateAlbum(albumId, albumName, albumYear)
  345.  
  346. log "\nprocessData ->"
  347.  
  348. def workers = ImportUtil.getWorkers(workerStoreDir, codegenPath, om)
  349.  
  350. log "findOrCreateArtist ->"
  351. Artist artist = artistService.findOrCreateArtist(artistName)
  352. artistDao.flush()
  353. log("artist: " + artist)
  354. log "findOrCreateArtist <-"
  355.  
  356.  
  357. File trackFile = null
  358. // качаем трек
  359. log "retreiveFile -> ${trackPath}"
  360. trackFile = retreiveFile(trackPath, "mp3")
  361. log "retreiveFile <-"
  362.  
  363. if (trackFile == null || !trackFile.exists()) {
  364. log("### ${catId}. ошибка скачки файла ${trackPath}. pass")
  365. incrementEvent("downloadFail")
  366. return false
  367. }
  368.  
  369. if (!(trackFile.isFile() && trackFile.length() > 0)) {
  370. log("### ${catId}. ошибка скачки файла ${trackPath}. pass")
  371. incrementEvent("downloadFail")
  372. trackFile.delete()
  373.  
  374. return false
  375. } else {
  376. log "# ${catId}. Загружено ${trackFile.length()}"
  377. }
  378.  
  379. if (trackFile.length() < SIZE_LIMIT) {
  380. log("!!!#5 трек ${catId}. Загружено ${trackFile.length()}. ограничение по размеру")
  381. keep(catId)
  382. trackFile.delete()
  383. incrementEvent("sizeLimitFail")
  384. return false
  385. }
  386.  
  387. log "createTrack ->"
  388. AudioTrack createdTrack = createTrack(person, artist, trackName, new Date(durationInMillis), genreList, catId, rightPossessorSubName, src, countryRightMap, modelBean.releaseDisplayStartDate)
  389. //в альбом суём только эталон
  390. if (album != null) {
  391. AlbumItem albumItem = albumItemDao.findByAlbumAudioTrack(album, createdTrack)
  392. if (albumItem == null) {
  393. albumItemDao.persist(new AlbumItem(0, createdTrack, album))
  394. }
  395. }
  396. log "created: ${createdTrack.getId()}"
  397. log "createTrack <-"
  398.  
  399. log "find tracks by artist and track ->"
  400. Set<AbstractAudioTrack> foundByArtistAndTrackList = Sets.newHashSet()
  401. List<Long> tmp1 = ImportUtil.findByArtistAndTrack(audioTrackDao, artist.getName(), trackName)
  402. for(Long id : tmp1){
  403. AudioTrack tmp1at = audioTrackDao.find(id) as AudioTrack
  404.  
  405. if (tmp1at != null && !tmp1at.getPossessorsIdList().contains(RP_ID)){
  406. foundByArtistAndTrackList.add(tmp1at)
  407. }
  408. else {
  409. ProtectedAudioTrack pat = protectedAudioTrackDao.find(id) as ProtectedAudioTrack
  410. if (pat != null && !pat.getPossessorsIdList().contains(RP_ID)){
  411. foundByArtistAndTrackList.add(pat)
  412. }
  413. }
  414. }
  415. log "found: " + foundByArtistAndTrackList.size()
  416. log "find tracks by artist and track <-"
  417.  
  418. Set<AbstractAudioTrack> foundByFingerprintList = Sets.newHashSet()
  419. try {
  420. List<HashShift> unbendedHash = workers.localFingerprintCorpusWorker.codegen(trackFile.absolutePath)
  421.  
  422. //bending
  423. List<List<HashShift>> splitedCodes = splitCodes(sortCodes(unbendedHash), 60)
  424. List<HashShift> bendedHash = new ArrayList()
  425. for (List<HashShift> hf : splitedCodes) {
  426. bendedHash.addAll(hf)
  427. }
  428.  
  429. FingerprintUtil.save(bendedHash, createdTrack.id, workers.localMogileWorker, workerDir, em)
  430.  
  431. UnbendedFingerprintUtil.save(unbendedHash, createdTrack.id, workers.localMogileWorker, workerDir, em)
  432.  
  433. log "find tracks by fingerprint ->"
  434.  
  435. List<Long> tmp2 = FingerprintUtil.findByFingerprint(bendedHash, workers.localFingerprintCorpusWorker)
  436. log "find: " + tmp2.size()
  437. for (Long id : tmp2) {
  438. AudioTrack at = audioTrackDao.find(id) as AudioTrack
  439. if (at != null && !at.getPossessorsIdList().contains(RP_ID)) {
  440. foundByFingerprintList.add(at)
  441. } else {
  442. ProtectedAudioTrack pat = protectedAudioTrackDao.find(id) as ProtectedAudioTrack
  443. if (pat != null && !pat.getPossessorsIdList().contains(RP_ID)){
  444. foundByFingerprintList.add(pat)
  445. }
  446. }
  447. }
  448. log "found: " + foundByFingerprintList.size()
  449. log "find tracks by fingerprint <-"
  450. } catch(IllegalArgumentException e) {
  451. //"empty code" nothing to do, just log it and keep going
  452. log "codegen returned EMPTY code"
  453. }
  454.  
  455. Set<AbstractAudioTrack> createdWithByFingerprintFoundList = Sets.newHashSet()
  456. createdWithByFingerprintFoundList.add(createdTrack)
  457. createdWithByFingerprintFoundList.addAll(foundByFingerprintList)
  458.  
  459. log "marking all found tracks ->"
  460. updateFoundTracks(rightPossessor,createdWithByFingerprintFoundList, genreList, catId, rightPossessorSubName, src, countryRightMap, false)
  461. updateFoundTracks(rightPossessor,foundByArtistAndTrackList, genreList, catId, rightPossessorSubName, src, countryRightMap, true)
  462. log "marking all found tracks <-"
  463.  
  464. for (AbstractAudioTrack aat: createdWithByFingerprintFoundList) {
  465. String toFilePath = "encoder/not_encoded_${aat.id}.raw.mp3"
  466. log " ${trackFile.canonicalPath} copy to ${toFilePath}"
  467. Entry encoderEncoded = workers.localFileWorker.copy(trackFile.canonicalPath, toFilePath, null)
  468. try{
  469. log "Getting meta..."
  470. encoderEncoded.meta(workers.localAudioEncoder.getMeta(encoderEncoded.address.path))
  471. } catch(WorkerError e) {
  472. log("Error while fetching metadata of file, will use default bitrate")
  473. }
  474.  
  475. // Перемещение пользовательского аудиотрека в могиле
  476. /*workers.localMogileWorker.rename(
  477. entryAddressUtil.getMogileAddressForAudioTrack(aat),
  478. entryAddressUtil.getMogileAddressForAudioTrack(aat).path,
  479. entryAddressUtil.getMogileAddressForAudioTrack(aat).path + ORIGINAL_TRACK_POSTFIX
  480. )*/
  481.  
  482. //удаляем старый трек из FTP
  483. //workers.localFtpWorker.delete(entryAddressUtil.getFtpAddressForAudioTrack(aat))
  484.  
  485. if(aat.id == createdTrack.id) {
  486. // добавляем новый
  487. def (encodedSize, bitrate, duration) = upload(catId, aat, trackFile.canonicalPath, encoderEncoded, workers)
  488.  
  489. updateTrack(aat, encodedSize, bitrate, duration, AbstractAudioTrack.SRC_FILE_IMPORT, null)
  490. }
  491.  
  492. // TODO: Оставлен до реализации takedown
  493. // checkBlock(workers.localMogileWorker, aat)
  494.  
  495. /*if(aat.id != createdTrack.id) {
  496. // Заменяем отпечаток пользовательского трека на отпечаток мэйджора
  497. log "replacing fingerprints generated for user tracks ->"
  498. FingerprintUtil.replaceUserFingerprintByMajor(aat.id, createdTrack.id, em)
  499. UnbendedFingerprintUtil.replaceUserFingerprintByMajor(aat.id, createdTrack.id, em)
  500. log "replacing fingerprints generated for user tracks <-"
  501. }*/
  502.  
  503. // Удаляем
  504. workers.localFileWorker.delete(encoderEncoded.address.path)
  505. }
  506.  
  507. log("localFileWorker.delete")
  508. workers.localFileWorker.delete(trackFile.canonicalPath)
  509.  
  510. log("resetInane")
  511. artist.resetInane()
  512.  
  513. //теперь когда всё сделано - помечаем как промодерированный
  514. createdTrack.setActive(true)
  515. audioTrackDao.merge(createdTrack)
  516. audioTrackDao.flush()
  517.  
  518. keep(catId)
  519.  
  520. log("&&& track ref ${catId}: done\n")
  521. incrementEvent("done")
  522.  
  523. if (++count % 100 == 0) {
  524. em.clear()
  525. log "### FLASH! ${count}"
  526. }
  527. }
  528.  
  529. // ---------------------------------------------------------------------------------------------------------------------
  530. def updateFoundTracks(RightPossessor rightPossessor, Set<AbstractAudioTrack> list, List<String> newTags, String catId, String rightPossessorSubName, String src, Map<String, Boolean> countryRightMap, Boolean shady) {
  531. if (!shady){
  532. for (AbstractAudioTrack aat : list) {
  533.  
  534. if (aat instanceof AudioTrack){
  535. AudioTrack at = aat as AudioTrack
  536.  
  537. def copyrights = at.getCopyrightSet()
  538. List<Long> idsForRemove = Lists.newArrayList()
  539.  
  540. copyrights.each { copyright ->
  541. idsForRemove.add(copyright.id)
  542. }
  543.  
  544. idsForRemove.each { id ->
  545. Copyright copyright = copyrightDao.find(id) as Copyright
  546. if (copyright != null) {
  547. at.getCopyrightSet().remove(copyright)
  548. copyrightDao.remove(copyright)
  549. }
  550. }
  551. copyrightDao.flush()
  552. }
  553.  
  554. if (aat instanceof ProtectedAudioTrack){
  555. ProtectedAudioTrack at = aat as ProtectedAudioTrack
  556.  
  557. def copyrights = at.getCopyrightSet()
  558. List<Long> idsForRemove = Lists.newArrayList()
  559.  
  560. copyrights.each { copyright ->
  561. idsForRemove.add(copyright.id)
  562. }
  563.  
  564. idsForRemove.each { id ->
  565. ProtectedCopyright copyright = protectedCopyrightDao.find(id) as ProtectedCopyright
  566. if (copyright != null) {
  567. at.getCopyrightSet().remove(copyright)
  568. protectedCopyrightDao.remove(copyright)
  569. }
  570. }
  571.  
  572. protectedCopyrightDao.flush()
  573. }
  574. }
  575. }
  576.  
  577. for (AbstractAudioTrack aat : list) {
  578. if (aat instanceof AudioTrack){
  579. AudioTrack at = aat as AudioTrack
  580.  
  581. Long id = at.getId()
  582.  
  583. //прежде чем поставить копирайт ставим правило в filezmeta
  584. putToMongo(catId, id, countryRightMap)
  585.  
  586. //теги
  587. if (newTags != null) {
  588. for (String tag : newTags) {
  589. attachTags(at, tag)
  590. }
  591. }
  592.  
  593. log "catId: ${catId} create copyright on ${id}"
  594.  
  595. //записываем в копирайт
  596. сopyrightService.createOrUpdateCopyright(at, rightPossessor, rightPossessorSubName, DEFAULT_SHARE, catId, shady, limitString(src, 99))
  597.  
  598. audioTrackDao.merge(at)
  599. copyrightDao.flush()
  600. audioTrackDao.flush()
  601. }
  602. if (aat instanceof ProtectedAudioTrack){
  603. ProtectedAudioTrack at = aat as ProtectedAudioTrack
  604.  
  605. Long id = at.getId()
  606.  
  607. //прежде чем поставить копирайт ставим правило в filezmeta
  608. putToMongo(catId, id, countryRightMap)
  609.  
  610. //теги
  611. if (newTags != null) {
  612. for (String tag : newTags) {
  613. attachTags(at, tag)
  614. }
  615. }
  616.  
  617. log "catId: ${catId} create copyright on ${id}"
  618.  
  619. //записываем в копирайт
  620. def cp = new ProtectedCopyright(at, rightPossessor)
  621. cp.setPossessorShare(DEFAULT_SHARE)
  622. cp.setCatalogId(catId)
  623. cp.setSubName(rightPossessorSubName)
  624. cp.setComment(limitString(src, 99))
  625. cp.setShady(shady)
  626. protectedCopyrightDao.persist(cp)
  627. protectedCopyrightDao.flush()
  628.  
  629. protectedAudioTrackDao.merge(at)
  630. protectedAudioTrackDao.flush()
  631. }
  632. }
  633. }
  634.  
  635. AudioTrack createTrack(Person person, Artist artist, String trackName, Date duration, List newTags, String catId, String rightPossessorSubName, String src, Map<String,Boolean> countryRightMap, Date releaseDate) {
  636.  
  637. final AudioTrack targetAT = audioTrackService.createAudioTrack(person, trackName, artist.id, artist.name, "localhost", releaseDate)
  638. targetAT.setDuration(duration)
  639. targetAT.setBlock(false)
  640. audioTrackDao.merge(targetAT)
  641.  
  642. //прежде чем поставить копирайт ставим правило в filezmeta
  643. putToMongo(catId, targetAT.getId(), countryRightMap)
  644.  
  645. //записываем в копирайт
  646. def copyrights = targetAT.getCopyrightSet()
  647. copyrights.each { cp ->
  648. cp.setPossessorShare(DEFAULT_SHARE)
  649. cp.setCatalogId(catId)
  650. cp.setSubName(rightPossessorSubName)
  651. cp.setComment(src)
  652. copyrightDao.merge(cp)
  653. }
  654.  
  655. copyrightDao.flush()
  656.  
  657. //теги
  658. if (newTags != null) {
  659. for (String tag : newTags) {
  660. attachTags(targetAT, tag)
  661. }
  662. }
  663.  
  664. audioTrackDao.merge(targetAT)
  665. audioTrackDao.flush()
  666.  
  667. return targetAT
  668. }
  669.  
  670. def attachTags(AudioTrack track, String tagsString) {
  671. log("AudioTrack: attaching tags")
  672. tagsString.split(";").each { tagName ->
  673. if (!isNullOrEmpty(tagName)) {
  674. log("process $tagName")
  675. Tag tag = tagDao.findByName(tagName) ?: tagDao.findByLowerName(tagName)
  676. if (tag == null) {
  677. log("tag with name $tagName not found. Persist new Tag")
  678. tag = tagDao.persist(new Tag(tagName, tagName))
  679. }
  680. log("add tag with id ${tag.id} to track")
  681. track.addTag(tag)
  682. }
  683. }
  684.  
  685. audioTrackDao.merge(track)
  686. }
  687.  
  688. def attachTags(ProtectedAudioTrack track, String tagsString) {
  689. log("ProtectedAudioTrack: attaching tags")
  690. tagsString.split(";").each { tagName ->
  691. if (!isNullOrEmpty(tagName)) {
  692. log("process $tagName")
  693. Tag tag = tagDao.findByName(tagName) ?: tagDao.findByLowerName(tagName)
  694. if (tag == null) {
  695. log("tag with name $tagName not found. Persist new Tag")
  696. tag = tagDao.persist(new Tag(tagName, tagName))
  697. }
  698. log("add tag with id ${tag.id} to track")
  699. track.addTag(tag)
  700. }
  701. }
  702.  
  703. protectedAudioTrackDao.merge(track)
  704. }
  705.  
  706.  
  707. /**
  708. * Закачка обжатого трека в могилу и ФТП
  709. */
  710. def upload(
  711. def catId, AbstractAudioTrack aat, String localPath, Entry encoderEncoded, def workers) {
  712. log("track ref ${catId}: begin upload")
  713.  
  714. workers.localMogileWorker.put(entryAddressUtil.getMogileAddressForAudioTrack(aat), encoderEncoded.address.path, encoderEncoded.getMd5())
  715.  
  716. if (processToFtp) {
  717. EntryAddress toFtpAddress = entryAddressUtil.getFtpAddressForAudioTrack(aat)
  718. log("track ref ${catId}: upload to ftp: " + toFtpAddress)
  719. workers.localFtpWorker.put(toFtpAddress, localPath, null)
  720. }
  721.  
  722. def size = encoderEncoded.size
  723. def bitrate = encoderEncoded.getMeta().containsKey(IAudioEncodeWorker.META_TRACK_CALCULATED_BITRATE_NORMALIZED) ?
  724. encoderEncoded.meta(IAudioEncodeWorker.META_TRACK_CALCULATED_BITRATE_NORMALIZED) : 320
  725. def duration = encoderEncoded.getMeta().containsKey(IAudioEncodeWorker.META_TRACK_LENGTH) ?
  726. (Integer) encoderEncoded.meta(IAudioEncodeWorker.META_TRACK_LENGTH) : 180
  727.  
  728. return [size, bitrate, duration]
  729. }
  730.  
  731. /**
  732. * выставляем флажки для трека, меняем битрейт и т.п.
  733. */
  734. def updateTrack(AbstractAudioTrack aat, def encodedSize, def bitrate, def duration, def src, def fpId) {
  735. if (aat instanceof AudioTrack){
  736. AudioTrack at = aat as AudioTrack
  737.  
  738. at.uploadFtp = 1
  739. at.uploadMogile = 1
  740. at.size = encodedSize * 1.0 / (1000.0 * 1000.0)
  741. at.bitrate = bitrate
  742. at.phantom = false
  743. at.active = true
  744. at.duration = new Time(0, (Integer) (duration / 60), duration % 60);
  745. at.src = src
  746. at.countIdDesc(idDesc)
  747. at.fingerprintId = fpId
  748. at.touch()
  749. return audioTrackDao.merge(at)
  750. }
  751.  
  752. if (aat instanceof ProtectedAudioTrack){
  753. ProtectedAudioTrack at = aat as ProtectedAudioTrack
  754.  
  755. at.uploadFtp = 1
  756. at.uploadMogile = 1
  757. at.size = encodedSize * 1.0 / (1000.0 * 1000.0)
  758. at.bitrate = bitrate
  759. at.phantom = false
  760. at.active = true
  761. at.duration = new Time(0, (Integer) (duration / 60), duration % 60);
  762. at.src = src
  763. at.countIdDesc(idDesc)
  764. at.fingerprintId = fpId
  765.  
  766. return protectedAudioTrackDao.merge(at)
  767. }
  768. }
  769.  
  770. def checkBlock(LocalMogileWorker mogileWorker, AbstractAudioTrack aat) {
  771. EntryAddress mogileAddressForAudioTrack = entryAddressUtil.getMogileAddressForAudioTrack(aat)
  772. EntryAddress blockMogileTrackAddr = new EntryAddress(mogileAddressForAudioTrack.getDomain(), mogileAddressForAudioTrack.getPath() + SUFFIX)
  773.  
  774. long trackSize = mogileWorker.checkSize(mogileAddressForAudioTrack)
  775. long blockTrackSize = mogileWorker.checkSize(blockMogileTrackAddr)
  776.  
  777. if (aat.getBlock()) {
  778. if (trackSize > 0) {
  779. if (blockTrackSize > 0) {
  780. log "# удаляем существующий ${blockMogileTrackAddr}"
  781. mogileWorker.delete(blockMogileTrackAddr)
  782. }
  783. log "# rename ${mogileAddressForAudioTrack} -> ${blockMogileTrackAddr}"
  784. mogileWorker.rename(mogileAddressForAudioTrack, mogileAddressForAudioTrack.getPath(), blockMogileTrackAddr.getPath())
  785. }
  786. } else {
  787. if (blockTrackSize > 0) {
  788. aat.setBlock(true)
  789. if (trackSize > 0) {
  790. log "# удаляем существующий ${blockMogileTrackAddr}"
  791. mogileWorker.delete(blockMogileTrackAddr)
  792. log "# rename ${mogileAddressForAudioTrack} -> ${blockMogileTrackAddr}"
  793. mogileWorker.rename(mogileAddressForAudioTrack, mogileAddressForAudioTrack.getPath(), blockMogileTrackAddr.getPath())
  794. }
  795. }
  796. }
  797. }
  798.  
  799. String refactorLongName(String longName) {
  800. String[] subNameArr = longName.split("\\s")
  801.  
  802. StringBuilder sb = new StringBuilder()
  803.  
  804. def currentLen = 0
  805. for (String subName : subNameArr) {
  806. if (currentLen + subName.length() + 1 > NAME_LIMIT) {
  807. return sb.toString().trim() + "..."
  808. }
  809. sb.append(" ").append(subName)
  810. currentLen += subName.length() + 1
  811. }
  812.  
  813. return sb.toString()
  814. }
  815.  
  816. String normalizePath(String path) {
  817. if (isNullOrEmpty(path)) return path;
  818.  
  819. if (path.contains(inputDirPath)) {
  820. return path.substring(inputDirPath.length());
  821. } else {
  822. return path
  823. }
  824. }
  825.  
  826. Boolean isPass(String path) {
  827. return historian.isPass(normalizePath(path));
  828. }
  829.  
  830. void keep(String path) throws IOException {
  831. historian.keep(normalizePath(path))
  832. }
  833.  
  834. def putToMongo(String catId, Long trackId, Map<String, Boolean> lastMap) {
  835. def ruleList = lastMap.collect { state, value ->
  836. new FileRestrictionAddRuleBean("*", -1L, -1L, state, "*", value.toString())
  837. }
  838.  
  839. fileRestrictionService.putSequential(DKeyGenerationUtil.trackKey(trackId), ruleList, "585273ee8d0494d6e968b0e0", catId)
  840. }
  841.  
  842. Album findOrCreateAlbum(String albumId, String albumName, Integer albumYear) {
  843. log("findOrCreateAlbum: ${albumId} ${albumName} ${albumYear}")
  844. Album album = null
  845. if (!isNullOrEmpty(albumId)) {
  846. album = albumDao.findByUid(albumId)
  847. if (album == null) {
  848. album = albumDao.persist(new Album(albumName, "", albumYear, albumId))
  849. }
  850. } else {
  851. if (!isNullOrEmpty(albumName) && albumYear != null) {
  852. albumId = "${albumYear}|${albumName}"
  853.  
  854. album = albumDao.findByUid(albumId)
  855. if (album == null) {
  856. album = albumDao.persist(new Album(albumName, "", albumYear, albumId))
  857. }
  858. }
  859. }
  860. return album
  861. }
  862.  
  863. def packageExist(def path) {
  864. if (!isNullOrEmpty(path)) {
  865. for (String dir : packageDirSet) {
  866. if (path.contains(dir)) return true
  867. }
  868. }
  869. log "!!! пакета не существует на сервере ${path}"
  870. return false
  871. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement