'분류 전체보기'에 해당되는 글 223건

  1. 2014.03.06 rtorrent watch 디렉토리 토렌트 파일 자동으로 삭제하기
  2. 2014.03.05 Apache HttpComponents 파일전송 예제 5
  3. 2014.03.04 subsonic 심플한 웹UI로 음악감상 즐기기 1
  4. 2014.02.25 Plex 웹 클라이언트 동영상 플레이어 사이즈 줄이기
  5. 2014.02.25 subsonic 4.9 앨범이름 이상하게 나오는것 수정하기 2

rtorrent watch 디렉토리 토렌트 파일 자동으로 삭제하기



원래는 transmission 을 썼었는데 transmission 보다 웹UI 가 더 편리한것 같아서 호기심에 한번 설치해 봤다.


설치 가이드 대로 쭉~ 따라서 설치를 하고 깔짝깔짝 테스트를 해보니 watch 디렉토리에 토렌트 파일을 추가하면 토렌트를 시작하고 나서 파일을 안 지워주는게 있었다.


토렌트가 시작된 뒤 토렌트 파일이 싹 지워지는걸 원해서 살살 검색을 해 보았다.



설정방법은 요럿다.


Linux 서버에 rtorrent 를 설치했다면 설정 파일은 대부분 홈디렉토리 아래 .rtorrent.rc 파일로 했을 것이다.


요 파일을 살짝 수정해 주면, watch 디렉토리에 추가된 토렌트가 자동으로 시작되고 추가된 .torrent 파일을 삭제시킬 수 있다.




요렇게 폿 설정파일 편집으로 들어가 보면 schedule = watch_directory,5,5,"load_start=watch 디렉토리" 어쩌고 하는 부분이 있다.

vi ~/.rtorrent.rc


요렇게 load_start 부분을 따옴표로 감싸고 뒤에다 d.delete_tied= 요걸 추가해 주면 된다.

schedule = watch_directory,5,5,"load_start=watch 디렉토리,d.delete_tied="


저장하고 나와서 rtorrent restart

sudo service rtorrent restart


Apache HttpComponents 파일전송 예제


최근에 Http 를 이용해서 간단히 파일전송이랑 이것저것 구현해야 되는 프로젝트를 했다. 


요런것들을 구현할때 딱 좋은 것들 중 하나는 Apache HttpComponents 이다.




라이브러리 같은거는 최신버전을 쓰고 싶다는 이상 야릇한 고집같은게 있어서 최신버전이 뭔가~ 하고 간만에 Apache HttpComponents 프로젝트 사이트에 가 보았다.


가보니 최신버전이 4.3.2 였다.



4.3.2 버전을 maven dependency 에 추가하고 예전에 썼던 글(Apache HttpComponents를 이용한 GET, POST 요청하기)을 참고해서 클래스를 하나 맹글었다.


그런데 라이브러리가 이것저것 변경이 많이 됐는지 deprecate 된 메소드가 무지 많은것 같이 느껴졌다.



그래서 사이트에서 제공하는 예제를 바탕으로 아예 4.3.2 에 맞게 클래스를 새로 하나 맹글었다.



먼저 maven 사용하는 사람들은 요런 디펜던시를 추가해 주고

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.3.2</version>
</dependency>

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpmime</artifactId>
	<version>4.3.2</version>
</dependency>



기냥 쌩으로 하는 사람들은 httpclient-4.3.2.jar, httpcore-4.3.1.jar, httpmime-4.3.2.jar 를 클래스패스에 추가해 주면 된다.




Apache HttpComponents 4.3.2 를 이용한 HTTP 파일전송하기 샘플

package com.tistory.stove99;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class Http {
	private static final String DEFAULT_ENCODING = "UTF-8";
	
	private String url;
	private MultipartEntityBuilder params;
	
	/**
	 * @param url 접속할 url
	 */
	public Http(String url){
		this.url = url;
		
		params = MultipartEntityBuilder.create();
	}
	
	/**
	 * Map 으로 한꺼번에 파라메터 훅 추가하는 메소드
	 * @param param 파라메터들이 담긴 맵, 파라메터들은 UTF-8로 인코딩 됨
	 * @return
	 */
	public Http addParam(Map<String, Object> param){
		return addParam(param, DEFAULT_ENCODING);
	}
	
	/**
	 * Map 으로 한꺼번에 파라메터 훅 추가하는 메소드
	 * @param param 파라메터들이 담긴 맵
	 * @param encoding 파라메터 encoding charset
	 * @return
	 */
	public Http addParam(Map<String, Object> param, String encoding){
		for( Map.Entry<String, Object> e : param.entrySet() ){
			if (e.getValue() instanceof File) {
				addParam(e.getKey(), (File)e.getValue(), encoding);
			}else{
				addParam(e.getKey(), (String)e.getValue(), encoding);
			}
		}
		return this;
	}
	
	/**
	 * 문자열 파라메터를 추가한다.
	 * @param name 추가할 파라메터 이름
	 * @param value 파라메터 값
	 * @return
	 */
	public Http addParam(String name, String value){
		return addParam(name, value, DEFAULT_ENCODING);
	}
	
	public Http addParam(String name, String value, String encoding){
		params.addPart(name, new StringBody(value, ContentType.create("text/plain", encoding)));
		
		return this;
	}
	
	/**
	 * 업로드할 파일 파라메터를 추가한다.
	 * @param name
	 * @param file
	 * @return
	 */
	public Http addParam(String name, File file){
		return addParam(name, file, DEFAULT_ENCODING);
	}
	
	public Http addParam(String name, File file, String encoding){
		if( file.exists() ){
			try{
				params.addPart(
						name, 
						new FileBody(file, ContentType.create("application/octet-stream"),
						URLEncoder.encode(file.getName(), encoding)));
			}catch( Exception ex ){ ex.printStackTrace(); }
			
		}
		
		return this;
	}

	/**
	 * 타겟 URL 로 POST 요청을 보낸다.
	 * @return 요청결과
	 * @throws Exception
	 */
	public String submit() throws Exception{
		CloseableHttpClient http = HttpClients.createDefault();
		StringBuffer result = new StringBuffer();
		
		try{
			HttpPost post = new HttpPost(url);
			post.setEntity(params.build());
			
			CloseableHttpResponse response = http.execute(post);
			
			try{
				HttpEntity res = response.getEntity();
				BufferedReader br = new BufferedReader(
									new InputStreamReader(res.getContent(), Charset.forName("UTF-8")));
				
				String buffer = null;
				while( (buffer=br.readLine())!=null ){
					result.append(buffer).append("\r\n");
				}
			}finally{
				response.close();
			}
		}finally{
			http.close();
		}

		return result.toString();
	}
	
	
	/**
	 * 테스트
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Http http = new Http("http://127.0.0.1:8888/receiver.jsp");
		
		http.addParam("test", "문자열 파라메터 테스트다!")
			.addParam("upload_file1", new File("d:\\첨부파일1.hwp"))
			.addParam("upload_file2", new File("d:\\첨부파일2.jpg"))
			.submit();
	}
}


Spring @MVC 로 receiver 쪽을 대충 요렇게 구현하면 될것 같다.

	@RequestMapping
	public void receiver(
			@RequestParam("upload_file1") MultipartFile file1, 
			@RequestParam("upload_file2") MultipartFile file2){
		System.out.println("upload_file1 : " + file1.getOriginalFilename());
		System.out.println("upload_file2 : " + file1.getOriginalFilename());
		
		File upDir = new File("c:\\upfile\\");
		try {
			file1.transferTo(new File(upDir, file1.getOriginalFilename()));
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


subsonic 심플한 웹UI로 음악감상 즐기기


서브소닉을 설치하면 설치된 하위 폴더에 minisub 라는 깔쌈한 웹 UI 도 같이 설치된다.


예를들어 현재 http://stove99.tistory.com/music 이라는 경로로 서브소닉에 접속을 하고 있다면


http://stove99.tistory.com/music/mini 로 접속하면 깔쌈한 minisub 웹 UI 가 폿하고 나타난다.



아이디, 비밀번호, 서버 URL 을 입력하면 심플한 UI로 음악감상을 할 수 있다.





보니까 기본적으로 설치되는 minisub 버전은 2.0.1 로 살짝 쫌 오래 된 버전이다. 뭐 기본으로 설치된 버전 써도 음악듣는데는 아무지장 없으니 기냥 쓰면된다.


근데 2.0.1 버전에는 등록한 팟캐스트 듣는 기능이 없었다. 


최신버전에는 고런게 있겠지 그래서 쭉~ 찾아본 결과, 최신버전은 찾아보니 3.1.1 이였다.

(최신버전 다운로드는 https://github.com/tsquillario/Jamstash  욜리가서 받아서 대충 압축풀어서 쓰면 된다.)



최신버전에서는 이것저것 설정옵션도 늘고 무엇보다 필요한 기능인 플레이리스트 반복 플레이 기능이 있었다.(2.x 버전에는 플레이 리스트 반복 기능이 없다.)


근데 내 기준에서는 최신버전이 UI 가 오히려 쫌 더 후져진것 같고, 플레이리스트와 팟캐스트에서 한글이 쪽바로 출력이 안됐다.



그래서 결론은 2.x 버전중 최신 버전인 2.4.1 에 플레이리스트 반복 기능만 소스 수정해서 추가하고 사용하기로 했다. 덤으로 2.4.1 에는 팟캐스트 듣기 기능도 있었다.



플레이리스트 반복 & 검색된 모든 앨범 추가 기능 넣은 수정버전

minisub.2.4.1.zip




플레이 리스트 반복하기





검색된 모든 앨범들 플레이리스트에 추가하기





※ 설치방법

1. 수정된 파일 혹은 최신버전(https://github.com/tsquillario/Jamstash)을 다운로드 받아서 서버에 올린다.

2. /var/subsonic/jetty/3853/webapp 요기에 압축을 푼다. (경로는 각자 서버에 따라 다를 수 있으니까 잘 찾아보길 바람~)

3. 끝


기존 서브소닉 접속 URL 이 http://stove99.tistory.com/music 이였다면 "http://stove99.tistory.com/music/압축푼 디렉토리 이름" 으로 minisub 에 접속할 수 있다.



※ 만약 기존에 있던 mini 디렉토리에 덮어 썼으면 브라우져 캐쉬가 남아 제대로 반영이 안될 수 있으니 브라우져 캐쉬를 싹 지우고 다시 접속해 보면 쪽바로 보임.



Plex 웹 클라이언트 동영상 플레이어 사이즈 줄이기



Plex 를 자기 NAS 에 설치했다면 시도때도 없이 동영상을 때려볼 수 있는 찬스가 많이 생겨난다.



수많은 찬스들중에 일하고 있을때도 포함이 된다.



하지만 과감해질 수 있는 자신의 사회적 위치에 따른 한계가 있기 때문에, 부득이 하게 살짝 쪼그라든 마음가짐으로 몰래몰래 봐야할 때가 많다.




그런데 Plex 웹 플레이어는 아쉽게도 로딩할때 뽕~ 뜬 플레이어 사이즈에서 더이상 플레이어 사이즈를 줄일 수 없다.


뭐 핸드폰을 책상 구석에 짱박아 두고 핸드폰으로도 볼 수 있겠지만, 


세상에 오만 종류의 사람이 많듯이 그들의 사정또한 이런저런 사정들이 많을 것이기 때문에 동영상을 웹으로만 봐야되는 사람들도 많을 것이다.



그런 사람들을 위해 웹 동영상 플레이어를 쥐똥만하게 바꿀 수 있는 방법을 적어본다.



1. 먼저 아무 페이지나 즐겨찾기를 한다.



2. 추가된 즐겨찾기 편집하기로 가서 이름을 적당하게 바꾸고 url 입력란에 요런 스크립트를 입력한 후 즐겨찾기를 저장한다.

javascript:var width=320;var height=180;var s=document.createElement("script");s.type="text/javascript";s.src="//code.jquery.com/jquery-1.11.0.min.js";var div=$(".video-player-container");div.css({width:width,height:height});

※ width, height 변수값은 자신의 대담함에 맞게 바꾼다.





3. 클릭하기 쉬운 위치에 쫌전에 맹근 즐겨찾기를 위치시킨 다음 Plex 동영상 플레이 화면에서 즐겨찾기 버튼을 뽓 클릭한 후 줄어든 화면으로 긴장감 있게 동영상을 때려본다.




왜인지늘 모르겠지만 문득 내 자신이 무척 구차하다는 생각이 든다.

subsonic 4.9 앨범이름 이상하게 나오는것 수정하기


얼마전에 subsonic을 4.9 로 업그레이드 했는데 살짝 마음에 안드는 부분이 발생했다.


태그수정 화면에서 수정한 아티스트 이름으로 화면에 출력이 안되는 문제였다.




쭉~ 살펴보니까 mp3 tag 를 읽어서 artist 부분을 출력하는게 아니라 album artist 부분을 출력해서 그런것 같았다.


그런데 문제는, 태그 편집화면에서 artist만 편집할 수 있고, album artist 를 수정할 수 없다는 점이다. 

(subsonic 소스를 받아서 쭉 살펴보다 보니까 주석중에 "일부러" 고럿게 했다는 말을 얼핏보긴 봤다.)



그래도 내가 원하는 아티스트 이름으로 출력 못해서 살짝 안달복달한 감정이 느껴졌다.


mp3 파일을 다운로드 받으면 album artist 부분에 쪽바로 입력된 mp3 파일들이 많지만, 어떤 파일은 또 야리꾸리한 문자가 들어가 있는것도 있기 때문에..





아무튼!!


요런 문제를 해결하기 위해서 net.sourceforge.subsonic.service.MediaFileService 클래스의


476 번째 라인  

mediaFile.setArtist(metaData.getAlbumArtist());

요부분을 

mediaFile.setArtist(metaData.getArtist());

요래 바꿔주고 다시 컴파일 하면 된다.


귀차니즘 & OTL 방지차원에서 아래 첨부된, 미리 컴파일된 MediaFileService.class 을 다운로드 받아 기존 파일을 덮어 씌우면 된다.


덮어 씌우기 전에 혹시 모르니 기존 파일은 알아서 살짝 백업받아주고~


MediaFileService.class







요 파일이 위치한 디렉토리는 각자 서버 환경마다 틀릴 수 있는데 

※ 본인은 Ubuntu 12.04.4 LTS 를 NAS OS 로 쓰고 있음.


나의 경우는 /var/subsonic/jetty/3853/webapp/WEB-INF/classes/net/sourceforge/subsonic/service 요 디렉토리에 있었다.


아마 경로 중간에 3853 요런 숫자는 서버마다 틀릴수도 있을것 같으니까 잘 찾아보길~~






파일을 교체했으면

sudo service subsonic restart
명령이나 뭐 기타등등 자신이 쓰는 리스타트 명령이 있으면 고걸로 서브소닉을 리스탓트 한번 시켜주면 반영이 된다.


간혹 가다가 리스타트 했는데 서브소닉 서버가 쪽바로 안 올라오는 경우가 있던데 고럴땐 당황하지 말고 다시한번 리스탓트를 시켜주면 잘 됨 -_-;




이제 다 했으니 기분좋게 아티스트 이름이 출력되는걸 확인해야 한다.


기존 이상한게 출력되던 앨범의 태그 편집화면으로 가서 아무 노래나 하나 살짝 태그를 수정하고, 


다시 살짝 원래대로 돌린 후 수정을 하면 앨범 정보가 업데이트 되서 아티스트 이름이 원하는 걸로 쪽바로 보일것이다.



끝~

prev 1 ··· 10 11 12 13 14 15 16 ··· 45 next